社区微信群开通啦,扫一扫抢先加入社区官方微信群
社区微信群
双等号会造成类型转换,推荐一律使用三等号寻寻觅觅一直没有遇到能说服我放弃双等号的答案,还请大家赐教
JavaScript 中应该用 "==" 还是 "==="? - 贺师俊的回答
“对后续代码会不会造成意外的影响”?答案是:会。
意外的影响不是指程序执行上的“副作用”,而是指代码意图的实现。
提到的 You don't know JS 是本好书,但是不代表作者的所有观点都是对的。
如果对你来说编程是一项工作,而不仅仅是兴趣爱好,就需要用工程标准进行衡量。而以工程标准衡量,“==”带来的便利性抵不上其带来的成本。
举个简单的例子,团队协作中你肯定需要读别人的代码。而当你看到“==”时,要判断清楚作者的代码意图是确实需要转型,还是无所谓要不要转型只是随手写了,还是不应该转型但是写错了……所花费的脑力和时间比明确的“===”(加上可能需要的明确转型)要多得多。要记得团队中的每个人(包括原作者自己)都需要付出这理解和维护成本。var x = 1;
var obj = {valueOf: function(){ x = 2; return 0 }}
console.log(obj == 0, x) // true, 2
var x = 1;
var obj = {valueOf: function(){ return {} }, toString: function(){ return {}}}
console.log(obj == 0) // Error: Cannot convert object to primitive value
同一类型的原始类型的值(数值、字符串、布尔值)比较时,值相同就返回true,值不同就返回false。
(3)同一类的复合类型值
两个复合类型(对象、数组、函数)的数据比较时,不是比较它们的值是否相等,而是比较它们是否指向同一个对象。
(4)undefined和null
undefined 和 null 与自身严格相等。
null === null //true
undefined === undefined //true
相等运算符在比较相同类型的数据时,与严格相等运算符完全一样。
在比较不同类型的数据时,相等运算符会先将数据进行类型转换,然后再用严格相等运算符比较。类型转换规则如下:
(1)原始类型的值
原始类型的数据会转换成数值类型再进行比较。字符串和布尔值都会转换成数值,所以题主的问题中会有第二个string输出。
(2)对象与原始类型值比较
对象(这里指广义的对象,包括数值和函数)与原始类型的值比较时,对象转化成原始类型的值,再进行比较。
(3)undefined和null
undefined和null与其他类型的值比较时,结果都为false,它们互相比较时结果为true。
(4)相等运算符的缺点
相等运算符隐藏的类型转换,会带来一些违反直觉的结果。
'' == '0' // false
0 == '' // true
0 == '0' // true
false == 'false' // false
false == '0' // true
false == undefined // false
false == null // false
null == undefined // true
' trn ' == 0 // true
var a = undefined;
if(!a){
console.log("1"); //1
}
var a = undefined;
if(a == null){
console.log("1"); //1
}
var a = undefined;
if(a === null){
console.log("1"); //无输出
}
题主,我非常推荐你看看这个系列: You Don't Know JS
关于"=="和"===",作者在第一本书的第二章是这样说的:YDKJS | Equality
截取一小段:Many developers feel that === is more predictable, so they advocate always using that form and staying away from ==. I think this view is very shortsighted. I believe == is a powerful tool that helps your program, if you take the time to learn how it works.简单翻译一下:
许多开发者认为 === 的行为更加容易预测,所以他们总是主张使用 === 而劝人们远离 ==,我认为这种看法是非常短视的。 如果你花点时间来搞清楚它是如何工作的话,== 绝对是一个能够帮助你程序的强大工具。
关于 == 是如何工作的,可以看看链接中的文章,或者直接去看 == 的 ECMAScript Language Specification 的 11.9.3
因为你是一个有质疑精神的人,在JS领域有很多所谓 The Good Part 的部分;大家都推荐你使用JS的这个子集,抛弃一些“奇怪”的特性。在YDKJS这个系列的文章中,作者认为 The Good Part 往往是 The Safe Part;但事实上JS的另一部分同样有趣而值得研究,这个系列就致力于为你展示另一个视角。
我觉得你应该看看。
-------------------------
UPDATE (2015-7-1):
关于你的问题:“js中使用==会造成类型转换,对后续代码会不会造成意外的影响?”
我的答案是不会。
==, >, <, +, -, ...
这些操作符所造成的隐式类型转换都是无副作用的,它不会改变变量本身保存的值。
而递增操作符、递减操作符:
a++ / a--
会有副作用,即表达式执行完后递增/递减1
要解除类似的困惑,简单的方法是自己直接在控制台测一下,想要更全面的了解就直接读相关的标准。
--------------------------
UPDATE (2015-12-23):
经过
提醒,更正一下:“== 是能产生副作用的,如果你覆写某个对象的 valueOf/toString 的话。”没错,== 的隐式类型变换正是调用了这两个方法,如果在覆盖的方法里写了带有副作用的代码,确实也会导致 == 带来副作用。
例子:Array.prototype.valueOf = function() {
this[0]++;
return this;
}
var x = [1, 2, 3];
x == 0;
console.log(x); // [2, 2, 3]
一般来说是比较推荐 x==null的做法
没有人说一定使用=== 就好, 至少很多FrameWork 和 Lib 都是用 == 居多
var a = new String(1)
undefined
a
String {0: "1", length: 1, [[PrimitiveValue]]: "1"}
a=="1"
true
a==="1"
false
不会。不会对比较变量本身产生形象(除非toString或valueOf方法被覆写成特定用途了)。
不推荐的原因是其逻辑比较难懂,容易疏忽出错。
——
括号的例子:== :相等运算符
=== :我更愿意叫它全等运算符
两者区别:
第一点:前者仅判断数据的值,而后者是先判断数据的类型,相同的前提下在判断数据的值。
第二点:也就是评论中所说的“操作数类型不同时它们的处理方式不同”
先来说一下"=="的情况:
1. 两个不同的基本数据类型 :如果两个基本数据类型不同,会将它们转化为数据类型,再进行比较。
var a = 1;
var b = '1';
var c = true;
alert(a == b); //true
alert(a
版权声明:本文来源CSDN,感谢博主原创文章,遵循 CC 4.0 by-sa 版权协议,转载请附上原文出处链接和本声明。
原文链接:https://blog.csdn.net/weixin_41652466/article/details/79316897
站方申明:本站部分内容来自社区用户分享,若涉及侵权,请联系站方删除。
如果觉得我的文章对您有用,请随意打赏。你的支持将鼓励我继续创作!
1 条评论
很好啊!0点见不是就想耍小白嘛!多亏==