与周围环境格格不入,就只有死。

JavaScript在一些操作符下其数据类型会发生一些隐形的转换,称为隐式转换,所以js比较灵活,但是也容易造成出错。

涉及到隐式转换最多的操作符是 +==&&||console.log

+运算符既可以进行数字的相加,也能进行字符串的拼接。==只进行内容的判断,故也存在隐式转换。- * /运算符只针对number类型,故值转换成number类型。

隐式转换中主要涉及到三种转换:

  1. 将值转为原始值,ToPrimitive;

  2. 将值转为数字,ToNumber;

  3. 将值转为字符串,ToString;

  4. 将值转为布尔值,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的只有一下六种值:

  1. false

  2. null

  3. undefined

  4. 空字符串

  5. 0

  6. NaN

ToPrimitive

☞对象类型转换为原始类型的操作。它是js引擎内部的抽象操作。

当对象类型需要被转为原始类型时,它会先查找对象的valueOf方法,如果valueOf方法,如果valueOf方法返回原始类型的值,则ToPrimitive的结果就是这个值;如果valueof不存在或者valueOf方法返回的不是原始类型的值,就会尝试调用对象的toString方法,也就是会遵循对象的ToString规则,然后使用toString的返回值作为ToPrimitive的结果。

注意:如果是Date对象会先调用toString。如果valueOf和toString都没有返回原始类型的值,则会抛出异常。

操作符==

=====的区别在于==会在比较重进行隐式转换。注意它的隐式转换规则:

  1. 只要布尔类型参与比较,改布尔类型的值首先会被转换为数字类型,即ToNumber,而不是ToBoolean;

  2. 数字类型字符串类型做相等比较是,字符串类型会被转换为数字类型。根据字符串的ToNumber规则进行转换。验证:0 == ‘’结果为true,而非false。

  3. 对象类型原始类型比较时,对象类型会依照ToPrimitive规则转换为原始类型

加号+ TODO

  1. 只要字符串类型与原始类型相加,按照字符串拼接的方式输出结果;

  2. 数字与其他原始类型相加,会按照ToNumber规则进行转换输出;

&&和 || 运算符

&&和 || 运算符并不一定返回布尔值,而是两个操作数其中一个的值。

  1. || 和&&首先会对第一个操作数进行条件判断,如果其不是布尔值,会被转成布尔值,再进行判断。

  2. 对于||如果第一个操作数返回true则会返回第一个操作数的值,如果第一个操作数返回false就返回第二个操作数的值。

  3. 对于&&如果第一个操作数返回true则返回第二个操作数的值,如果第一个操作数返回false就返回第一个操作数的值。

Console.log

当进行console.log进行输入的时候,会对所有的内容进行ToSting操作。