作者:手机用户2602937913 | 来源:互联网 | 2023-10-12 14:21
基本运算规则+的使用有两种情况当+连接两个变量或值时即为二元运算符,比如a+b,当+在变量或值前面时,则为一元运算符,比如+12.1一元运算符直接转换为Number类型,相当于Nu
基本运算规则
+
的使用有两种情况
当+
连接两个变量或值时即为二元运算符,比如a + b
,当+
在变量或值前面时,则为一元运算符,比如+'12.1'
一元运算符
直接转换为Number类型,相当于Number()
常用的还有!
运算符,用来转为Boolean类型
二元运算符
加法,可以认为只有两种情况
1、数字 + 数字
2、字符串 + 字符串
其他类型的值相加最终都会隐式转换为上述两种类型相加。
JS中的基本数据类型(primitives)有6种,
String、Number、Boolean、undefined、null、Symbol
引用数据类型则是指除了上述基本数据类型以外的所有值,比如Array、Function
隐式类型转换
加法的隐式转换:
1、转换为原始值
当需要转换为原始值时,JS引擎内部会进行抽象操作ToPrimitive()
。
ToPrimitive(input,PreferredType?)
// 如果为原始值则直接返回
// 如果为引用数据类型则
// 1、先尝试调用valueOf()方法,如果返回值为原始值,则返回该值
// 2、否则,尝试调用toString()方法,如果返回值为原始值,则返回该值
// 3、否则,抛出异常
// 注:
// 1、如果第二个参数PreferedType为String,则2和3顺序调换,即先调用toString。
// 2、PreferedType默认为Number,但在遇到Date类型的值时为String
具体转换规则可以参考ECMA规范中9.1的ToPrimitive和[[DefaultValue]]部分
2、转换为数字
规则为:
类型 | 结果 |
---|
undefined | NaN |
null | 0 |
Boolean | true为1,false为0 |
Number | / |
String | 转数字,”” -> 0 |
Object | 先ToPrimitive转为原始值再转为数字 |
3、转换为字符串
直接转换,不做赘述,对象类型时参考数字的处理
相关面试题
[] + {} // 结果为 '[object Object]'
[] + [] // 结果为 ''
{} + {} // 结果为 NaN
{} + [] // 结果为 0,当语句开始为{时,会被JS解释器认为是代码块,所以实质上是 +[]
{} + {} // 结果为NaN,原因同上
注:第五道面试题在node.js环境下的运行结果却是'[object Object]'
,node和chrome同样使用了V8引擎,想来是对此做了特殊处理
参考
深入理解Javascript中Object类型的转换