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

时间:2010-09-27 13:00:02

标签: javascript typeof

在许多第三方库和最佳实践博客/推荐等中......通常会看到这样的语法:

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 会返回字符串文字?即使有一些边缘情况,为什么附加类型检查用于对象,字符串,函数等...

5 个答案:

答案 0 :(得分:20)

回答主要问题 - 将typeof==一起使用没有任何危险。以下是您可能还想使用===的原因。


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

您的想法是,您可以在每次检查平等时考虑是使用==还是===,或者您可以养成始终写===的习惯。

如果您要与=====进行比较并且您想要强制(例如,您想要{{} 1}}或true评估为false)然后只使用0而不是''


对于那些不了解typeof上下文之外的false问题的人,请参阅The Good Parts

if(! empty_str)

答案 1 :(得分:5)

  

如果typeof运算符已经返回   一个字符串,需要输入什么   检查返回值?如果   typeof(typeof(x))总是字符串,不   无论实际是什么,然后==   应该足够了===   不必要的。

这是主观的。您可以轻松地转过身来,并问:“为什么在不期望隐式转换时会使用==?”两者在这里工作正常,所以使用你觉得更好的表达你的意图。尽量在项目中保持一致。

答案 2 :(得分:2)

在这种情况下,完全没有理由支持===超过==,因为两个操作数都保证为字符串,因此两个运算符都会给出相同的结果。由于==是一个字符,我更倾向于此。

Crockford对此的建议是始终使用===,这对于初学者来说是合理的建议,但如果你知道这些问题(在其他答案中有所涉及),那就是毫无意义的偏执。

答案 3 :(得分:1)

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

答案 4 :(得分:0)

三个相等的运算符主要用于变量类型和值检查(全部在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))总是字符串,不     无论实际是什么,然后==     应该足够了===     不必要的。

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

E.g。在Java中,这会失败:

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

希望我回答你的问题。