第一次提问。本来想写篇文章,不过在写之前想听听大神们的分析,所以来此提问一下,抛砖引玉。
代码1:
[] == [];
[] === [];
{} == {};
{} === {};
代码2:
var n0 = 123;
var n1 = new Number(123);
var n2 = new Number(123);
var n3 = Number(123);
var n4 = Number(123);
n0 == n1;
n0 == n3;
n0 === n1;
n0 === n3
n1 == n2;
n1 === n2
n1 == n3;
n1 === n3;
n3 == n4;
n3 === n4;
问:比较结果是什么?以及为什么会是这个结果?
Copyright 2014-2026 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号
没人解释第一段代码吗?(明天我解释。)
严格相等比较运算符
===只在变量类型相等时,才继续比较值是否相等。否则,直接返回false.宽容相等比较运算符
==在遇到不同变量类型比较时,先试图进行变量类型转换, 之后再进行严格相等比较.由于宽容相等比较运算符,在自动进行变量类型转换时的步骤非常含混和难记, 所以运算结果经常出人意料。
对于
{} === {}或者[] === [], 我觉得等同于下面这段代码:var x = {}, y = {};或者var x = Object(), y = Object();就是说,
x === y仅当x和y指向同一个object时为true. 想真正判断object或者array相等,只有遍历元素,然后判断是否每个都相等。以上观点有不对的地方请大家指正~~
另,Douglas Crockford编写的jslint,在检测代码格式时,默认状态下禁止使用宽容相等比较运算符。 并把
==归类为javascript中魔鬼运算符之一。对规范不理解,我解释一下代码1,
这个会产生一个解析错误:
其实,
{}在这里并不是一个空对象,解析器把它当作了一个“代码块”,因此出现了解析错误,如果把它解析为空对象,需要添加小括号。看了这个问题,又看了提问的人,忍不住想写两句: