js中的类型转换
原始值转换概述
原始值转布尔
Boolean()函数的应用:
let s='s'
let n=123
let f=false
let u=undefined
let nu=null
console.log(Boolean(s)); // true
console.log(Boolean('')); // false
console.log(Boolean(n)); // true
console.log(Boolean(0)); // false
console.log(Boolean(-1)); // true
console.log(Boolean(Infinity)); // true
console.log(Boolean(-Infinity)); // true
console.log(Boolean(NaN)); // false
console.log(Boolean(undefined)); // false
console.log(Boolean(null)); // false
console.log(Boolean()); // false
总结number、string、null、undefined类型转换为boolean类型的规则如以下:
-
number:0和-0转换为false- 所有非零数字(包括
Infinity和-Infinity)转换为true NaN在布尔上下文中也被视为false(尽管在严格等于(===)比较中,NaN不等于任何东西,包括它自己)
-
string:- 空字符串
''转换为false - 所有非空字符串转换为
true
- 空字符串
-
null:- 转换为
false
- 转换为
-
undefined:- 转换为
false
- 转换为
原始值转Number
Number()函数的应用:
console.log(Number('123')); // 123
console.log(Number('abc')); // NaN
console.log(Number('')); // 0
console.log(Number('0x00')); // 0
console.log(Number(true)); // 1
console.log(Number(null)); // 0
console.log(Number()); // 0
这里要提一嘴0x00在js中开头为0x、0X都会被解释成一个16进制数
总结一下各原始类型转换为Number类型的规则:
-
string:- 如果字符串可以被解析为一个有效的数字序列(包括整数、浮点数、科学计数法表示的数等),那么该字符串将被转换为对应的数字。
- 如果字符串不能被解析为一个有效的数字序列(例如,包含非数字字符或格式不正确),那么转换结果将是
NaN(Not a Number)。 - 空字符串
''会被转换为0。
-
boolean:true被转换为1。false被转换为0。
-
null:- 转换为
0(使用Number()函数或一元加号+运算符时)。
- 转换为
-
undefined:- 转换为
NaN(使用Number()函数或一元加号+运算符时)
- 转换为
原始值转String
String()函数的应用:
console.log(String(123)); // '123'
console.log(String(NaN)); // 'NaN'
console.log(String(true)); // 'true'
console.log(String(false)); // 'false'
console.log(String(undefined)); // 'undefined'
console.log(String(null)); // 'null'
总结原始值转string都是直接将内容加上引号。 以上三种转换方法都称之为显示类型转换
对象转原始值:
首先给出一段这样的代码:
if({}){
console.log('ok') //'ok'
}
这里我们运行会打印出'ok'
那么这里就提出了我们这一段的主题对象转原始值,也称隐式类型转换。而上面要想成功打印就得将{}转换成true,而在JavaScript引擎自动执行中就会通过ToPrimitive函数将其转换。这里我们就来讲解一下ToPrimitive它内部操作:
转换对象为Number
-
JavaScript引擎会调用
Number()函数来处理这个对象。 -
Number()函数内部会尝试将参数转换为一个数字。 -
调用
ToNumber(x)内部函数,其中x是待转换的对象({})。 -
在
ToNumber(x)内部,会先调用ToPrimitive(obj, "Number")尝试将对象转换为原始值:a. 检查obj是否为原始类型
(Number, String, Boolean, Symbol, null, undefined)。如果是,则直接返回该值。b. 如果obj不是原始类型,则尝试调用obj的
valueOf()方法。- 如果valueOf()返回原始值,则返回该原始值。
- 如果valueOf()返回的不是原始值(比如返回了另一个对象),则继续下一步。
c. 如果valueOf()没有返回原始值,则尝试调用obj的
toString()方法。- 如果toString()返回原始值,则返回该原始值。
- 如果toString()返回的不是原始值(理论上,toString()应该返回一个字符串,但这里我们为了完整性考虑所有可能性),则抛出TypeError异常。
d. 如果valueOf()和toString()都没有返回原始值,则抛出TypeError异常。
console.log(Number({})) // NaN
转换对象为String
-
JavaScript引擎会调用
String()函数来处理这个对象。 -
String()函数内部会尝试将参数转换为一个字符串。 -
调用
ToString(x)内部函数,其中x是待转换的对象({})。 -
在
ToString(x)内部,会先调用ToPrimitive(obj, "String")尝试将对象转换为原始值:a. 检查
obj是否为原始类型(String,Number,Boolean,Symbol,null,undefined)。如果是,则直接返回该值的字符串表示。b. 如果
obj不是原始类型,则尝试调用obj的toString()方法。- 如果
toString()返回原始值(通常是字符串),则返回该原始值。 - 如果
toString()返回的不是原始值(理论上,toString()应该返回一个字符串),则继续下一步。
c. 如果
toString()没有返回原始值,则尝试调用obj的valueOf()方法。- 如果
valueOf()返回原始值(例如数字、布尔值或字符串),则JavaScript引擎会尝试将该原始值转换为字符串(如果它不是字符串的话)。 - 如果
valueOf()返回的不是原始值(理论上,这种情况不常见,因为valueOf()通常返回原始值或对象本身),则继续下一步。
d. 如果
valueOf()也没有返回原始值,则抛出TypeError异常。 - 如果
console.log(String({})) // '[object Object]'
转换对象为Boolean
将对象转换为Boolean总结就是一句话:任何对象转布尔都是true
总结
将对象转换为几种常用的原始类型,通过ToPrimitive()函数的内部操作中的toString方法将对象转换为字符串再通过显示转换转换成需要的类型。
最后一个面试题
console.log([]==![]);
来分析一下这给会打印出什么?答案是true
console.log([]===![]);
在分析一下这个呢?答案是false,
网上有很多这样的答案来解释==和===的区别,而在这就总结成==会触发隐式类型转换,===则不会。
将[]==![]的转换规则手撕出来就是:
// []==![]
// []==!true
// []==false
// []==0
// Number([])==0
// ''==0
// 0==0
转载自:https://juejin.cn/post/7377683176229175323