使用 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
数组推导式中的for-in块是 Mozilla 特定的语言扩展,即使是 SpiderMonkey 也不再支持,而且不太可能包含在未来的 ECMAScript 标准中。不应使用此语言特性。
建议¶
for-in块可以用(符合标准的)for-of块替换,它迭代从例如Object.keys获取的属性名称列表。
示例¶
在以下人为的示例中,for-in块用于迭代数组的键i,并构建一个字符串数组,格式为"v = a[i]",其中v是a[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循环,它以命令式方式填充结果数组。
参考文献¶
Mozilla 开发者网络:数组推导式:与旧的 JS1.7.2/JS1.8 推导式的区别.
常见弱点枚举:CWE-758.