与周围环境格格不入,就只有死。
JavaScript在一些操作符下其数据类型会发生一些隐形的转换,称为隐式转换,所以js比较灵活,但是也容易造成出错。
涉及到隐式转换最多的操作符是 +
、==
、&&
、||
和console.log
。
+运算符既可以进行数字的相加,也能进行字符串的拼接。==只进行内容的判断,故也存在隐式转换。- * /运算符只针对number类型,故值转换成number类型。
隐式转换中主要涉及到三种转换:
将值转为原始值,ToPrimitive;
将值转为数字,ToNumber;
将值转为字符串,ToString;
将值转为布尔值,ToBoolean。
注意:这里的 ToPrimitive等方法不是真正的方法名,而是转换为想对象的值类型
ToString
这里的ToString不是对象的ToString方法,而是指将其他类型的值转换为字符串类型的操作。
参数 | 结果 |
---|---|
undefined | “undefined” |
null | “null” |
布尔值 | true => “true” false => “false” |
数字 | 数字转成字符串 |
数组 | 将数组的元素以逗号拼接,相当于调用了数组的Array.prototype.join() |
普通对象 | 先进行ToPrimitive转换得到原始值,在进行ToString转换成字符串 |
注意:如果修改了默认的ToString方法,会导致不同的结果。
ToNumber
☞ 其他类型转换为数字类型的操作。
参数 | 结果 |
---|---|
undefined | NaN |
null | 0 |
布尔值 | true => 1 false => 0 |
字符串 | 纯数字类型转成对应的数字,空串转为0,否则全部按照转换失败处理,返回NaN |
数组 | 先进行ToPrimitive,然后根据转换后的原始类型进行上面的转换处理。 |
普通对象 | 同数组的处理方式 |
ToBoolean
☞ 其他类型转换为布尔类型的操作。
JavaScript中转为Boolean得到false的只有一下六种值:
false
null
undefined
空字符串
0
NaN
ToPrimitive
☞对象类型转换为原始类型的操作。它是js引擎内部的抽象操作。
当对象类型需要被转为原始类型时,它会先查找对象的valueOf方法,如果valueOf方法,如果valueOf方法返回原始类型的值,则ToPrimitive的结果就是这个值;如果valueof不存在或者valueOf方法返回的不是原始类型的值,就会尝试调用对象的toString方法,也就是会遵循对象的ToString规则,然后使用toString的返回值作为ToPrimitive的结果。
注意:如果是Date对象会先调用toString。如果valueOf和toString都没有返回原始类型的值,则会抛出异常。
操作符==
==
和===
的区别在于==
会在比较重进行隐式转换。注意它的隐式转换规则:
只要布尔类型参与比较,改布尔类型的值首先会被转换为数字类型,即ToNumber,而不是ToBoolean;
当数字类型和字符串类型做相等比较是,字符串类型会被转换为数字类型。根据字符串的ToNumber规则进行转换。验证:0 == ‘’结果为true,而非false。
当对象类型和原始类型比较时,对象类型会依照ToPrimitive规则转换为原始类型。
加号+ TODO
只要字符串类型与原始类型相加,按照字符串拼接的方式输出结果;
数字与其他原始类型相加,会按照ToNumber规则进行转换输出;
&&和 || 运算符
&&和 || 运算符并不一定返回布尔值,而是两个操作数其中一个的值。
|| 和&&首先会对第一个操作数进行条件判断,如果其不是布尔值,会被转成布尔值,再进行判断。
对于||如果第一个操作数返回true则会返回第一个操作数的值,如果第一个操作数返回false就返回第二个操作数的值。
对于&&如果第一个操作数返回true则返回第二个操作数的值,如果第一个操作数返回false就返回第一个操作数的值。
Console.log
当进行console.log进行输入的时候,会对所有的内容进行ToSting操作。