gpt4 book ai didi

javascript - 为什么对象引用相等性没有比字符串相等性快得多?

转载 作者:行者123 更新时间:2023-11-28 17:17:59 26 4
gpt4 key购买 nike

只要有选项卡开关或类似的结构,我就会看到这种模式:

const tabs = {
FIRST: 'FIRST',
SECOND: 'SECOND',
}

const getActiveClassName = current => activeTab === current ? 'active' : ''

...

const activeTab = tabs.FIRST

<button className={getActiveClassName(tabs.FIRST)}/>
<button className={getActiveClassName(tabs.SECOND)}/>

我认为在字符串比较中逐字母进行比较效率一定很低,因此我编写了一个测试并将其与对象相等进行比较,希望比较引用会更快:

const tabs = {
FIRST: {},
SECOND: {},
}

The result is that there is almost no difference. Why?

enter image description here

The JSPerf test is here.

最佳答案

字符串比较并不总是需要逐个字母进行。

字符串不是作为原始数据值实现的(像其他基本类型一样),而是实际上是对其(不可变)内容的引用。这一点以及它们不可变的事实允许在您的示例中进行一些优化:

  • 已知引用相同内容内存的两个字符串是相等的。如果您分配 activeTab = tabs.FIRST 然后比较 activeTab === tabs.FIRST 我敢打赌,只会比较引用。
  • 两个不相等的字符串仅比较直到区分它们的第一个字母为止。比较 "First"=== "Second" 只需访问一个字母。
  • string literals are typically interned ,当引擎知道它确实比较两个内部字符串(不是动态构建的字符串)时,它只需要比较它们的引用。对驻留字符串内容的两个不同引用意味着两个不同的内容,因为具有相同内容的驻留字符串将共享它们的内存。因此,即使您的 activeLongString 也可以通过常量比较来与 longStrings 中的其他常量区分开来。

关于javascript - 为什么对象引用相等性没有比字符串相等性快得多?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53035218/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com