涉及隐式转换最多的两个运算子 + 和 ==。
+运算子即可数字相加,也可以字串相加。
== 不同於===,故也存在隐式转换。
减、乘、除这类运算子只会针对number型别,故转换的结果就是转换成number型别。
优先顺序为由上而下!
2-1. PreferredType是Number型(第一步决定该转换为Number型)时:
2-2. PreferredType是String型(第一步决定该转换为String型)时:
2-3. PreferredType在第一步没有办法指定转换哪一种型时:
3-1.valueOf()方法:
var num = new Number('123');
num.valueOf(); // 123
var str = new String('12df');
str.valueOf(); // '12df'
var bool = new Boolean('fd');
bool.valueOf(); // true
var a = new Date();
a.valueOf(); // 1515143895500
var a = new Array();
a.valueOf() === a; // true
var b = new Object({});
b.valueOf() === b; // true
3-2.toString:
经过前面步骤,会得到一个原始值,之後依照运算子的需求选择利用ToNumber将该原始值转换成数自型态;或是利用ToString将该原始值转换为字串,转换规则参考顶层的转换表。
({} + {}) = ?
两个物件的值进行+运算子,肯定要先进行隐式转换为原始型别才能进行计算。
2 * {} = ?
1、首先乘号运算子只能对number型别进行运算,故第一步就是对{}进行ToNumber型别转换。
2、由於{}是物件型别,故先进行原始型别转换,ToPrimitive(input, Number)运算。
3、所以会执行valueOf方法,({}).valueOf(),返回的还是{}物件,不是原始值。
4、继续执行toString方法,({}).toString(),返回"[object Object]",是原始值。
5、转换为原始值後再进行ToNumber运算,"[object Object]"就转换为NaN。
故最终的结果为 2 * NaN = NaN
定义:比较两侧的值是否在型态上及数值上皆相同。
NaN === NaN; //false
+0 === -0; //true
定义:宽松相等不限於型态相同,即型态不相同也可宽松相等。
1 == '1' // true
[2] == 2 // true
解:
[] == !{} // true
1、! 运算子优先顺序高於==,故先进行!运算。
2、!{}运算结果为false,结果变成 [] == false比较。
3、属於一侧为boolean值的宽松相等比较:
等式右边y = ToNumber(false) = 0。结果变成 [] == 0。
4、属於当引用型别和原始型别的宽松相等比较:
[]会先呼叫valueOf函式,返回this。
不是原始值,继续呼叫toString方法,x = [].toString() = ''。
故结果为 '' == 0。
5、属於数字类型和字串类型的宽松相等比较:
等式左边x = ToNumber('') = 0。
所以结果变为: 0 == 0,返回true,比较结束。
参考文章:
最後一天~~~ 压轴当然是要最好玩的东西啦,讲完今天的内容,大家就可以在介面上自由的创作了! ♠♣今...
设定完成 AdventureWork 资料库做高可用性资料库後,来测试资料是否会正确的同步到次要资料...
哇!不知不觉就到第 30 天了,来回顾一下这 30 天的旅程吧! 简单回顾 自己订的铁人赛主题是阅读...
我还记得我学Git的时候,开始查Git是什麽,最开始出现的是下面这个画面,一堆原型的球球在上面,有的...
前言 今天玩转黑胶唱片,Audio Web API 接起来~~ Audio Web API Audi...