Javascript JS中频繁调用函数初始化数组的效率

Javascript JS中频繁调用函数初始化数组的效率,javascript,caching,memory,garbage-collection,Javascript,Caching,Memory,Garbage Collection,我有一些代码可以解析来自网络请求的数百个对象。然后,这段代码将调用一个函数,查看它是否与某个值匹配 即 我的问题是JS如何处理正在创建的“匹配”数组。isMatch函数可能被调用100多次。它是每次都在内存中不断实例化这个数组,还是会自动缓存它?或者,这是否真的是内存的问题,因为数组和GC的大小不同 另外,使用array.includes与使用regex进行实际匹配之间是否存在性能差异 常量是,因此被一次又一次地创建和销毁。如果你有一个固定的列表,在一个更大的范围内声明它,或者直接在isMatc

我有一些代码可以解析来自网络请求的数百个对象。然后,这段代码将调用一个函数,查看它是否与某个值匹配

我的问题是JS如何处理正在创建的“匹配”数组。isMatch函数可能被调用100多次。它是每次都在内存中不断实例化这个数组,还是会自动缓存它?或者,这是否真的是内存的问题,因为数组和GC的大小不同


另外,使用array.includes与使用regex进行实际匹配之间是否存在性能差异

常量是,因此被一次又一次地创建和销毁。如果你有一个固定的列表,在一个更大的范围内声明它,或者直接在isMatch中引用它,或者像isMatchfoo一样将它作为参数传递,list\u OF\u MATCHES

Hmm,我没有任何确凿的证据证明这一点,但我觉得MATCHES数组不会被缓存。再说一次,我也不确定。编译器似乎可以推断,它需要保留此数组的一个副本,而不是多个副本,特别是在多次调用该函数之后。此外…->jsperf.comcont的作用域是函数,因此会一次又一次地创建和销毁。如果您有一个固定列表,请在更广的范围内声明它,或者直接在isMatch中引用它,或者像isMatchfoo、list_OF_Matches那样将其作为参数传递,您确定这不会得到JIT优化吗?我不知道我自己,但似乎是可以的。如果它是一个一直在创建的数组,而且总是一样的,从来没有变异过,那么它似乎可以被优化为只创建一次,而不是GC'd。@VLAZ是的,我希望JS会自动处理它,但这不是一个关于特定供应商的JS引擎和JIT编译的问题。就JavaScript而言,const的作用域是有限的,并且会不断地被重建。如果有人制作了一个更高效的编译器,这很酷,但从技术上来说,这不是问题的一部分。
(1..100+){
    isMatch(foo);
}

function isMatch(foo) {
    const matches = ["apple", "orange", "strawberry"];
    return matches.includes(foo);
}