JavaScript 中一些值的比较,熟悉规范

[] == [];
[] === [];
{} == {};
{} === {};

结果:都为false

var n0 = 123;
var n1 = new Number(123);
var n2 = new Number(123);
var n3 = Number(123);
var n4 = Number(123);

n0 == n1; // true
n0 == n3; //true
n0 === n1; //false
n0 === n3; //true

n1 == n2; //false
n1 === n2; //false
n1 == n3; //true
n1 === n3; //false

n3 == n4; //true
n3 === n4; //true

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

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

Number([])是0,因此我们比较的是 0 == 0;

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

(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。

思考:

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

// false, why?

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

// true, why?
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值