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

IT技术 javascript typeof
2021-03-04 11:51:34

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

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个回答

回答主要问题 - 使用typeofwith没有危险==以下是您可能想要使用的原因===


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

想法是,你可以考虑是否使用=====每次检查相等性,或者你可以养成总是编写===.

几乎没有理由使用==over ===- 如果您正在比较trueorfalse并且您想要强制转换(例如您想要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
谢谢。到目前为止似乎是共识 - 风格超过需求。
2021-04-21 11:51:34
不,这不是我问的:我是在使用 typeof 运算符时专门问的。
2021-04-24 11:51:34
@Eric 我知道,但我要说的是使用的原因===是为了与您的其余代码保持一致。
2021-05-11 11:51:34
@Eric 我认为这是完全有根据的不信任!类型强制的规则非常奇怪。
2021-05-15 11:51:34
@Eric 很多好的编码实践都是关于风格的。这并不意味着他们是在浪费时间。
2021-05-18 11:51:34

如果 typeof 运算符已经返回一个字符串,那么还需要对返回值进行类型检查吗?如果 typeof(typeof(x)) 总是字符串,不管 x 实际上是什么,那么 == 就足够了,而 === 没有必要。

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

谢谢。到目前为止似乎是共识 - 风格超过需求。
2021-05-07 11:51:34

我们没有理由在所有有利于=====这种情况下,由于两个操作数都保证是字符串,因此,这两个运营商将产生相同的结果。因为==少了一个字符,所以我会赞成。

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

谢谢。到目前为止似乎是共识 - 风格超过需求。
2021-05-08 11:51:34

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

这不一定是正确的:如果您查看 ECMAScript 规范中要求每个运算符执行的步骤,那么在比较两个相同类型的对象(例如两个字符串)的情况下,它们实际上是相同的。尝试对其进行基准测试。
2021-05-12 11:51:34

三重相等运算符主要用于变量类型和值检查(全部在 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 解释器的严格性),因此通过引入类型强制可以澄清这一点。此外,它会带来“面向对象”的方法,因为 JavaScript 的变量不是基于类型的变量(即变量类型不像在 Java 中那样在编译时声明)。

例如在 Java 中,这会失败:

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

希望我回答了你的问题。

不,我专门询问涉及使用 typeof 运算符的情况。typeof 6 应始终返回字符串文字“number”,因此永远不需要类型检查“typeof 6”。
2021-04-20 11:51:34
IE 中 typeof 不返回字符串文字的示例是什么?
2021-04-29 11:51:34
@Gentleman:typeof跨浏览器一致实现。你有一个例子说明它在浏览器之间的工作方式不同吗?
2021-05-12 11:51:34
好吧, typeof 取决于浏览器如何解释变量或值......所以你的 typeof 可以在一个浏览器上工作而在另一个浏览器上失败(典型的是 IE 案例)。大多数 JS 开发人员想要一个可以在所有兄弟上运行的库,而对每个浏览器的了解最少。因此,在不学习每个浏览器的情况下完全使用该语言会有所帮助。
2021-05-17 11:51:34
我非常怀疑是否有任何 Javascript 解释器可以评估6=="6"false
2021-05-19 11:51:34