微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

关于包含 1...N 的数组的 Javascript 异常行为使用扩展运算符

如何解决关于包含 1...N 的数组的 Javascript 异常行为使用扩展运算符

在 Javascript 中,我通过扩展运算符创建了这个简单的升序数组。

[...Array(5).keys()]
// printed list
[0,1,2,3,4]

但我只是简单地添加了 1 并生成了这个意想不到的数组。 (我只是预计会出错)

[...Array(5).keys() + 1] 
// printed list
["[","o","b","j","e","c","t"," ","A","r","a","y","I","]","1"]

我想知道是什么导致了这种行为。

解决方法

首先,计算 ... 右侧的表达式。也就是说,Array(5).keys() + 1 被评估,然后该评估的结果被传播。对表达式进行分组可能会使事情更清楚一些:

[...(Array(5).keys() + 1)] 

所以,上面,我们从计算Array(5).keys() + 1的结果开始。 + 运算符在原始操作数之间起作用。当您执行 Array(5).keys() 时,您会返回一个未归类为原始类型的迭代器。因此,JS 会尝试将其转换为原始类型。当 JS 尝试在此上下文中将迭代器转换为原语时,它会尝试:

  1. 调用迭代器的 Symbol.toPrimitive 方法,因为它不存在,它继续尝试下一步
  2. 调用迭代器的 .valueOf() 方法。这成功了,但它返回了迭代器,它不是一个原语,所以我们进入下一步
  3. 调用 .toString() 方法。这会导致非对象类型(即:字符串),因此这是成功的。

当迭代器的 .toString() 方法被调用时,它被评估为 "[object Array Iterator]"。当它与数字 1 相加时,我们将字符串与数字连接(而不是相加),给出:

[..."[object Array Iterator]1"]

由于字符串是可迭代的,spread 语法将使用字符串的迭代器循环遍历字符串中的代码点,从而使字符串的每个字符都成为它自己的元素:

["[","o","b","j","e","c","t"," ","A","r","a","y","I","]","1"]

为了给你的迭代器中的每一项添加一个,你可以使用 Array.from() ,它可以接受一个迭代器,并对每个元素应用一个映射函数:

const res = Array.from(Array(5).keys(),i => i+1);
console.log(res);

由于 Array.from() 的参数不必是迭代器,您也可以使用 Array(5) 代替并使用索引作为要添加到的值:

const res = Array.from(Array(5),(_,i) => i+1);
console.log(res);

,

当您添加 + 1 时,它将处理从 ...Array(5).keys() 返回的字符串。 看看这些额外的例子:

console.log(Array(5).keys()) 输出: [对象数组迭代器]

console.log(Array(5).keys() + 1) 输出: [对象数组迭代器]1

console.log(...Array(5).keys() + 1) 输出: [目标ArrayIterator]1

,

就在您输入 [...(Array(5).keys() + 1)] 时,这意味着 + 的优先级高于 ...

,

阅读有关使用不同运算符时 JavaScript 中类型转换的更多信息

为了简化答案,如果你尝试做i,你会得到long [] primes = new long[10001]; int j = 0; for (long i = 2; i < 1000000000000000L && j < 10001; i++) { boolean isPrime = true; for (long k = 2; k <= i / 2; k++) { if (i % k == 0) { isPrime = false; break; } } if (isPrime) { primes[j] = i; j++; } } System.out.println(primes[10000]); ,它不能转换为数字,JS将104743 转换为字符串,您可以通过执行 Object() + 1,

获得相同的结果

在您的示例中,"[object Object]1" 是一个继承自 Array Iterator 的对象,因此当转换为字符串时,您会得到 Object(),当然通过加 1 会得到 String(Object()),它是现在是一个字符串,如果您使用扩展运算符,它将被拆分为字符,这是您示例的预期结果

相反,要加 1,您可以执行以下操作:Array(5).keys()

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。