我确实在网上搜索了这个信息,有人说是因为javascript必须创建一个新的字符串对象来存储连接的结果,有些人说没有因为字符串不收集物品。
可能取决于具体情况。例如,如果我有一个像
这样的对象数组 animals["blue_dog","red_dog","yellow_cat","red_bird","green_bird"...]
我有一个带animal
和color
参数的函数,在这个函数中我会像这样访问我的对象:
animals[animal+"_"+color]
。
大部分时间我在绘制文本时都会进行连接,这显然不是每帧都会发生很多次。因此,即使它变成垃圾,也是微不足道的。但是当使用连接作为对象的密钥时,由于循环,这种连接可能每帧发生一千次,然后这可能成为一个问题。
答案 0 :(得分:2)
执行animals[color + "_" + animal]
之类的操作会为访问对象创建临时值。该临时值将由垃圾收集器或块/函数调用结束(依赖于实现)收集。
我的假设(基于我自己使用编译器的经验)是因为结果不存储在变量中,所以它将被放置在堆栈上并在函数完成后释放。但是,这又取决于引擎的编写方式。
我绝不是编译器方面的专家。
答案 1 :(得分:1)
可能会也可能不会,取决于编译器的最佳程度。
此a + b + c
为(a + b) + c
,因此您有两个连接。 (a + b)的结果将是一个临时对象(此处为字符串)。那暂时是垃圾。
对于给定的表达式,此表单a.concat(b,c)
在概念上更好。它原则上不需要中间临时工。
答案 2 :(得分:1)
以我的经验,串联字符串肯定会产生垃圾。我有一个场景,我在一张大桌子上有很多单元格,每个单元格可以分配一个不同的CSS类(可能是30种不同组合的组合)。这样做是正常的:
const class = group + empty + active;
会产生很多垃圾。我创建了一个记住的函数,该函数接收一个位掩码作为参数,该掩码将产生类字符串并以这种方式消除了垃圾。
此回复很好地列出了应避免的事项: