typfof & instanceof
涉及面试题:typeof 是否能正确判断类型?
typeof 对于原始类型来说,除了 null 都可以显示正确的类型
- 原始类型/基本类型 Number String Boolean Undefined Null Symbol
- 引用类型 object funtion
typeof 对于对象来说,除了函数都会显示 object
const fu = () => {console.log('i')}
-
console.log(typeof(fu))
output :function
typeof [] // 'object'
typeof {} // 'object'
typeof console.log // 'function'
所以说 typeof 并不能准确判断变量到底是什么类型
instanceof 能正确判断对象的原理是什么?
- 内部机制是通过原型链来判断的
- 想判断一个对象的正确类型,这时候可以考虑使用 instanceof
- 直接通过 instanceof 来判断类型是不行的
- 可以通过
Symbol.hasInstance
自定义instanceof
行为 - 这其实也侧面反映了一个问题, instanceof 也不是百分之百可信的。
类型转换
运算符
运算中其中一方为字符串,那么就会把另一方也转换为字符串
如果一方不是字符串或者数字,那么会将它转换为数字或者字符串
4 + [1,2,3] // "41,2,3"
特例:
'a' + + 'b' // -> "aNaN"
解释:
+'b'
转换失败输出NaN
比较运算符
- 如果是对象,就通过 toPrimitive 转换对象
- 如果是字符串,就通过 unicode 字符索引来比较
let a = {
valueOf() {
return 0
},
toString() {
return '1'
}
}
a > -1 // true
在以上代码中,因为 a 是对象,所以会通过 valueOf 转换为原始类型再比较值。