繁体   English   中英

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

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

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

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的建议是,在许多情况下使用===更安全,如果你在某些情况下使用它,那么最好保持一致并将其用于所有事情。

我们的想法是,你可以考虑每次检查平等时是否使用===== ,或者你可以养成总是写===的习惯。

几乎没有理由使用== over === - 如果你要比较truefalse并且你想要强制(例如你想要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实际上是什么,那么==应该足够了并且===不必要。

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

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

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剧院看到类型强制。


如果typeof运算符已经返回一个字符串,那么还需要键入什么来检查返回值? 如果typeof(typeof(x))总是字符串,无论x实际上是什么,那么==应该足够了并且===不必要。

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

例如,在Java中,这将失败:

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

希望我回答你的问题。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM