01.类型是如何转换的?
大约 2 分钟
类型转换规则
- 原始-->数字
- true:1
- false:0
- null:0
- undefined:NaN
- String
- 空字符串(含空白字符):0
- 去掉引号,不是数字就是NaN
- 其他类型-->bool
- null:false
- undefined:false
- number
- 0:false
- NaN:false
- 其他:true
- string
- 空字符串:false
- 其他:true
- 对象:true
- 原始-->字符串
- null:'null'
- undefined:'undefined'
- number:'数字'
- boolean
- true:'true'
- false:'false'
- 对象-->原始
- 调用valueof-->得到的是对象?重新调用toString-->得到的还是对象?报错
运算规则
- 算数运算符:+ - * / % ++ --
- 转换为原始类型
- 转换为数字,然后再进行运算
- 特殊情况:x+y,x+y有一个字符串,转换为字符串,然后拼接
- 特殊情况:NaN和任何类型运算的到的还是NaN
- 转换为原始类型
- 比较运算符:> < >= <= == != === !==
- (> < >= <=)
- 转换成原始类型
- 转换成数字,再进行比较
- 特殊情况:俩端全是字符串,比较字典的顺序
- 特殊情况:俩端存在NaN,一定是false
- 转换成原始类型
- ===
- 类型和值必须相同
- 特殊情况:俩端存在NaN,一定为false
- ==
- 俩端类型相同,比较值
- 俩端都是原始类型,转换成数字比较
- 一端是原始类型,一端是对象类型,把对象转换成原始类型在进行比较
- 特殊情况:undefined和null只有与自身比较,或者互相比较时,才会返回true
- 特殊情况:俩端存在NaN,一定为false
- != !==
- 对等取反
- (> < >= <=)
- 逻辑运算符:!&& || ?:
- 转换为boolean
- x&&y
- x为false,返回x
- x为true,返回y
- x||y
- x为false,返回y
- x为true,返回x
- x&&y
- 转换为boolean
表达式
概念:数据与运算符的结合
Number('123') +'123'
Boolean('123') !!'123'
if(a = undefined||a = null){a = 10} a = a||10
user && user.addr && user.addr.city
面试题
let a = {
n: 0,
valueOf: function () {
return ++this.n
}
}
console.log(!!(a == 1 && a == 2 && a == 3))
console.log(([][[]]+[])[+!![]]+([]+{})[+!![] + +!![]])
/**
* ([][[]]+[])[+!![]]+([]+{})[+!![] + +!![]]
* ([]['']+[])[+!![]]+([]+{})[+!![] + +!![]]
* (undefined+'')[1]+(''+'[Object Object]')[1+1]
* ('undefined')[1]+('[Object Object]')[2]
* nb
*/
var obj1 = {
a:1,
b:2,
valueOf:function (){
return this.a+this.b
},
toString:function (){
return 1
}
}
// 对象转boolean为true
var obj2 = {
toString:function () {
return 0
}
}
console.log(obj1+!!obj2)//4