内置类型
js中分为其中内置类型 ,其中内置类型又分为两大类型 :基本类型和对象(Object).
基本类型有六种 :null 、undefined、boolean、number、string、symbol.
NaN也属于number,并且NaN不等于自身
对于基本类型来说,如果使用字面量的方式,那么这个变量只是个字面量,只有在必要的时候才会转换成对应的类型
let a =111 //这只是字面量 不是number类型
a.toString() //使用的时候才会转换成对象类型
对象(Object)是引用类型,在使用时会遇到浅拷贝和深拷贝的问题
let a = { name: "FE" }
let b = a
b.name = "EF"
console.log(a.name) //EF
Typeof
typeof 对于基本类型,除了null 都可以显示正确的类型
typeof 1 // 'number'
typeof '1' // 'string'
typeof undefined // 'undefined'
typeof true // 'boolean'
typeof Symbol() // 'symbol'
typeof b // b没有声明,但是还会显示 undefined
typeof 对于对象 ,除了函数都会显示 object
typeof [] // 'object'
typeof {} // 'object'
typeof console.log // 'function'
对于null 来说 虽然他是基本类型,但是会显示 object ,这是一个存在很久了的Bug
typeof null // 'object'
如果我们想获得一个变量的正确类型,可以通过 Object.prototype.toString.call(xx)。这样我们就可以获得类似 [ object Type ]的字符串
类型转换
在条件判断时,除了 undefined , null , false , NaN, ' ', 0 ,-0 ,其他所有的值都为true,包括所有对象。
对象转基本类型
对象转基本类型时,首先会调用valueof 然后调用 toString. 并且这两个方法是可以重写。
let a = {
valueOf(){
return 0
}
}
当然你也可以重写 Symbol.toPrimitive ,该方法在转基本类型时调用优先级最高
let a = {
valueOf(){
return 0;
},
toString(){
return '1';
},
[Symbol.toPrimitive](){
return 2;
}
}
1+a //=>3
'1'+a //=>'12'
匹配运算符
只有当加法运算时,其中一方是字符串类型,就会把另一个也转为字符串类型。其他运算只要其中一方是数字,那么另一方就转为数字。并且加法运算会触发三种类型转换:将值转换为原始值,转换为数字,转换为字符串。
1 + '1' // '11'
2 * '2' // 4
[1,2] + [2,1] // '1,22,1'
// [1,2].toString() -> '1,2'
// [2,1].toString() -> '2,1'
// '1,2' + '2,1' = '1,22,1'
对于加号需要注意这个表达式 'a' ++'b'
'a' + + 'b' //->"aNaN"
// 因为 + 'b' ->NaN'
// 你也许在一些代码中看到过 + '1' -> 1
==操作符
上图中的 toPrimitive 就是对象转基本类型
这里来解析一到题目 [] ==![] //=> true ,下面是这个表达式为何为true的步骤
// [] 转为 true,然后去反变为 false
[] == false
//根据第8条得出
[] == ToNumber(false)
[] == 0
// 根据第10条得出
ToPrimitive([]) == 0
// [].toString() -> ''
'' == 0
// 根据 第六条得出
0 == 0 //->true
比较运算符
1.如果是对象 ,就通过 toPrimitive 转换对象
2.如果是字符串,就通过 unicode 字符索引来比较