周大侠啊 进击的 JavaScript(一) 之 类型转换 (2)

其他所有值,包括所有对象(数组)都会转换为 true。布尔值 false,和上面6个能转为false 的值,我们一般称为“假值”,其他值称为“真值”。(“真值”等价true,“假值”等价false)

注意!!!在JavaScript 中 ,任何希望使用布尔值的地方,都会将操作数当作 “真假” 或 “假值” 对待(即把“真值”当true,“假值”当false)。这句话你现在不懂没事,看完下面的,或许你就懂了,哈哈。



(二)、原始值 转为 数字

字符串 转 数字

当字符串里,全为数字时,转数字,其他都为NaN。空字符串就转0

+ "666"; //666 + "66f"; //NaN + ""; //0

布尔转数字

这个比较简单了。
true 转 1;false 转 0;

+ true; //1 + false; //

null 转数字

null 转 0。

+ null; //0

undefined 和 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(), 如果返回的是原始值,再转字符串,并返回;否则 抛出一个类型错误。

"66" + []; //"66" "66" + {}; //"66[object Object]"

总结:对象对原始值,除了布尔类型,其他都是先调用valueOf,然后根据需要调用toString。

想知道,js 每个内置对象的valueOf() 和 toString()方法,可以翻到最下面,附录。



三、隐式转换 发生的地方

隐式转换通常发生在表达式 和 运算符 。



(1)加减乘除: 加号 + 二元运算符用法(两个操作数)

可以对数字做加法, 也可以做字符串连接操作。
当两个操作数 都是 数字 或 字符串时,计算是显然的。其他情况下,有如下规则

对象转原始值,除了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




(2)比较运算符 (> < >= <=)

比较运算符用来检测两个操作数(数字或字符串)的大小关系(数值大小或者字符串首个字符的16位Unicode的大小 )。

比较运算符的操作数可能是任意类型。但只有数字和字符串才能比较。因此,它会把别的操作数进行类型转换,规则如下:

对象转原始值,如果valueOf()返回原始值,直接比较,否则,调用toString()进行转换。

转原始值后,如果两个操作数都是字符串,那么将按字符串首个字符的16位Unicode的大小 进行比较。

内容版权声明:除非注明,否则皆为本站原创文章。

转载注明出处:https://www.heiqu.com/wpyzwj.html