这里有几件事情需要考虑。
给出以下代码:
messages.splice(messages.indexOf('hello'), 1)
messages = messages
这里的操作是:
- 在数组中查找字符串
"hello"
的 第一个 出现位置
- 根据找到的索引,从数组中删除该元素。
这里的假设是 "hello"
必须存在,否则代码将会删除数组的 最后一个 元素(因为 indexOf
返回 -1
)。
因此,原始数组被改变了:这取决于上下文,有时候直接修改原数组可能更好,而不是将整个数组复制到新数组中;否则,通常最好避免对数组进行这样的修改。
所以。如果你想要确切地实现这种行为,可能这是你能得到的最佳代码。例如,看看filter的示例:
messages = messages.filter(message => message !== "hello")
这里的操作是:
- 过滤掉所有等于
"hello"
的元素
- 返回一个新的不包含这些元素的数组
因此,它与原始代码有很大的不同:首先,它总是循环整个数组。如果您有数千个元素,即使在第二个索引处只有一个
"hello"
,它也会遍历所有元素。也许这是您想要的,也可能不是。如果元素是唯一的,例如id,则可能希望在找到它后停止。
其次,它返回一个新数组。通常情况下,这通常比改变数组更好,但在某些情况下,将其改变而不是创建新数组可能更可取。
因此,如果您想要改变原始数组,最好坚持使用原始代码。
如果您不关心(例如
push
的示例),我认为在svelte的开发人员的意图中,您的代码大致转化为:
let i = messages.indexOf("hello")
messages = [...messages.slice(0, i), ...messages.slice(i + 1)]
(仍然假设有一个“hello”消息,并且您只对第一次出现感兴趣。)
很遗憾,JS没有更好的语法来处理切片。