在许多第三方库和最佳实践博客/推荐等中......经常看到这样的语法:
typeof x === 'object' (instead of typeof x == 'object')
typeof y === 'string' (instead of typeof x == 'string')
typeof z === 'function' (instead of typeof x == 'function')
如果 typeof 运算符已经返回一个字符串,那还需要对返回值进行类型检查吗?如果 typeof(typeof(x)) 始终为 string,无论 x 实际上是什么,那么 == 应该足够,而 === 不必要。
在什么情况下 typeof not会返回字符串文字?即使存在一些边缘情况,为什么还要对对象、字符串、函数等使用附加类型检查......
回答主要问题 - 将
==
专门与 typeof
一起使用没有危险。以下是您可能想要使用 ===
的原因。
Crockford 的建议是,在许多情况下使用
===
更安全,如果您打算在某些情况下使用它,最好保持一致并在所有情况下使用它。
我们的想法是,你可以在每次检查相等性时考虑是否使用
==
还是 ===
,或者你可以养成总是写 ===
的习惯。
几乎没有理由使用
==
而不是 ===
- 如果您与 true
或 false
进行比较并且您想要强制(例如您想要 0
或 ''
来评估为 false
)然后只需使用 if(! empty_str)
而不是 if(empty_str == false)
。
对于那些在
==
的背景之外不理解 typeof
的问题的人,请参阅来自 The Good Parts 的内容:
'' == '0' // false
0 == '' // true
0 == '0' // true
false == 'false' // false
false == '0' // true
false == undefined // false
false == null // false
null == undefined // true
' \t\r\n ' == 0 // true
如果 typeof 运算符已经返回 一个字符串,需要输入什么 还要检查返回值吗?如果 typeof(typeof(x)) 始终是字符串,不是 不管 x 实际上是什么,然后 == 应该足够了=== 没有必要。
这是主观的。 您可以轻松地扭转这一局面,并问:“当您不期望隐式转换时,为什么要使用 == ?” 两者在这里都可以正常工作,因此使用您认为更能表达您的意图的那个。 尝试在项目内保持一致。
在这种情况下,完全没有理由偏爱
===
而不是 ==
,因为两个操作数都保证是字符串,因此两个运算符将给出相同的结果。由于 ==
少了一个字符,我会赞成这一点。
Crockford 对此的建议是始终使用
===
,这对于初学者来说是合理的建议,但如果您知道问题(在其他答案中有所介绍),则毫无意义的偏执。
因为 === 比 == 更快,因为省略了类型强制。 当然,这可能是一个可以忽略不计的差异,但它仍然存在。
三重等于运算符主要用于变量类型和值检查(全部在 1 表达式中),也称为 无类型强制的相等。
示例:
var a = 1;
var b = 1;
var c = "1";
var d = "1";
alert (a === b); //True, same value and same type (numeric)
alert(c === d); //True, same value and same type (string)
alert(b === c); //False, different type but same value of 1
参见 Doug Crockford 的 YUI Theater 关于类型强制转换。
如果 typeof 运算符已经返回 一个字符串,需要输入什么 还要检查返回值吗?如果 typeof(typeof(x)) 始终是字符串,不是 不管 x 实际上是什么,然后 == 应该足够了=== 没有必要。
不使用 typeof 而使用
===
运算符的最有效原因是浏览器之间的类型强制(解释)。有些浏览器可以将 6=="6"
作为 true 传递,而有些则不能(取决于 JS 解释器的严格性),因此通过引入类型强制可以澄清这一点。
此外,它还会带来“面向对象”方法,因为 JavasScript 的变量不是基于类型的变量(即变量类型不像 Java 那样在编译时声明)。
例如在 Java 中,这会失败:
if ("6" instanceof Number) { // false
希望我回答了你的问题。