[译]未来的JavaScript记录与元组
原文地址:https://2ality.com/2020/05/records-tuples-first-look.html原文作者:Dr. Axel Rauschmayer
Dr. Axel Rauschmayer最近撰文介绍了还处于Stage1阶段的两个JavaScript新特性:记录和元组。
记录和元组是一个新提案(Record & Tuple,https://github.com/tc39/proposal-record-tuple),建议为JavaScript增加两个复合原始类型:
- 记录(Record),是不可修改的按值比较的对象
- 元组(Tuple),是不可修改的按值比较的数组
什么是按值比较
当前,JavaScript只有在比较原始值(如字符串)时才会按值比较(比较内容):
> 'abc' === 'abc'
true
但在比较对象时,则是按标识比较(by identity),因此对象只与自身严格相等:
> {x: 1, y: 4} === {x: 1, y: 4}
false
> ['a', 'b'] === ['a', 'b']
false
“记录和元组”的提案就是为了让我们可以创建按值比较的复合类型值。
比如,在对象字面量前面加一个井号(#),就可以创建一个记录。而记录是一个按值比较的复合值,且不可修改:
> #{x: 1, y: 4} === #{x: 1, y: 4}
true
如果在数组字面量前面加一个#,就可以创建一个元组,也就是可以按值比较且不可修改的数组:
> #['a', 'b'] === #['a', 'b']
true
按值比较的复合值就叫复合原始值或者复合原始类型。
记录和元组是原始类型
使用typeof可以看出来,记录和元组都是原始类型:
> typeof #{x: 1, y: 4}
'record'
> typeof #['a', 'b']
'tuple'
记录和元组的内容有限制
记录:
- 键必须是字符串
- 值必须是原始值(包括记录和元组)
元组:
- 元素必须是原始值(包括记录和元组)
把对象转换为记录和元组
> Record({x: 1, y: 4})
#{x: 1, y: 4}
> Tuple.from(['a', 'b'])
#['a', 'b']
注意:这些都是浅层转换。如果值树结构中有任何节点不是原始值,Record()和Tuple.from()会抛出异常。