您好,匿名用户

详解一下 javascript 中的比较

0 投票

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

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

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

用户头像 提问 2016年 9月19日 @ Fiddlesticks 中士 (1,107 威望)
分享到:

1个回答

0 投票

泻药。

个人认为,此类题目的用处只有一个:熟悉规范

所以,请各位参考 http://www.ecma-international.org/ecma-262/5.1/#sec-11.9.3, 并在console中自行测试运行结果与规范是否一致即可。

举个简单的例子:

console.log( [] == !{} ); //why true?

!{}是个布尔值,为false,因此我们比较的是 [] == 0;(11.9.3-7)

Number([])是0,因此我们比较的是 0 == 0; (11.9.3-1.c.iii)

@justjavac: 解释一下 n1 == n2 与 n3 == n4 的值。

其实我们需要解决三个问题:

  • (1)new Number(123) == Number(123); //true

Number函数要么返回一个数字,要么返回Not A Number(如果参数没有办法被转化为数字),在这三个例子中,我们不必担心NaN的问题,所以Number(123)等价于数字123。

于是(1)变成 new Number(123) == 123,进入规范 11.9.3-8

11.9.3-8提示我们去找ToPrimitive(Object(123))是什么,于是我们到了8.12.8--default value,一看,哎呦我去,正好有个valueof能用,于是(1)变成了 123 == 123;,结束。

  • (2)new Number(123) == new Number(123); //false

比较分支进入 11.9.3-1.f,就是看着两个Object的引用是不是相等的,这里明显是不等的。

  • (3)Number(123) == Number(123); //true

太简单了,omitted。

下面是思考题时间:

(1)'foo' == new function(){ return String('foo'); };

// false, why?

(2)'foo' == new function(){ return new String('foo'); };

// true, why?
用户头像 回复 2016年 9月19日 @ Sona 中士 (1,301 威望)
提一个问题:

相关问题

0 投票
1 回复 38 阅读
用户头像 提问 2016年 5月18日 @ Varus 中士 (1,216 威望)
0 投票
0 回复 74 阅读
用户头像 提问 2017年 6月12日 @ Miss Fortune 上士 (2,178 威望)
0 投票
1 回复 65 阅读
0 投票
1 回复 55 阅读
用户头像 提问 2017年 3月5日 @ Udyr 中士 (1,446 威望)
0 投票
1 回复 108 阅读
用户头像 提问 2014年 8月25日 @ Nasus 中士 (1,324 威望)

欢迎来到随意问技术百科, 这是一个面向专业开发者的IT问答网站,提供途径助开发者查找IT技术方案,解决程序bug和网站运维难题等。
温馨提示:本网站禁止用户发布与IT技术无关的、粗浅的、毫无意义的或者违法国家法规的等不合理内容,谢谢支持。

IT技术交流群 - 随意问
欢迎访问随意问技术百科,为了给您提供更好的服务,请及时反馈您的意见。
...