无用类型测试¶
ID: js/useless-type-test
Kind: problem
Security severity:
Severity: error
Precision: very-high
Tags:
- maintainability
- correctness
- language-features
- external/cwe/cwe-570
- external/cwe/cwe-571
Query suites:
- javascript-security-and-quality.qls
在 ECMAScript 5 中,typeof
运算符返回以下六个类型标签之一:"undefined"
、"boolean"
、"number"
、"string"
、"object"
、"function"
。在 ECMAScript 2015 中,它还可以返回 "symbol"
,而在较旧版本的 Internet Explorer 中,它在某些情况下可能会返回 "unknown"
或 "date"
。因此,与任何其他字符串字面量进行比较都是无用的。
建议¶
仔细检查所讨论的比较。如果类型标签只是拼写错误,请更正它。在某些情况下,typeof
返回的类型标签不够精确,因此您可能需要使用其他类型测试函数。
示例¶
以下代码片段试图确定 a
是否为数组
if (typeof a === 'array')
console.log("It's an array!");
请注意,typeof
不够精确,无法区分数组与其他对象,因为它对两者都返回类型标签 "object"
。与 ECMAScript 5 兼容的平台提供了一个库函数 Array.isArray
,可以用来代替它
if (Array.isArray(a))
console.log("It's an array!");
在较旧的平台上,您可以使用 Mozilla Developer Network 上解释的技术。
参考文献¶
Mozilla Developer Network:typeof.
Mozilla Developer Network:Array.isArray().
常见漏洞枚举:CWE-570.
常见漏洞枚举:CWE-571.