如何检测数组是不是是从迭代器(或数组扩展)创建的

Posted

技术标签:

【中文标题】如何检测数组是不是是从迭代器(或数组扩展)创建的【英文标题】:how to detect if array was created from iterator (or array spread)如何检测数组是否是从迭代器(或数组扩展)创建的 【发布时间】:2021-08-13 04:54:04 【问题描述】:

假设我们有:

const foo = [1,2,3];
const bar = [1,...foo,3];

有没有办法从 bar 知道它是从 foo 中包含的项目创建的?

我想使用代理,但 bar 是使用扩展运算符初始化的,所以我们不能先代理 bar...

【问题讨论】:

你为什么需要知道这些? 问题不是为什么,而是如何。 值就是值,语言不会保留从一个地方分配到另一个地方的“记录”。 @8HoLoN 我们正在尝试挑战您的前提。您不需要知道,如果您尝试这样做,您可能做错了什么。鉴于这是不可能的,如果我们知道您想要实现的目标,我们可以建议一种可行的替代方法。 @8HoLoN 所以截取foo的用法,写成const bar = reactive(() => [1,...foo,3]);。在创建反应式系统时,您要么需要明确,要么使用编译器的帮助。请注意,对于 const foo = 1; const bar = foo + 1;const foo = []; const bar = foo === baz;,您也遇到了同样的问题 - bar 的值中没有任何内容指向 foo 的使用。 【参考方案1】:

不,没有办法做到这一点。 bar 是一个普通数组,通过具有扩展语法的数组字面量创建的数组、concat 调用或循环中的pushing 创建的数组没有区别。

【讨论】:

通过手动推送,顺便可以知道用proxy(代理数组) @8HoLoN 仅当您在循环之前创建代理而不是普通数组时。关键是你无法事后决定。如果您能够控制创建数组的代码,那么您当然已经知道它是如何创建的以及从什么创建的。 绝对如此,这就是为什么我想知道是否可以使用类似的方法,不是检测推送,而是检测传播运算符。

以上是关于如何检测数组是不是是从迭代器(或数组扩展)创建的的主要内容,如果未能解决你的问题,请参考以下文章

React - 数组或迭代器中的每个孩子都应该有一个唯一的“关键”道具

PHP的SPL扩展库对象数组与数组迭代器

使用反向迭代条目的方法扩展 JavaScript 数组原型?

C#迭代器实现

Java:迭代器和数组列表之间的区别

js迭代器iterator