根据Is JavaScript a pass-by-reference or pass-by-value language?,JavaScript按值传递字符串对象。因此,调用indexOf
方法将触发复制内容。
就我而言,我正在解析一个大字符串以查找数据。我大量使用indexOf
查找数据。字符串可以长达100-200KB,每次完整扫描我最多可能需要调用indexOf
1000次。
恐怕这会导致不必要的复制字符串污染“内存”,并可能影响性能。
我的结论正确吗?如果是这样,处理我的任务的正确方法是什么?
潜在地,我可以使用正则表达式,但此刻看起来太复杂了。
最佳答案
字符串是Javascript中的一种奇怪的野兽,它们似乎位于原始类型和对象之间的中间地带。从技术上讲,它们被认为是原始的,但由于它们的不变性,在很多情况下都可以将它们视为参考。
考虑到它们是不可变的,如果将字符串的副本传递给任何函数,我会感到非常惊讶,因为这既昂贵又完全不必要。
一种看似简单的查找方法是将字符串传递给函数并更改其字符之一,以查看返回时是否反映在原始字符串中。但是,如上所述,字符串的不变性使之成为不可能。
通过在数百万次循环中对两个字符串之一执行indexOf("a")
,可以间接测试该字符串。
要搜索的字符串为"a"
或"a very long string containing many thousands of characters ..."
。
如果字符串是通过引用传递的,则时间应该没有明显差异。按值传递应该是可检测的,因为您必须将字符串复制数百万次,而短字符串的复制速度要比长字符串的复制速度快。
但是,正如我所说,由于引擎很可能已尽可能优化,因此可能没有必要。
关于javascript - 'indexOf'方法性能优化,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/29838311/