JS隐式类型转换规则

简介: JS隐式类型转换规则

JavaScript中,类型转换只有三种:

1、转换成数字

2、转换成布尔值

3、转换成字符串

1、加法运算操作符

加号运算操作符在Javascript可以做为数字的相加,也用于字符串连接符,所以要特别注意。其转换规则是:当加号两边都是数字的时候执行加法,否则一律连接。所以加号操作符的规则分种情况:

(1)如果有一侧为String类型

加法运算在这种情况下,如果有一侧为String类型,则将另一侧转换为字符串,最后连接起来。

注意:对象,数组,函数,布尔, 则先调用toString()方法取得字符串值,调用其valueOf()方法,然后在拼接到一起。对于undefined和null,分别调用String()显式转换为字符串。

console.log('1' + 2) // '12'
console.log('1' + {}) // '1[object Object]' 等价于 console.log('1' + {}.toString());
console.log('1' + []) // '1' 空数组执行toString()方法后被转义成空字符串
console.log('1' + ['1','2','a']) // '11','2','a'
console.log('1' + function(){}) //'1function(){}'
console.log('1' + true) // '1true'
console.log('1' + undefined) // '1undefined' 等价于 console.log('1' + String(undefined));
console.log('1' + null) // '1null'
console.log('1' + NaN) // '1NaN'

(2)如果有一侧是Number类型,另一侧是原始类型,则将元素类型转换成Number类型

console.log(1 + 1) // 2
console.log(1 + true) // 2
console.log(1 + null) // 1

(3)如果有一侧是Number类型,另一侧为引用类型,将引用类型和Number类型转换成字符串后拼接。

console.log(1 + {}) // '1[object Object]'
console.log(1 + []) // '1'
console.log(1 + [1,2,3]) // '11,2,3'

以上3点,优先级从高到低

下边的是一些特殊情况。

console.log(1 + NaN) // 'NaN'
console.log('1' + NaN) // '1NaN'
console.log({} + NaN) // NaN
console.log({} + []) // 0
console.log([] + []) // ''
console.log({} + {}) // '[object Object][object Object]'

2、减号(-)运算符、乘除(*, /)、取模运算符(%)

这些操作符针对的是运算,所以他们具有共同性:如果操作值之一不是数值,则被隐式调用Number()函数进行转换。可以看出,这里必须的搞懂各种类型调用Number()函数后的结果。

console.log('2' - 1) // 1
console.log('2' - {}) // NaN
console.log(2 * ['10']) // 20  ['10']首先会变成 '10', 然后再变成数字 10

3、逻辑语句中的类型转换

比如if,for,while循环,其表达式结果往往是一个Boolean类型,这时候就会出现js的隐式类型转换。

(1)单个变量时候,会先将变量转换为Boolean值

转换规则是:只有 null undefined '' NaN 0 false 这几个是 false,其他的情况都是 true,比如 {} , []。

(2)使用 == 比较的情况,有5种情况

image.png

NaN == 0 //false
NaN == NaN  //false

$\color{red}{2)Boolean 和其他任何类型比较,Boolean 首先被转换为 Number 类型。</font>

true == 1 // true
true == ['1']  // true  true会转换成1,['1']会拆解成'1',在参考下边的规则3
true == ['1','2']  // false  
false == undefined //false 首先 false 变成 0,然后参考规则4
false == null //false

image.png

'1' == 1 // true
'' == 0  // true  ''会转变成0

image.png

null == undefined // true
null == 0  // false 
null == false  // false 
undefined == 0  // false 
undefined == false  // false

image.png

什么是ToPrimitive规则?

JS引擎内部转换为原始值ToPrimitive(obj,preferredType)函数接受两个参数,第一个obj为被转换的对象,第二个preferredType为希望转换成的类型(默认为空,接受的值为Number或String)在执行ToPrimitive(obj,preferredType)时如果第二个参数为空并且obj为Date的实例时,此时preferredType会被设置为String,其他情况下preferredType都会被设置为Number.

如果preferredType为Number,ToPrimitive执行过程如下:

1、如果obj为原始值,直接返回;

2、否则调用 obj.valueOf(),如果执行结果是原始值,返回之;

3、否则调用obj.toString(),如果执行结果是原始值,返回之;

4、否则抛异常。

如果preferredType为String,将上面的第2步和第3步调换,即:

1、如果obj为原始值,直接返回;

2、否则调用obj.toString(),如果执行结果是原始值,返回之;

3、否则调用 obj.valueOf(),如果执行结果是原始值,返回之;

4、否则抛异常。

1 == {} // false
0 == [] // true
'1,2' == [1, 2 ] //true [1, 2]通过 toString 得到一个基本类型值
'[object Object]' == { name: '小坦克'} //true 
'[object Object]' == {  } //true

今天就是中秋节啦,提前祝大家新年快乐!


相关文章
|
7月前
Turndown 源码分析:二、规则`commonmark-ruiles.js` REV1
Turndown 源码分析:二、规则`commonmark-ruiles.js` REV1
48 0
|
7月前
Turndown 源码分析:三、规则集`rules.js` REV1
Turndown 源码分析:三、规则集`rules.js` REV1
56 0
|
2月前
|
JavaScript 前端开发 安全
如何处理 JavaScript 中的类型转换错误?
【10月更文挑战第9天】处理类型转换错误需要综合运用多种方法和策略,同时要保持对潜在问题的警惕性。通过合理的错误处理,可以提高程序的健壮性,减少因类型转换错误带来的负面影响。
33 0
|
2月前
|
JavaScript 前端开发
JS隐式类型转换规则
【10月更文挑战第9天】 不同的 JavaScript 引擎可能在隐式类型转换的具体实现上存在一些细微差别。理解这些隐式类型转换规则对于正确处理数据和避免错误非常重要。
19 0
|
3月前
|
JavaScript 前端开发
JavaScript 类型转换
JavaScript 类型转换
26 4
|
4月前
|
JavaScript 前端开发
JavaScript的命名规则
JavaScript的命名规则
117 0
|
4月前
|
JavaScript 前端开发
js中的命名规则
js中的命名规则
|
4月前
|
JavaScript 前端开发
JS:类型转换(四)从底层逻辑让你搞懂经典面试问题 [ ] == ![ ] ?
JS:类型转换(四)从底层逻辑让你搞懂经典面试问题 [ ] == ![ ] ?
|
6月前
|
JavaScript 前端开发
JavaScript变量命名规则及关键字详解
JavaScript变量命名规则及关键字详解
|
5月前
|
JavaScript
js【详解】自动类型转换
js【详解】自动类型转换
25 0