如何检测数组是不是是从迭代器(或数组扩展)创建的
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
调用或循环中的push
ing 创建的数组没有区别。
【讨论】:
通过手动推送,顺便可以知道用proxy(代理数组) @8HoLoN 仅当您在循环之前创建代理而不是普通数组时。关键是你无法事后决定。如果您能够控制创建数组的代码,那么您当然已经知道它是如何创建的以及从什么创建的。 绝对如此,这就是为什么我想知道是否可以使用类似的方法,不是检测推送,而是检测传播运算符。以上是关于如何检测数组是不是是从迭代器(或数组扩展)创建的的主要内容,如果未能解决你的问题,请参考以下文章
React - 数组或迭代器中的每个孩子都应该有一个唯一的“关键”道具