JS的七种内置类型
- JS分为七种内置类型;其中内置类型又分为两大类:
基本类型
和对象(Object)
;- 基本类型有六种:
null
undefined
number
string
boolean
Symbol
- 其中js的number类型也是浮点类型的,没有整型;
NaN
也属于number
类型,并且不等于自身- 对象Object是引用类型,其在使用的时候会遇到深拷贝和浅拷贝的问题
变量类型typeof判断
- typeof 对于基本类型,除了 null 都可以显示正确的类型;null显示的是object
- JS最初版本使用的是32位的系统;为了考虑性能使用的是低位存储变量信息;000开头代表的是对象,而null全为0,所以错误判断null为object,这个bug一直留存
Object.prototype.toString.call(xx) //可以用这个来获取正确的变量类型
类型的转换
转Boolean:
除了
undefined
null
false
NaN
``
0
-0
之外的所有的值都转成true,包括对象
四则运算
- 只有当加法运算,其中一方是String类型才会把另一方也转化成String类型
- 其中一方是数字类型那么另外一方转化成数字类型
- 加法运算会触发三种类型转换:
- 将值转化成原始值
- 转化成数字
- 转化成字符串
1 + '1' // '11';加法中一方为字符串,将number类型转化成字符串
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' // -> "aNaN"
// 因为 + 'b' -> NaN
==基本操作符
undefined == undefined; //true
null == null; //true
undefined == null; //true
0 == -0; //true
123 == '123'; //true;返回将字符串化成number的结果
NaN == NaN; //false
false == false; //true
true == true; //true
//若一方为Boolean则返回Number(这个boolean值) == 要比较的值的结果;Number(true)为1,Number(false)为0;例如:
[] == false; //true
//如果一方为String或者Number另外一方为Object,那么返回比较object转化的结果
有意思的一道题[] == ![]
的结果为true解析:
// [] 转成 true,然后取反变成 false
[] == false
// 根据第 8 条得出
[] == ToNumber(false)
[] == 0
// 根据第 10 条得出
ToPrimitive([]) == 0
// [].toString() -> ''
'' == 0
// 根据第 6 条得出
0 == 0 // -> true