今天看啥  ›  专栏  ›  charllote

JavaScript中的类型转换

charllote  · 掘金  ·  · 2020-04-13 07:50
阅读 96

JavaScript中的类型转换

JavaScript中的类型转换分为两种 显式类型转换 和 隐式类型转换

显式类型转换

JavaScript 的类型转换包括 转为 boolean 转为 string 转为 number 三种。

手动的调用 API 转换数据类型,比如:

转化布尔值

JavaScript 中,只有 6 种情况可以被转换成 false,其他都会被转换成 true

console.log(Boolean(0)) // output: false
console.log(Boolean(-0)) // output: false
console.log(Boolean(undefined)) // output: false
console.log(Boolean(null)) // output: false
console.log(Boolean('')) // output: false
console.log(Boolean(NaN)) // output: false
复制代码

转化为字符串

// number转化为字符串
console.log(String(123))

复制代码

转化为数字

boolean 型

如果是 true,返回 1。参数为 false,返回 +0

console.log(Number(false)) // output: 0

console.log(Number(true)) // output: 0

复制代码

null undefiend


console.log(Number(null)) // output: 0

console.log(Number(undefined)) // output: NaN

复制代码

String 字符串转化为数字,调用 ToNumer()方法,

console.log(Number('')) // output: 0

console.log(Number(' ')) // output: 0

console.log(Number('123.4')) // output: 123.4

console.log(Number('123')) // output: 123

console.log(Number('000123')) // output: 123

console.log(Number('-123')) // output: -123

console.log(Number('chart')) //output: NaN
复制代码

转化为字符串

boolean 型

console.log(String(false))  //output: 'false'

console.log(String(true)) //output: 'true'
复制代码

null undefiend


console.log(String(null)) // output: 'null'

console.log(String(undefined)) // output: 'undefined'

复制代码

number

console.log(String(0)) // output: '0'

console.log(String(-0)) // output: '0'

console.log(String(12)) // output: '12'

console.log(String(NaN)) // output: 'NaN'

console.log(String(123.4)) // output: '123.4'

console.log(String(00011))  // output: '9'  00011八进制转换为十进制为9 再输出字符串'9'
复制代码

对象转化为数字和字符串

对象转基础类型时优先调用 ToPrimitive()方法,这个方法传入值 一定会返回一个基础数据类型。

然后再根据基础数据类型的转化规则进行转化

参考规范中 ToPrimitive 的定义:

“返回对象的默认值。通过调用对象的[DefaultValue]]内部方法检索对象的默认值,并传递可选的提示 PreferredType。[[DefaultValue]]内部方法的行为由本规范为 8.12.8 中的所有本机 ECMAScript 对象定义。”

对象转数字

console.log(Number([])) // output: 0

console.log(Number({})) // output: NaN

console.log(Number([1]))  // output: 1

console.log(Number({name:'xxx'})) // output: NaN
复制代码

对象转字符串

console.log(String([])) // output: ''

console.log(String({})) // output: '[object Object]'

console.log(String([1]))  // output: '1'

console.log(String({name:'xxx'})) // output: '[object Object]'
复制代码

隐式类型转换

JavaScript 是一门弱类型语言,允许数据类型的自动转换,不会直接报错。常见的隐式类型转换的场景:

+算术运算符

console.log(1+ []) // output: 1

console.log(1+ true)  // output: 2
复制代码

+ 字符串连接符

当表达式两边是字符串和数字时 + 是字符串连接符

console.log('1' + 2) // output: '12'

console.log(1+ [1])  // output: '11'

console.log(1 + {})  // output: '1[object Object]'
复制代码

== 关系运算符

== 是不严格的等值比较,只要关系式两边的值相等即可返回 true ,类型不同时会先进行类型转换再比较值

console.log([] == ![]) // output :true
解析: [].toNumber 会返回 0; ![]先转化为布尔值为false 再调用 toNumber 方法返回 0
复制代码
console.log('1' == 1) // output :true
解析: 如果表达式两边一边是字符串 一边是数字 转化为 数字再进行比较
复制代码
console.log(null == undefined) // output :true

解析: 如果类型(x)与类型(y)相同,则:如果类型(x)未 null,则返回 true。如果类型(x)为 undfiend,则返回 true复制代码

其他场景参考 规范 中的译文:

“ 比较 x==y,其中 x 和 y 是值,产生 true 或 false。这样的比较执行如下:

如果类型(x)与类型(y)相同,则

如果类型(x)未 null,则返回 true。

如果类型(x)为 undfiend,则返回 true。

如果类型(x)是数字,则

如果 x 是 NaN,则返回 false。

如果 y 为 NaN,则返回 false。

如果 x 与 y 的数值相同,则返回 true。

如果 x 为+0,y 为-0,则返回 true。

如果 x 为-0,y 为+0,则返回 true。

返回 false。

如果类型(x)是字符串,则如果 x 和 y 是完全相同的字符序列(相同的长度和相应位置的相同字符),则返回 true。否则,返回 false。

如果类型(x)是布尔值,则如果 x 和 y 都为 true 或都为 false,则返回 true。否则,返回 false。

如果 x 和 y 引用同一个对象,则返回 true。否则,返回 false。

如果 x 为空且 y 未定义,则返回 true。

如果 x 未定义,y 为空,则返回 true。

如果类型(x)是数字,类型(y)是字符串,

返回比较结果 x==ToNumber(y)。

如果类型(x)是字符串,类型(y)是数字,

返回比较结果 ToNumber(x)==y。

如果类型(x)是布尔值,则返回比较结果 ToNumber(x)==y。

如果 Type(y)是布尔值,则返回比较结果 x==ToNumber(y)。

如果类型(x)是字符串或数字,类型(y)是对象,

返回比较结果 x==ToPrimitive(y)。

如果类型(x)是对象,类型(y)是字符串或数字,

返回比较结果 ToPrimitive(x)==y。

返回 false。 ”




原文地址:访问原文地址
快照地址: 访问文章快照