# JS 之变量对象

JavaScript 变量松散类型的本质,决定了它只是在特定时间内保持一个特定值的名字而 已

# 变量类型

  • 基本类型:String、Number、Boolean、Undefined、Null、BigInt、Symbol
  • 引用类型:Object

基本类型存储在栈内存中,数据长度是固定的,即本身无法改变。

引用类型存在堆内存之中,栈内存存放着一个引向该值的地址。这个区别在复制时很显然, 基本类型会在新的栈内存中生成一个副本,而引用类型则在栈内存中存储一个相同的指针, 指向原有的数据。由此引申出深拷贝与浅拷贝

除 Object 以外的所有类型都是不可变的(值本身无法被改变)。

JavaScript 中只有一种数字类型:基于 IEEE 754 标准的双精度 64 位二进制格式的值 (-(253 -1) 到 253 -1)。由此出现BigInt类型,该类型可以用任意精度表示整数,且 可以超出数字的安全整数限制(在数字末尾加 n)。它并没有为整数给出一种特定的类 型。除了能够表示浮点数外,还有一些带符号的值:+Infinity-InfinityNaN (非数值,Not-a-Number)。

Symbol符号类型是唯一的且不可修改的值。

# 对象属性

在 JS 中,对象是一组属性的集合。对象有两种属性:数据属性和访问器属性

数据属性的特性:

  • [[Value]]:属性值
  • [[Writable]]:能否修改属性值
  • [[Enumerable]]:能否通过for in遍历
  • [[Configurable]]:能否删除该属性从而重新定义属性
let person = {}
Object.defineProperty(person, 'name', {
    value: 'homobulla',
    enumerable: false,
    configurable: false,
})
1
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 是不可枚举的。