在Javascript中使用===而不是==和typeof的原因是什么?

What's the reason to use === instead of == with typeof in Javascript?

在许多第三方图书馆和最佳实践博客/建议等中…常见的语法如下:

1
2
3
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))始终是字符串,不管x实际上是什么,那么==应该足够,而==不必要。

在什么情况下,typeof不会返回字符串文本?即使有一些边缘情况,为什么要对对象、字符串、函数等使用附加类型检查呢?


回答主要问题-使用typeof==没有危险。下面是您可能希望使用===的原因。

Crockford的建议是,在许多情况下使用===更安全,并且如果您在某些情况下使用它,最好保持一致并将其用于所有事情。

这种想法是,你可以在每次检查平等性时考虑是使用==还是===,或者你可以养成总是写===的习惯。

==代替===几乎没有任何理由——如果你与truefalse比较,并且你想要强制(例如你想要0''false进行评估,那么只需使用if(! empty_str)而不是if(empty_str == false)

对于那些不了解==的问题的人,在typeof的上下文之外,从好的部分来看:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
'' == '0'          // false
0 == ''            // true
0 == '0'           // true

false == 'false'   // false
false == '0'       // true

false == undefined // false
false == null      // false
null == undefined  // true

' \t

 '
== 0    // true


If the typeof operator already returns
a string, what's the need to type
check the return value as well? If
typeof(typeof(x)) is always string, no
matter what x actually is, then ==
should be sufficient and ===
unnecessary.

这是主观的。你可以很容易地扭转这种局面,然后问,"当你不期望隐式转换时,为什么要使用=="两者在这里都很好,所以用你感觉更好的表达你的意图。试着在项目中保持一致。


在这种情况下,没有任何理由支持===而不是==,因为这两个操作数都保证是字符串,因此两个操作数都会给出相同的结果。由于==是一个字符较少,我会赞成。

克罗克福德对此的建议是一直使用===,这对初学者是合理的建议,但如果你知道问题(在其他答案中涉及),就毫无意义地偏执。


因为==比==快,因为省略了类型强制。当然,这可能是一个微不足道的差异,但它仍然存在。


三重相等运算符主要用于变量类型和值检查(全部在1表达式中),也称为无类型强制的相等。

例子:

1
2
3
4
5
6
7
8
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

看道格·克罗克福德的《尤伊剧院关于类型强制》。

If the typeof operator already returns
a string, what's the need to type
check the return value as well? If
typeof(typeof(x)) is always string, no
matter what x actually is, then ==
should be sufficient and ===
unnecessary.

不使用typeof的最有效原因是浏览器之间的类型强制(解释)。有些浏览器可以将6=="6"作为真的传递,而有些浏览器则不会传递(取决于JS解释器的严格性),因此通过引入类型强制可以澄清这一点。此外,它会带来"面向对象"的方法,因为JavaScript的变量不是基于类型的变量(即,变量类型在Java中没有在编译时声明)。

例如,在爪哇,这将失败:

1
if ("6" instanceof Number) { // false

希望我回答了你的问题。