2020年6月

原文地址: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()会抛出异常。

- 阅读剩余部分 -