Javascript 中 == 和 === 区别是什么? - Go语言中文社区

Javascript 中 == 和 === 区别是什么?


首页 发现 话题

28 个回答

默认排序 ​
55 人赞同了该回答

JavaScript 中应该用 "==" 还是 "==="? - 贺师俊的回答

对后续代码会不会造成意外的影响”?答案是:会。

意外的影响不是指程序执行上的“副作用”,而是指代码意图的实现。


提到的 You don't know JS 是本好书,但是不代表作者的所有观点都是对的。

如果对你来说编程是一项工作,而不仅仅是兴趣爱好,就需要用工程标准进行衡量。而以工程标准衡量,“==”带来的便利性抵不上其带来的成本。

举个简单的例子,团队协作中你肯定需要读别人的代码。而当你看到“==”时,要判断清楚作者的代码意图是确实需要转型,还是无所谓要不要转型只是随手写了,还是不应该转型但是写错了……所花费的脑力和时间比明确的“===”(加上可能需要的明确转型)要多得多。要记得团队中的每个人(包括原作者自己)都需要付出这理解和维护成本。
55 ​4 条评论
​分享
​收藏 ​感谢
577 人赞同了该回答
谁告诉你 == 不会有副作用的
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

————————————————————————————————————————————
这是 == 这是 === 完整比较图:
  • 红色:===
  • 橙色:==
  • 黄色:<= 和 >= 同时成立,== 不成立
  • 蓝色:只有 >=
  • 绿色:只有 <=

(参: JS Comparison Table, Edit fiddle - JSFiddle)

顺便,有人说这图像现代艺术,感觉旋转完更像,删减重排换成 S1 配色之后做成头像了。
不免费帮人做头像(也就是换个顺序的事情)

577 ​33 条评论
​分享
​收藏 ​感谢 收起
59 人赞同了该回答
"==="叫做严格运算符,"=="叫做相等运算符。

严格运算符的运算规则如下,
(1)不同类型值
如果两个值的类型不同,直接返回false。
(2)同一类的原始类型值

同一类型的原始类型的值(数值、字符串、布尔值)比较时,值相同就返回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"); //无输出
}
也就是说当a为undefined时,输出的值会有变化,而在编程中对象变成undefined实在是太常见了。

推荐一篇文章 运算符 -- JavaScript 标准参考教程(alpha)
59 ​5 条评论
​分享
​收藏 ​感谢 收起
33 人赞同了该回答
场景一:你向女神表白,女神说:0点见;
场景二:你向女神表白,女神说不,转身离开了。
使用 == 的时候,JS 告诉你这两个场景结果是一样的。
这不是坑爹吗?
33 ​收起评论
​分享
​收藏 ​感谢

1 条评论

​切换为时间排序
啪啪啪小生手
啪啪啪小生手 16 天前

很好啊!0点见不是就想耍小白嘛!多亏==

33 人赞同了该回答

题主,我非常推荐你看看这个系列: 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]

这也侧面印证了, 在搞不清后果的情况下,不应该随便修改预定义对象的 prototype 上的方法。
如果不存在例子中这种带有副作用代码的情况,还是可以放心地使用 ==
33 ​10 条评论
​分享
​收藏 ​感谢 收起
2 人赞同了该回答

一般来说是比较推荐 x==null的做法
没有人说一定使用=== 就好, 至少很多FrameWork 和 Lib 都是用 == 居多

使用==有效避免如下代码:
var a = new String(1)
undefined
a
String {0: "1", length: 1, [[PrimitiveValue]]: "1"}
a=="1"
true
a==="1"
false
很明显 a 就是个货真价实的字符串
2 ​6 条评论
​分享
​收藏 ​感谢
3 人赞同了该回答

不会。不会对比较变量本身产生形象(除非toString或valueOf方法被覆写成特定用途了)。

不推荐的原因是其逻辑比较难懂,容易疏忽出错。

——

括号的例子:
a={};
a.toString=function(){alert(0);};
a.valueOf=function(){alert(1);a=1;};
a==0;//自动依次触发了以上两个函数
alert(a);//已经是1
3 ​添加评论
​分享
​收藏 ​感谢

== :相等运算符

=== :我更愿意叫它全等运算符


两者区别

第一点:前者仅判断数据的值,而后者是先判断数据的类型,相同的前提下在判断数据的值。

第二点:也就是评论中所说的“操作数类型不同时它们的处理方式不同”


先来说一下"=="的情况:

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
站方申明:本站部分内容来自社区用户分享,若涉及侵权,请联系站方删除。
  • 发表于 2021-05-31 05:06:36
  • 阅读 ( 1020 )
  • 分类:

0 条评论

请先 登录 后评论

官方社群

GO教程

猜你喜欢