在我发现常见/最新的 Javascript 实现使用字符串实习来提高性能(常见的 JavaScript 实现是否使用字符串实习?)之后,我认为===
字符串会获得恒定的 O(1) 时间。所以我对这个问题给出了错误的答案:
由于根据该问题的 OP 它是 O(N),因此将字符串输入加倍会使相等所需的时间加倍。他没有提供任何 jsPerf,因此需要进行更多调查,
所以我使用字符串实习的场景是:
var str1 = "stringwithmillionchars"; //stored in address 51242
var str2 = "stringwithmillionchars"; //stored in address 12313
一旦假设在内存的地址 201012 中,“stringwithmillionchars”将被存储,并且 str1 和 str2 都将“指向”该地址 201012。然后可以使用某种散列来确定该地址以映射到内存中的特定位置。
所以做的时候
"stringwithmillionchars" === "stringwithmillionchars"
看起来像
getContentOfAddress(51242)===getContentOfAddress(12313)
或者201012 === 201012
这将花费 O(1)/恒定时间
JSPerfs/性能更新:
即使字符串长 16 倍,JSPerf 似乎也显示恒定时间?请看一看:
http://jsperf.com/eqauility-is-constant-time
上面的字符串可能太小了:这可能显示线性时间(感谢 sergioFC)字符串是用循环构建的。我尝试了没有功能 - 仍然是线性时间/我改变了一点http://jsfiddle.net/f8yf3c7d/3/。
根据https://www.dropbox.com/s/8ty3hev1b109qjj/compare.html?dl=0(sergioFC 制作的 12MB 文件),当你有一个字符串并且无论 t1 有多大,你已经用引号分配了值和 t2 是(例如 5930496 个字符),它需要 0-1 毫秒/即时时间。
似乎当您使用 for 循环或函数构建字符串时,该字符串不会被保留。因此,只有当您直接分配带有引号的字符串时才会发生实习var str = "test";