使用 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.