+
的使用有两种状况
当+
链接两个变量或值时即为二元运算符,好比a + b
,当+
在变量或值前面时,则为一元运算符,好比+'12.1'
javascript
直接转换为Number类型,至关于Number()
经常使用的还有!
运算符,用来转为Boolean类型java
加法,能够认为只有两种状况
一、数字 + 数字
二、字符串 + 字符串
其余类型的值相加最终都会隐式转换为上述两种类型相加。node
JS中的基本数据类型(primitives)有6种,
String、Number、Boolean、undefined、null、Symbol
引用数据类型则是指除了上述基本数据类型之外的全部值,好比Array、Function
加法的隐式转换:面试
当须要转换为原始值时,JS引擎内部会进行抽象操做ToPrimitive()
。chrome
ToPrimitive(input,PreferredType?) // 若是为原始值则直接返回 // 若是为引用数据类型则 // 一、先尝试调用valueOf()方法,若是返回值为原始值,则返回该值 // 二、不然,尝试调用toString()方法,若是返回值为原始值,则返回该值 // 三、不然,抛出异常 // 注: // 一、若是第二个参数PreferedType为String,则2和3顺序调换,即先调用toString。 // 二、PreferedType默认为Number,但在遇到Date类型的值时为String
具体转换规则能够参考ECMA规范中9.1的ToPrimitive和[[DefaultValue]]部分spa
规则为:code
类型 | 结果 |
---|---|
undefined | NaN |
null | 0 |
Boolean | true为1,false为0 |
Number | / |
String | 转数字,"" -> 0 |
Object | 先ToPrimitive转为原始值再转为数字 |
直接转换,不作赘述,对象类型时参考数字的处理对象
[] + {} // 结果为 '[object Object]' [] + [] // 结果为 '' {} + {} // 结果为 NaN {} + [] // 结果为 0,当语句开始为{时,会被JS解释器认为是代码块,因此实质上是 +[] {} + {} // 结果为NaN,缘由同上
注:第五道面试题在node.js环境下的运行结果倒是'[object Object]'
,node和chrome一样使用了V8引擎,想来是对此作了特殊处理ip