Javascript ';指数';方法性能优化

Javascript ';指数';方法性能优化,javascript,performance,string-parsing,Javascript,Performance,String Parsing,根据JavaScript,通过值传递字符串对象。因此,调用indexOf方法将触发复制内容 在我的例子中,我正在解析一个大字符串以查找数据。我大量使用indexOf查找数据。字符串可能长达100-200KB,每次完整扫描时,我可能需要调用indexOf多达1000次 我担心这会导致不必要地复制字符串污染“内存”,并可能影响性能 我的结论正确吗?如果是这样的话,处理我的任务的正确方法是什么 我可能会使用正则表达式,但现在看起来太复杂了。字符串在Javascript中是一种奇怪的野兽,它们似乎位于基

根据JavaScript,通过值传递字符串对象。因此,调用
indexOf
方法将触发复制内容

在我的例子中,我正在解析一个大字符串以查找数据。我大量使用
indexOf
查找数据。字符串可能长达100-200KB,每次完整扫描时,我可能需要调用
indexOf
多达1000次

我担心这会导致不必要地复制字符串污染“内存”,并可能影响性能

我的结论正确吗?如果是这样的话,处理我的任务的正确方法是什么


我可能会使用正则表达式,但现在看起来太复杂了。

字符串在Javascript中是一种奇怪的野兽,它们似乎位于基本类型和对象之间的中间地带。虽然从技术上来说,它们被认为是原始的,但在许多情况下,由于它们的不变性,它们可以被视为引用

考虑到它们是不可变的,如果将字符串的副本传递给任何函数,我会感到非常惊讶,因为这既昂贵又完全不必要

一种看似简单的方法是将字符串传递给函数,并更改其中一个字符,以查看返回时是否在原始字符串中反映出来。然而,正如前面提到的,字符串的不变性使得这不可能


通过对循环中的两个字符串中的一个执行
indexOf(“a”)
,可以间接测试这一点

要搜索的字符串可能是
“一个”
“一个包含数千个字符的非常长的字符串…”

如果字符串是通过引用传递的,那么时间上应该没有明显的差异。传递值应该是可检测的,因为您必须复制字符串数百万次,短字符串的复制速度应该比长字符串快

但是,正如我所说的,这可能是不必要的,因为引擎很可能会尽可能地优化。

.indexOf()
只是对字符串的搜索,只是在字符串中返回一个数字索引。没有必要复制,也没有复制。这实际上与Javascript中的值/引用没有任何关系。该操作只是返回索引的搜索。根本不需要复制

Javascript中的字符串是不可变的。这意味着它们永远不会被更改,并且字符串中的这些索引始终指向字符串中的同一位置。任何对字符串进行更改的操作都会返回一个新字符串,而保留旧字符串

这允许在实现中进行一些有趣的优化。因为字符串是不可变的,所以可以在引用它的所有代码点之间共享它。每当有人调用函数来修改字符串时,它只返回一个新的字符串对象,该对象是由旧字符串对象加上修改后的字符串对象创建的

如果要将
.indexOf()
中的索引与
.slice()
或类似的内容一起使用,则需要将原始字符串的一部分复制到新的字符串对象中(可能需要使用一些额外的内存)


如果你想自己测试一下,可以在一个大字符串上运行任意多个
.indexOf()
操作,并观察内存使用情况。

字符串原语值的性质在JavaScript中很奇怪。我认为当字符串被传递给函数时,假设字符串原语中所有字节的副本都被复制是不准确的。因为字符串原语是不可变的,所以将这些值(内部)表示为对象引用非常有效。它们的行为类似于原语,但它们的实现类似于objects.js字符串的引用。只需使用indexOf并查看它的性能。如果需要,请稍后优化您的问题是否得到回答?如果是,请选择其中一个答案。如果没有,请描述答案中缺少的内容。