js的隐式数据类型转换规则(二)实践篇

四则运算中的转换

这些操作符会尝试将他们的操作数转换为数字(使用Number()),如果操作数没法转换为数字的话,他们的结果就是NaN。

‘+’运算符

基本类型

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
a.  true+1

Number(true)+1 //2

b. undefined+1

Number(undefined)+1 //NaN

c. null+1

Number(null)+1 //1

d. "2"+1 //21

如果使用‘+’符号时,存在一个值为字符串类型,那么另一个值无条件的被转化为字符串类型

e. “dede”+1 //dede1

引用类型

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
a.  []+1              // "1"(string)

b. ['12']+1 // '121'

c. var f=function(){} ; f+1; // "function(){}1"

f.valueOf() //f (){} 函数本身

f.toString() // 'function(){}' 字符串类型

左侧为字符串类型,右侧自动转化为字符串类型,其它的同理。

d. 1+{} 与{}+1

Object.prototype.valueOf.call({}) //{}

Object.prototype.toString.call({}) //"[object Object]"

所以1+{}的结果是"1[object Object]"

对于{}+1,{}被解释成代码块,执行的操作就是+1,结果为1

e. {}+[] //0

{}被当成是代码块,执行的是+[]这个取正运算,[]首先被转化为string类型的空字符串,由于取正运算符,转化为0

取正值(均转化为number类型)

‘+’作为一元操作符时,都是尝试将他们的操作数转换为数字(使用Number()),如果操作数没法转换为数字的话,他们的结果就是NaN。(转化的具体值见第一篇的表格)

减号,乘号,除号运算

这些操作符会尝试将他们的操作数转换为数字(使用Number()),如果操作数没法转换为数字的话,他们的结果就是NaN。

比较运算符中的判断

1
2
3
4
5
6
7
8
9
10
11
12
1. []==![]    //true
a. [].valueOf() //[] 返回自身,不是一个基本类型
b. [].toString() //""返回一个字符串,是一个基本类型
c. ![]首先会进行显式类型转换,将其转化为 false
d. 如果 x,y 类型不一致,且 x,y 为 StringNumberBoolean 中的某一类型,则将 x,y 使用 toNumber 函数,转化为 Number 类型再进行比较。
e.Number("")===Number(false) //true

2. +0==-0 //true

3. undefined==null //true

4. NaN==NaN //false

alert等方法中参数是某一固定类型的时候的转换

alert(string)传入的参数会发生隐式类型转换,转换为string

Copyright © 2018 - 2019 诗之花绪 All Rights Reserved.

UV : | PV :