当前位置: 首页 > 面试题库 >

字符串基元和JavaScript中的String对象有什么区别?

蒋正平
2023-03-14
问题内容

取自MDN

字符串文字(用双引号或单引号引起来)和非构造函数上下文中从字符串调用返回的字符串(即,不使用new关键字)是原始字符串。JavaScript自动将基元转换为String对象,以便可以将String对象方法用于基元字符串。在要在原始字符串上调用方法或发生属性查找的上下文中,JavaScript将自动包装字符串原始并调用该方法或执行属性查找。

因此,我认为对字符串基元进行的(逻辑上)操作(方法调用)应比对字符串对象进行的操作慢,因为在将字符串基元应用到字符串之前,任何字符串基元都将转换为字符串对象(额外工作)method

但是在这个测试案例中,结果是相反的。所述
码块1 的运行速度比较快 码块-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);
}

结果在浏览器中会有所不同,但是 代码块1 总是更快。谁能解释一下,为什么 代码块1代码块2 快。


问题答案:

JavaScript有两个主要的类型类别,即素数和对象。

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

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

var s = 'test';

是原始数据类型。它没有方法,只不过是指向原始数据存储器引用的指针,因此可以解释更快的随机访问速度。

那么当您举个s.charAt(i)例子时会发生什么呢?

由于s不是一个实例String,JavaScript就自动箱s,里面有typeof string它的包装类型,Stringtypeofobject或更精确地s.valueOf(s).prototype.toString.call =[object String]

自动装箱行为会s根据需要来回转换为其包装器类型,但是由于您要处理的是更简单的数据类型,因此标准操作的速度非常快。但是自动装箱并Object.prototype.valueOf有不同的效果。

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



 类似资料:
  • 问题内容: 以下两个语句之间有什么区别? 问题答案: 显式创建对象的新的和参照不同的实例;如果有一个实例,可以从字符串常量池中重用一个实例。 参照区别是什么意思 检查以下代码段: 在两种引用类型上的是引用标识比较。不一定是两个对象。在引用类型上使用通常是错误的;大多数时候需要使用它来代替。 但是,如果出于任何原因需要创建两个而不是字符串,则可以使用构造函数。但是,需要再次说,这是非常特殊的,并且很

  • 问题内容: 谁能举例说明Javascript对象和JSON对象之间的区别? 问题答案: Javascript 对象 是Javascript 中的数据类型-仅在Javascript中才有意义。通常,您会看到这样的Javascript 对象文字 : JSON 字符串 是一种数据交换格式,它只不过是一串以特定方式格式化的字符(为了使不同的程序相互通信)。因此,它可以存在于Javascript或其他语言中

  • 问题内容: 我正在使用一个返回字节字符串的库,我需要将其转换为字符串。 尽管我不确定有什么区别-如果有的话。 问题答案: 假设使用Python 3(在Python 2中,这种区别的定义不太明确)-字符串是字符序列,即unicode码点;这些是一个抽象概念,不能直接存储在磁盘上。毫无疑问,字节字符串是字节的序列- 可以 存储在磁盘上的东西。它们之间的映射是一种 编码 -其中有很多(并且无限可能)-并

  • 问题内容: 我一直在纠缠于ECMA-262标准( ECMAScript语言规范, 第三版,如果对此很重要- 在字符串类型/字符串对象的第三版和第五版之间,我没有发现任何区别)。 有件事让我感到困惑:字符串类型和字符串对象之间的区别。是的,我知道 字符串类型 是16位UTF-16单元序列, 字符串对象 是内置对象,其内部 Class 属性设置为“ String”,内部 Value 属性设置为的意义上

  • 问题内容: 和之间的区别是什么? 问题答案: parseInt(“123qwe”) 返回123 退货 换句话说,解析到第一个非数字并返回其解析后的内容。想要将整个字符串转换为数字,也可以是浮点BTW。 编辑#2:关于用例:已经在两行之间写了一些。使用的情况下,您间接要检查给定的字符串完全代表一个数值,浮点或整数。并没有那么严格,因为它们只是沿解析并在数值停止时停止(基数!),这在您需要在前面“如果

  • 问题内容: 我应该如何用Java 声明方法? 像这样: 或像这样: 和如果有的话,实际上有什么区别? 问题答案: 我应该如何在Java中声明main()方法? 和在内部同样的事情,即,字符串的数组。区别在于,当您使用varargs参数()时,可以像下面这样调用方法: 并且当您将参数声明为String数组时, 必须以 这种方式调用: 和…(如果有)之间到底有什么区别? 约定是用作主要的方法参数,但也