CodeQL 文档

使用 for-in 推导式块

ID: js/for-in-comprehension
Kind: problem
Security severity: 
Severity: error
Precision: very-high
Tags:
   - portability
   - maintainability
   - language-features
   - external/cwe/cwe-758
Query suites:
   - javascript-security-and-quality.qls

点击查看 CodeQL 代码库中的查询

数组推导式中的for-in块是 Mozilla 特定的语言扩展,即使是 SpiderMonkey 也不再支持,而且不太可能包含在未来的 ECMAScript 标准中。不应使用此语言特性。

建议

for-in块可以用(符合标准的)for-of块替换,它迭代从例如Object.keys获取的属性名称列表。

示例

在以下人为的示例中,for-in块用于迭代数组的键i,并构建一个字符串数组,格式为"v = a[i]",其中va[i]的值。

var a = [23,,42];
var desc = [for(i in a) i + " = a[" + i + "]"];

该示例可以改写为使用for-of块,它迭代Object.keys(a)

var a = [23,,42];
var desc = [for(i of Object.keys(a)) i + " = a[" + i + "]"];

请注意,Object.keys只包含自身属性,不包含从原型继承的属性。如果需要后一种行为,则应将数组推导式替换为一个for-in循环,它以命令式方式填充结果数组。

参考文献

  • ©GitHub, Inc.
  • 条款
  • 隐私