gpt4 book ai didi

javascript - 为什么扩展语法会将我的字符串转换为数组?

转载 作者:行者123 更新时间:2023-12-03 09:30:44 24 4
gpt4 key购买 nike

为什么扩展语法会将我的字符串转换为数组?

var v = 'hello';
var [, ...w] = v; // ["e", "l", "l", "o"]

为什么是 w不是字符串?

最佳答案

Spread syntax (实际上是 RobG 所指出的标点符号)允许将可迭代对象扩展到更小的位。由于字符串是可迭代的(它们在内部是字符数组,更具体地说是表示字符的有序整数序列),它们可以传播到单个字符中。
接下来,destructuring assignment对数组执行解包和分组扩展值。由于您用 , 省略了字符数组的第一个元素并且不分配引用,它丢失了,其余的可迭代对象被保存到 w , 散布成它的各个部分,字符数组的单个字符。

该操作的具体语义在 ECMAScript 2015 Specification 中定义。由 ArrayAssignmentPattern : [ Elisionopt AssignmentRestElement ] 生产:

12.14.5.2 Runtime Semantics: DestructuringAssignmentEvaluation

with parameter value

[...]

ArrayAssignmentPattern : [ Elisionopt AssignmentRestElement ]

  1. Let iterator be GetIterator(value).
  2. ReturnIfAbrupt(iterator).
  3. Let iteratorRecord be Record {[[iterator]]: iterator, [[done]]: false}.
  4. If Elision is present, then
    a. Let status be the result of performing IteratorDestructuringAssignmentEvaluation of Elision with iteratorRecord as the argument.
    b. If status is an abrupt completion, then
        i. If iteratorRecord.[[done]] is false, return IteratorClose(iterator, status).
        ii. Return Completion(status).
  5. Let result be the result of performing IteratorDestructuringAssignmentEvaluation of AssignmentRestElement with iteratorRecord as the argument.
  6. If iteratorRecord.[[done]] is false, return IteratorClose(iterator, result).
  7. Return result.

这里,Elision 是指使用一个或多个逗号 ( ,) 展开时省略的元素,顾名思义,与省略的音节相当,AssignmentRestElement 指的是将接收展开和解构值的目标, w在这种情况下。
这首先从内部 @@iterator 获取对象的迭代器。方法和步骤通过该迭代器,跳过 IteratorDestructuringAssignmentEvaluation中的省略产生式省略的宽度指示的许多元素.完成后,它将单步执行 AssignmentRestElement 产生式的迭代器,并分配一个包含所有展开值的新数组——这就是 w是。它接收展开的单字符数组,解包以排除第一个字符。 @@iterator从中获得迭代的方法是 well-known Symbol并且为一个对象改变它可以改变它的迭代方式,如 Emissary's answer .具体来说, @@iterator method for String 的默认实现如下:

21.1.3.27 String.prototype [ @@iterator ]( )

When the @@iterator method is called it returns an Iterator object (25.1.1.2) that iterates over the code points of a String value, returning each code point as a String value.


因此,迭代器允许通过单个代码点或字符串的字符进行迭代——因此扩展字符串将导致其字符数组。

关于javascript - 为什么扩展语法会将我的字符串转换为数组?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44900175/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com