数据类型
基本类型
- null 空值
- undefined 未定义
- number 数值
- string 字符串
- boolean 布尔值
- symbol 符号
- bigInt
null
从逻辑上来看,null值表示一个空指针对象,而这也正是使用typeof操作符检测null值时会返回“object”的原因 — 红宝书
typeof null === "object" // trueundefined
-
未初始化的变量会自动赋予undefined, 建议还是显示初始化
-
typeof 对 undefined 和 undeclared(未声明) 变量都返回 undefined
number
NaN
not a number, 数学运算的操作数不是数字类型就无法返回一个有效的数字,这时返回值未NaN.
-
和自身不相等
-
使用Number.isNaN()判断一个值是否为NaN
let a = 1 / 'a' // NaNa == NaN // falsea === NaN // falsea !== a // truelet b = 'olu'Number.isNaN(b) // false
Infinity 无穷数
如果某个计算得到的数值结果超过了JavaScript可以表示的范围,就会转换为一个特殊的无穷值,有正无穷大和负无穷大
-
isFinite() 检测是否为常规数字
1 / 0 // Infinity1 / -0 // -Infinity-1 / 0 // -Infinity-1 / -0 // InfinityInfinity / Infinity // NaN
零值
-
加法和减法运算不会得到负零
0 / -1 // -00 * -1 // -0let a = -0a.toString() // 0JSON.parse(a) // 0
有些数据需要数字的符号位去表示特殊信息,比如运动方向
-
SameValue 和 SameValueZero
- 在判断
+0、-0和NaN时,SameValue和===表现不一样,ES6中的Object.is内部使用了SameValue,includes则使用了SameValueZero
NaN == NaN // falseNaN === NaN // falseObject.is(NaN, NaN) // true => SameValue(NaN, NaN)+0 === -0 // trueObject.is(+0, -0) // false => SameValue(+0, -0)[+0].includes(-0) // true => SameValueZero(+0, -0) - 在判断
-
0.1 + 0.2 !== 0.3
- 二进制浮点数中的0.1和0.2并不是十分精确
- 机器精度 Number.EPSILON, 可以比较两个数字是否相等(在指定的误差范围内)
function numbersCloseEnoughToEqual(n1, n2) {return Math.abs(n1 - n2) < Number.EPSILON}
string
访问字符
历史原因,下面这种str[2]写法在某个老版本的IE中是不合法的,现在貌似没有这个问题了,放心使用吧
- 区别: 如果找不到字符,[]返回undefined,charAt()返回空字符串
let str = "olu cool"str[2] // "u"str.charAt(2) // "u"str[9] // undefinedstr.charAt(9) // ""使用for..of遍历字符
let str = "olu cool"for(let item of str) { console.log(item)}字符串不可更改
字符串的成员函数不会改变其原始值,而是创建并返回一个新的字符串,数组的成员函数都是在原始值上进行操作
let str = "olu cool"str[2] = "aha"str // "olu cool"boolean
fasly 假值
- false
- null
- undefined
- ""
- 0
- NaN
truthy 真值
-
除了上述
fasly的值,包括{}、[]、“false”、“0” -
逻辑运算符(&&、!、!!)的运算值看其是真值/假值
-
Boolean()转型函数可以将其他类型的值转换为布尔值,具体转换为true/false的规则取决于数据类型和实际的值
-
不同类型与布尔值之间的转换规则:
| 数据类型 | 转换为true的值 | 转换为false的值 |
|---|---|---|
| boolean | true | false |
| string | 非空字符串 | ""(空字符串) |
| number | 非零数值(包括无穷值) | 0、NaN |
| object | 任意对象 | null |
| undefined | N/A | undefined |
引用类型
object 对象
手写对象属性值迭代器
const obj = { name: 'olu', age: 18, hobby: 'music'}
Object.defineProperty(obj, Symbol.iterator, { writable: false, enumerable: false, configurable: true, value:() => { let index = 0 let keys = Object.keys(obj) return { next: () => { return { done: index >= keys.length, value: obj[keys[index++]] } } } }})
for (const val of obj) { console.log(`属性值为:${val}`);}