# JS 之变量对象
JavaScript 变量松散类型的本质,决定了它只是在特定时间内保持一个特定值的名字而 已
# 变量类型
- 基本类型:String、Number、Boolean、Undefined、Null、BigInt、Symbol
- 引用类型:Object
基本类型存储在栈内存中,数据长度是固定的,即本身无法改变。
引用类型存在堆内存之中,栈内存存放着一个引向该值的地址。这个区别在复制时很显然, 基本类型会在新的栈内存中生成一个副本,而引用类型则在栈内存中存储一个相同的指针, 指向原有的数据。由此引申出深拷贝与浅拷贝。
除 Object 以外的所有类型都是不可变的(值本身无法被改变)。
JavaScript 中只有一种数字类型:基于 IEEE 754 标准的双精度 64 位二进制格式的值
(-(253 -1) 到 253 -1)。由此出现BigInt
类型,该类型可以用任意精度表示整数,且
可以超出数字的安全整数限制(在数字末尾加 n)。它并没有为整数给出一种特定的类
型。除了能够表示浮点数外,还有一些带符号的值:+Infinity
,-Infinity
和
NaN
(非数值,Not-a-Number)。
Symbol
符号类型是唯一的且不可修改的值。
# 对象属性
在 JS 中,对象是一组属性的集合。对象有两种属性:数据属性和访问器属性
数据属性的特性:
- [[Value]]:属性值
- [[Writable]]:能否修改属性值
- [[Enumerable]]:能否通过
for in
遍历 - [[Configurable]]:能否删除该属性从而重新定义属性
let person = {}
Object.defineProperty(person, 'name', {
value: 'homobulla',
enumerable: false,
configurable: false,
})
2
3
4
5
6
访问器属性:
- [[Enumerable]]:同上
- [[Configurable]]:同上
- [[Get]]:读取属性时调用的函数
- [[Set]]:写入属性时调用的函数
# Map Set WeakMap WeakSet
# Map
Map 对象保存键值对,并且能够记住键的原始插入顺序。任何值(对象或 者原始值 (opens new window)) 都可以 作为一个键或一个值。
该类型和 Object 相比优点在于:默认不包含任何键(即所谓属性值),键可以是任意值, 键数量通过 Map.size()直接获取,键可以直接迭代,在频繁增删键值对的场景下表现更好 。
# WeakMap
相比于 Map,该对象的键必须是对象,键对象为“弱引用”,利于垃圾回收,但该键是不 可枚举的。
# Set
可以存储任何类型且值唯一的特殊“数组”
WeakSet
相比于 Set,集合中必须是对象,集合中对象的引用为弱引用,利于垃圾回收
,WeakSet
是不可枚举的。