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

问题描述 投票:0回答:5

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

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

javascript typeof
5个回答
21
投票

回答主要问题 - 将

==
专门与
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

6
投票

如果 typeof 运算符已经返回 一个字符串,需要输入什么 还要检查返回值吗?如果 typeof(typeof(x)) 始终是字符串,不是 不管 x 实际上是什么,然后 == 应该足够了=== 没有必要。

这是主观的。 您可以轻松地扭转这一局面,并问:“当您不期望隐式转换时,为什么要使用 == ?” 两者在这里都可以正常工作,因此使用您认为更能表达您的意图的那个。 尝试在项目内保持一致。


4
投票

在这种情况下,完全没有理由偏爱

===
而不是
==
,因为两个操作数都保证是字符串,因此两个运算符将给出相同的结果。由于
==
少了一个字符,我会赞成这一点。

Crockford 对此的建议是始终使用

===
,这对于初学者来说是合理的建议,但如果您知道问题(在其他答案中有所介绍),则毫无意义的偏执。


2
投票

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


1
投票

三重等于运算符主要用于变量类型和值检查(全部在 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

希望我回答了你的问题。

© www.soinside.com 2019 - 2024. All rights reserved.