gpt4 book ai didi

javascript - JavaScript 中的字符串原语和字符串对象有什么区别?

转载 作者:IT王子 更新时间:2023-10-29 02:42:07 26 4
gpt4 key购买 nike

摘自MDN

String literals (denoted by double or single quotes) and strings returned from String calls in a non-constructor context (i.e., without using the new keyword) are primitive strings. JavaScript automatically converts primitives to String objects, so that it's possible to use String object methods for primitive strings. In contexts where a method is to be invoked on a primitive string or a property lookup occurs, JavaScript will automatically wrap the string primitive and call the method or perform the property lookup.

所以,我认为(逻辑上)对字符串基元的操作(方法调用)应该比对字符串对象的操作慢,因为在 method 之前任何字符串基元都被转换为字符串对象(额外的工作)应用于字符串。

但在这个 test case 中,结果是相反的。 code block-1code block-2运行得更快,两个代码块如下:

代码块-1:

var s = '0123456789';
for (var i = 0; i < s.length; i++) {
s.charAt(i);
}

代码块 2:

var s = new String('0123456789');
for (var i = 0; i < s.length; i++) {
s.charAt(i);
}

结果因浏览器而异,但 code block-1 总是更快。谁能解释一下,为什么 code block-1code block-2 快。

最佳答案

JavaScript 有两个主要的类型类别,原语和对象。

var s = 'test';
var ss = new String('test');

单引号/双引号模式在功能上是相同的。除此之外,您尝试命名的行为称为自动装箱。所以实际发生的是,当调用包装类型的方法时,原语被转换为其包装类型。简单地说:

var s = 'test';

是一种原始数据类型。它没有方法,只不过是一个指向原始数据内存引用的指针,这解释了随机访问速度要快得多。

例如,当您执行 s.charAt(i) 时会发生什么?

由于 s 不是 String 的实例,JavaScript 将自动装箱 s,它具有 typeof string 到它的包装器类型,String,带有 typeof object 或更准确地说 s.valueOf(s).prototype.toString.call = [object String].

自动装箱行为根据需要将 s 来回转换为其包装器类型,但标准操作非常快,因为您正在处理更简单的数据类型。然而,自动装箱和 Object.prototype.valueOf 有不同的效果。

如果你想强制自动装箱或将原始类型转换为它的包装器类型,你可以使用 Object.prototype.valueOf,但行为是不同的。基于各种各样的测试场景,自动装箱仅应用“必需”方法,而不会改变变量的原始性质。这就是您获得更快速度的原因。

关于javascript - JavaScript 中的字符串原语和字符串对象有什么区别?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17256182/

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