基本数据类型
1. number 数字
具体分类
1.正数 负数 零 小数 ...
2.NaN:not a number 不是一个有效数字,但是属于number类型的
> NaN和NaN本身不相等,和其它值也都不等
> Object.is(NaN, NaN):true 「is方法内部做了特殊的处理」
> isNaN([value]):检测当前值是否不是效数字,不是有效数字返回true,反之是有效数字则返回false
3.Infinity:无限大 -Infinity:无限小
把其它数据类型转换为number 类型
-
显式转换「 Number([value]) | parseInt/parseFloat([value]) 两者的底层处理规则是不一样的」
-
隐式转换 -> Number
- 数学运算
- 基于==比较的时候
- isNaN([value])
- ...
例如:
console.log(typeof NaN); //->'number'
console.log(typeof Infinity); //->'number'
console.log(NaN === NaN); //->false
console.log(Object.is(NaN, NaN)); //->true
2. string 字符串
string字符串
+ 普通字符串
+ 模板字符串``
把其它值转换为字符串
-
显式:String([value]) 或者 [value].toString() 「->延展出数据类型检测」
-
隐式: + 加号除了数学运算,还会产生字符串拼接
-
如果“+”两边,有一边是对象,则也可能会成为字符串拼接
- 10+{} 或者 10+{name:'zhufeng'} -> '10[object Object]'
- 10+[10] -> "1010"
-
特殊:
- 10+new Number(10) -> 20
- {}+10 或者 {name:'xxx'}+10 -> 10 「原因:{...}没有参与运算,浏览器认为其是一个代码块,计算‘+10’」
- ({}+10) -> '[object Object]10'
- let x={}+10 -> '[object Object]10' 下面两种不论是包起来还是赋值,从语法分析上都要参与到计算中了
- ...
-
拓展:对象在做数学运算的时候
-
检测对象的 Symbol.toPrimitive 这个属性值,如果有则基于这个值进行运算,如果没有
-
检测对象的 valueOf() 这个值「原始值:基本类型值」,如果有则基于这个值进行运算,如果不是原始值
-
获取对象的 toString() 把其变为字符串 -> 如果是‘+’处理,则看到字符串了,所以变为字符串拼接
-
如果最后就是想变为数字,则再把字符串转换为数字即可
例如
let n = "10",
m = 10;
console.log(10 + n); // “+”有一边出现了字符串「前提:有两边」会变为字符串拼接 ‘1010’
console.log(+n); // “+”只有一边,把值转换为数字 10
console.log(++n); // “++”和上面一样也是转换为数字,但是还会自身累加一 11
let obj = {};
console.log(10 + obj); //->'10[object Object]'
3. Symbol():创建唯一值
作用:
+ 给对象设置一个Symbol属性:唯一属性 「减少属性处理上的冲突」
+ 宏观管理一些唯一的标识的时候,也是用唯一值
+ ...
例如
new Symbol(); //Uncaught TypeError: Symbol is not a constructor
console.log(Symbol("AA") === Symbol("AA")); //->false
let obj = {
[Symbol()]: 100,
};
console.log(obj[Symbol()]); //->undefined
let x = Symbol();
let obj = {
[x]: 100,
};
console.log(obj[x]); //->100
拓展:很多 JS 的内置原理都是基于这些 Symbol 的属性来处理的
- Symbol.toPrimitive
- Symbol.hasInstance
- Symbol.toStringTag
- Symbol.iterator
- ...