数组 - 详解一下 javascript 中的比较
PHP中文网
PHP中文网 2017-04-10 12:47:35
[JavaScript讨论组]

第一次提问。本来想写篇文章,不过在写之前想听听大神们的分析,所以来此提问一下,抛砖引玉。

代码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;

问:比较结果是什么?以及为什么会是这个结果?

PHP中文网
PHP中文网

认证0级讲师

全部回复(4)
迷茫
  • 代码1:对象比较。
  • 代码2:隐式类型转换。

没人解释第一段代码吗?(明天我解释。)

黄舟

严格相等比较运算符 === 只在变量类型相等时,才继续比较值是否相等。否则,直接返回false.

宽容相等比较运算符 == 在遇到不同变量类型比较时,先试图进行变量类型转换, 之后再进行严格相等比较.

由于宽容相等比较运算符,在自动进行变量类型转换时的步骤非常含混和难记, 所以运算结果经常出人意料。

对于{} === {}或者[] === [], 我觉得等同于下面这段代码:
var x = {}, y = {}; 或者 var x = Object(), y = Object();

> x === y
false
> x === x
true

就是说,x === y 仅当 xy 指向同一个object时为true. 想真正判断object或者array相等,只有遍历元素,然后判断是否每个都相等。

以上观点有不对的地方请大家指正~~

另,Douglas Crockford编写的jslint,在检测代码格式时,默认状态下禁止使用宽容相等比较运算符。 并把 == 归类为javascript中魔鬼运算符之一。

大家讲道理

对规范不理解,我解释一下代码1,

{} == {};

这个会产生一个解析错误:

SyntaxError: Unexpected token ==

其实,{} 在这里并不是一个空对象,解析器把它当作了一个“代码块”,因此出现了解析错误,如果把它解析为空对象,需要添加小括号。

({}) == ({});
PHP中文网

看了这个问题,又看了提问的人,忍不住想写两句:

a = function(){};
b = function(){};

a == b;
a === b;
热门教程
更多>
最新下载
更多>
网站特效
网站源码
网站素材
前端模板
关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送

Copyright 2014-2026 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号