JavaScript是否在函数过滤器()中缓存对Object.keys()的调用,every()等。?

JavaScript是否在函数过滤器()中缓存对Object.keys()的调用,every()等。?,javascript,Javascript,重复检查every(),filter(),any()等函数中的内容时,如果在变量中缓存对Object.keys()的调用,是否会影响性能?在这种情况下,JS引擎是否执行内联缓存 X={/*…*/}; t=[/*…*/]; f=key=>{/*…*/};//以某种方式变换X的键 //我们想检查t的所有元素是否都是X的变换键 keys=Object.keys(X)、map(f); result=t.every(a=>keys.includes(a));//Object.keys(X).map(f).

重复检查
every()
filter()
any()
等函数中的内容时,如果在变量中缓存对
Object.keys()
的调用,是否会影响性能?在这种情况下,JS引擎是否执行内联缓存

X={/*…*/};
t=[/*…*/];
f=key=>{/*…*/};//以某种方式变换X的键
//我们想检查t的所有元素是否都是X的变换键
keys=Object.keys(X)、map(f);
result=t.every(a=>keys.includes(a));//Object.keys(X).map(f).includes(a));/!Object.keys(X).包括(a));//丢弃t中不是X中键的元素

答案将影响我的编码实践,我更愿意使用第二个更紧凑的版本,因为它可以在一行lambdas中使用,并且在不跳转到定义的情况下更容易查看。

除非您的代码执行数千次操作,否则这无关紧要。但是,进行函数调用(到
Object.keys()
)并在实例化新数组的过程中,总是会比不这样做使用更多的资源

在几乎所有情况下,代码的可理解性和可维护性比最佳组合更重要


不依赖JavaScript运行时内假定的优化行为也是一个非常好的主意。这些可能会改变。只需相信维护运行时的人将性能作为他们的全职工作就可以了。

一般来说,Javascript永远不会缓存任何不能保证稳定的东西。
X
的内容可能在调用
Object.keys
之间发生变化,因此缓存此操作可能会导致不正确的结果。FWIW,这可能首先像
t.every(k=>X.hasOwnProperty(k))
一样写入…!?您可以直接测试对象是否具有属性,不需要将其所有键提取到列表中,然后搜索列表。因此,大多数这类问题一开始都没有意义,只是一个糟糕算法的标志。在我看来,应该缓存它,否则在内容动态变化的情况下可能会导致错误的结果。比方说,你有一个数组,你在数组中搜索一些东西。如果它缓存了您的搜索,那么当数组内容更新时,它将返回错误的结果。这只是我的理论,我不知道正确的答案。我也将遵循线程。是的,这是一个很好的观点:缓存引入了一种复杂性,可能成为难以发现的bug的滋生地。这不是吹嘘代码有多短,而是维护和阅读代码对我来说有多容易@deceze是的,thx,这个例子是我脑子里想不出来的,但是如果我必须,例如,映射键,那么它是有意义的,*嗯,“关心性能是某人的工作”也不是编写效率极低的Javascript代码的借口…@deceze当然,但总的来说,算法质量通常更重要。无论如何,这种细粒度的挑剔通常不是通向好代码的正确途径。