1.基本数据类型
- string
- number
- boolean
- undefined
- null
- array
- object
- symbol
- 区别 null 和 undefined 最简单方法: Number(null)--->0 ; Number(undefined)--->NAN
1.1 空数组([])和空对象({})
-
特别注意的是,空数组([])和空对象({})对应的布尔值,都是true。
if ([]) { console.log(true); } // true if ({}) { console.log(true); } // true -
判断数组
Array.isArray(); 或者 function isArrayFn (o) { return Object.prototype.toString.call(o) === '[object Array]'; } #当然上面也可以用来判断对象 [object Object],字符串 [object String]等常见类型
1.2 null 和 undefined
null == false
// false
null == undefined
// true
~~undefined == false
// true
undefined == false
// false
~~undefined == false, 这里~undefined 是 -1
// true
```
~~NaN == false
// true
'' == false ---> true
'' == 0 ---> true
/^\d*$/.test('') ---> true
'' === false ---> false
~是取反操作符,~~undefined相当于~~Number(undefined);
~ 是JavaScript中的操作符,按位非,~~ 经常用来进行取整和类型转换,他和显示的用Number进行类型转换还是有区别的,比如处理 undefined 的时候。**
~~undefined
// 0
Number(undefined)
// NaN
~~false === 0
~~true === 1
~~undefined === 0
~~!undefined === 1
~~null === 0
~~!null === 1
~~"" === 0
~~!"" === 1
1.20 +
如果要取时间戳,很多时候我们这样写
new Date().getTime()或new Date().valueOf(), 试试加号(+),是不是同样可以 ``` +new Date(); // 1627385156195 Number(new Date) // 1627386100775
new Date()*1
// 1627385336754
```
>`+new Date()` 相当于调用 `Date.prototype.valueOf()` 方法;
+: js在某个数据类型前使用‘+’,目的是为了将该数据类型转换为Number类型,如果转换失败,则返回 NaN;
1.3 隐式转换
在保存进位值的时候,用的并不是 1 和 0 ,而是true 和 false,这是因为隐式类型转换的时候,true会转为1,false会转为0。
1+true // 2
1+false // 1
1.4 小数转换
# 小数转成百分比
0.87 -----> 87%
0.87*1000/10 + '%' 87% 这种情况下是可以的
but:
'2.2'*100000/10 会出现 22000.000000000004
'2.3'*100000/10 会出现 22999.999999999996
1.5 0.1 + 0.2 !== 0.3
0.1 + 0.2 == 0.3 ---> false
0.1 + 0.2 - 0.3 == 0 ---> false
#这是因为js丢失精度问题,IEEE 754 规范:在JavaScript中,所有的Number都是以64-bit的双精度浮点数存储的
-
双精度的浮点数在这64位上划分为3段,而这3段也就确定了一个浮点数的值,64bit的划分是“1-11-52”的模式,具体来说:
- 1.就是1位最高位(最左边那一位)表示符号位,0表示正,1表示负
- 接下去11位表示指数部分
- 最后52位表示尾数部分,也就是有效域部分
JavaScript中0.1+0.2不等于0.3
这个是二进制浮点数最大的问题(不仅 JavaScript,所有遵循 IEEE 754 规范的语言都是如此)