JavaScript 中一些值的比较,熟悉规范
2016-07-18 11:10
429 查看
[] == []; [] === []; {} == {}; {} === {};
结果:都为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?
相关文章推荐
- JQuery1——基础($对象,选择器,对象转换)
- Android学习笔记(二九):嵌入浏览器
- Android java 与 javascript互访(相互调用)的方法例子
- JavaScript演示排序算法
- javascript实现10进制转为N进制数
- 最后一次说说闭包
- Ajax
- 2019年开发人员应该学习的8个JavaScript框架
- HTML中的script标签研究
- 对一个分号引发的错误研究
- 异步流程控制:7 行代码学会 co 模块
- ES6 走马观花(ECMAScript2015 新特性)
- JavaScript拆分字符串时产生空字符的原因
- Canvas 在高清屏下绘制图片变模糊的解决方法
- Redux系列02:一个炒鸡简单的react+redux例子
- JavaScript 各种遍历方式详解