平台特定语言特性的使用¶
ID: js/non-standard-language-feature
Kind: problem
Security severity:
Severity: warning
Precision: very-high
Tags:
- portability
- maintainability
- language-features
- external/cwe/cwe-758
Query suites:
- javascript-security-and-quality.qls
应避免使用非标准语言扩展,例如表达式闭包或`let` 表达式,因为它们会使代码难以阅读或重用。
建议¶
使用标准语言特性代替。例如,表达式闭包可以使用 ECMAScript 2015 箭头函数替换,或者使用普通函数替换;`let` 语句和表达式可以使用 ECMAScript 2015 `let` 声明替换;`for each ... in` 语句可以使用 ECMAScript 2015 `for ... of` 语句替换。
示例¶
以下示例使用带有`map` 的表达式闭包
[1, 2, 3].map(function(x) x * x);
使用 ECMAScript 2015 箭头函数的等效代码如下
[1, 2, 3].map((x) => x * x);
在 ECMAScript 2015 平台上,可以使用普通函数代替
[1, 2, 3].map(function (x) { return x * x; });
另一个示例,考虑使用`let` 语句
function sumOfSquares(a) {
var sum = 0;
for (var i=0; i<a.length; ++i) {
let (square = a[i]*a[i]) {
sum += square;
}
}
return sum;
}
它可以轻松地使用块级`let` 声明替换
function sumOfSquares(a) {
var sum = 0;
for (var i=0; i<a.length; ++i) {
let square = a[i]*a[i];
sum += square;
}
return sum;
}
旧版本的 Firefox 支持数组推导的 postfix 表示法
var numbers = [1, 2, 3, 4, 5];
var squares = [i*i for (i of numbers)];
此表示法应转换为语义上等效的 prefix 表示法,该表示法受更新的浏览器支持
var numbers = [1, 2, 3, 4, 5];
var squares = [for (i of numbers) i*i];
参考文献¶
Mozilla 开发者网络:箭头函数.
Mozilla 开发者网络:非标准 let 扩展.
Mozilla 开发者网络:for each…in.
常见弱点枚举:CWE-758.