其他所有值,包括所有对象(数组)都会转换为 true。布尔值 false,和上面6个能转为false 的值,我们一般称为“假值”,其他值称为“真值”。(“真值”等价true,“假值”等价false)
注意!!!在JavaScript 中 ,任何希望使用布尔值的地方,都会将操作数当作 “真假” 或 “假值” 对待(即把“真值”当true,“假值”当false)。这句话你现在不懂没事,看完下面的,或许你就懂了,哈哈。
字符串 转 数字
当字符串里,全为数字时,转数字,其他都为NaN。空字符串就转0
+ "666"; //666 + "66f"; //NaN + ""; //0布尔转数字
这个比较简单了。
true 转 1;false 转 0;
null 转数字
null 转 0。
+ null; //0undefined 和 NaN 转数字
undefined 和 NaN 都转 NaN。
+ undefined; //NaN + NaN; //NaN这个也比较简单,原始值 到 字符串,就原封不动的转(加个双引号)。
"zdx" + true; //"zdxtrue"对象 转 布尔
对象 转 布尔 都为 true;等同于 Boolean()
![]; //false 这里取反了,注意,取反会把操作值转布尔 !{}; //false对象 转 数字
对象 转 数字 ,首先调用 valueOf(),如果返回的是原始值,再转数字(需要的话),并返回;否则调用 toString(), 如果返回的是原始值,再转数字,并返回;否则 抛出一个类型错误。
+ []; //0 //[].valueOf(); 返回数组本身[],所以调用 [].toString(); 返回 空字符串"",""再转数字 0; + (new Date()); //1526008864094 //调用 (new Date()).valueOf(); 返回1526008864094对象 转 字符串
对象 转 字符串 ,跟转数字的规则一样。只不过是转字符串。
首先调用 valueOf(),如果返回的是原始值,再转字符串(需要的话),并返回;否则调用 toString(), 如果返回的是原始值,再转字符串,并返回;否则 抛出一个类型错误。
总结:对象对原始值,除了布尔类型,其他都是先调用valueOf,然后根据需要调用toString。
想知道,js 每个内置对象的valueOf() 和 toString()方法,可以翻到最下面,附录。
隐式转换通常发生在表达式 和 运算符 。
可以对数字做加法, 也可以做字符串连接操作。
当两个操作数 都是 数字 或 字符串时,计算是显然的。其他情况下,有如下规则
对象转原始值,除了Date 对象 直接调用toString,其他对象,调用自身的valueOf 方法,但有的对象自身没有valueOf,或者得到的不是原始值,此时调用toString。
第一步转换后,如果其中一个是字符串的话,另一个操作数也转字符串,进行字符串连接。
否则,都转为数字(或者NaN),进行加法。
栗子来了:
1 + new Date(); //"1Fri May 11 2018 14:20:50 GMT+0800 (中国标准时间)" 1 + new Number(2); //3 (new Number).valueOf(); 返回2, 和1 做加法 "66" + 6; //666 6 转 "6" 1 + {}; //"1[object Object]" ({}).toString() true + false; //1 都转数字 1 + null; //1 null 转数字 1 + undefined; //NaN undefined 转 NaN实际代码中,经常这样
var x = 66; x + ""; //"66" 等价于 String(x)注意:两点!
不要把对象字面量形式的值放在前面。
从左到右的进行 + 运算。
//对象字面量形式放在前面的结果比较复杂,不建议使用。(下面的结果不是唯一的) {} + 1; //1 {} + "1"; //1 {} + {}; //"[object Object][object Object]" {x:1} + {}; //NaN //从左到右,逐个做 + 运算 1 + 2 + ""; //"3" 1 + "" + 2; //"12" 一元运算符用法(一个操作数)把操作数转换为 数字(或者NaN),并返回它。
+ "666"; //666 等价于 Number("666") + undefined; //NaN 减号 -都是转数字,同一元加法,但是它会将结果转为 负数。
- "666"; //-666 - "66f"; //NaN 1 - null; //1 乘号 *使用 Number(),强制转数字
1 * "666"; //666 1 * null; //0 除号 /使用 Number(),强制转数字
"666" / 1; //666 1 / true; //1 求模 %使用 Number(),强制转数字
"666" % 666; //0 1 / true; //0比较运算符用来检测两个操作数(数字或字符串)的大小关系(数值大小或者字符串首个字符的16位Unicode的大小 )。
比较运算符的操作数可能是任意类型。但只有数字和字符串才能比较。因此,它会把别的操作数进行类型转换,规则如下:
对象转原始值,如果valueOf()返回原始值,直接比较,否则,调用toString()进行转换。
转原始值后,如果两个操作数都是字符串,那么将按字符串首个字符的16位Unicode的大小 进行比较。