数据类型
July 6, 2022
基础类型 #
Symbol #
符号类型,跟其他语言(ruby, racket 等)里的 Symbol 不一样
表示 唯一 标识符,创建即唯一
可用作对象的属性 key
对象的属性 key 只能是 string 或 symbol 类型,其他类型的值会被转为 string 类型
// id is a symbol with the description "id"
let id = Symbol("id");
let id1 = Symbol("id")
id !== id1
Symbol 不会被自动转为字符串,可以通过 toString() 方法进行转换
通常用于为第三方库的对象添加 隐藏 属性,而不对其他使用者造成影响
for in 遍历不会遍历 Symbol,Object.keys() 亦如是
Object.assign() 会 copy string 和 symbol 属性
Global Symbol #
用途:全局唯一标识符
name 一样,即为同一个 Symbol
// read from the global registry
let id = Symbol.for("id"); // if the symbol did not exist, it is created
// read it again (maybe from another part of the code)
let idAgain = Symbol.for("id");
// the same symbol
alert( id === idAgain ); // true
System Symbol #
例如: Symbol.iterator
Number #
二进制 #
以 0b 或 0B 开头的数字,ECMA2015 新增,有兼容性问题
八进制 #
0o 或 0O 开头的数字,ECMA2015 新增,有兼容性问题
也可以直接以 0 开头,如果以 0 开头的后面的所有的数字都比 8 小,则按 8 进制解析,否则按 10 进制解析
十六进制 #
以 0x 或 0X 开头的数字
一位 16 进制数,可以用 4 位二进制数表示,例如:\( (1110 0101)_2 = (E5)_{16}\)
BigInt #
表示任意精度的整数,以 n 结尾,例如:123456789123456789n,0o777777777777n
引用类型 #
WeakMap1 #
相比较Map 而言, WeakMap 不会阻塞垃圾收集,对内存友好
key 必须是对象,用于给对象添加额外的数据,当对象无引用时,添加的额外数据也应该同步被删掉
let john = { name: "John" };
let weakMap = new WeakMap();
weakMap.set(john, "...");
john = null; // overwrite the reference
// john is removed from memory!
// weakMap 为空
// 若为 Map, Map 不会为空
Map #
- key 的顺序不会自动排序,始终保留其插入时的相对顺序
- key 可以是任意数据类型
WeakSet #
只能向其中添加对象,而不是原始值
WeakMap 和 WeakSet 都不支持迭代,不支持获取当前的所有值
be an “additional” storage of data for objects which are stored/managed at another place