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

javascript字符串类型和字符串对象之间的区别?

百里意智
2023-03-14
问题内容

我一直在纠缠于ECMA-262标准( ECMAScript语言规范, 第三版,如果对此很重要-
在字符串类型/字符串对象的第三版和第五版之间,我没有发现任何区别)。

有件事让我感到困惑:字符串类型和字符串对象之间的区别。是的,我知道 字符串类型 是16位UTF-16单元序列, 字符串对象 是内置对象,其内部
Class 属性设置为“ String”,内部 Value 属性设置为的意义上的区别 字符串类型 的值。

但是,阅读规范后,字符串类型似乎没有公开任何方法。也就是说,它只是一个没有任何其他属性的值。采取以下代码,一切都完全符合预期:

document.writeln(typeof "foo"); // 'string'
document.writeln(typeof new String("foo")); // 'object'

第一种是实际的 String类型 ,第二种是 Object Type (它是 String
类的对象,但其数据类型是object)。但是,看这个:

"foo".charAt(0);

fooStrObj = new String("Foo");
fooStrObj.charAt(0);

它们似乎都公开了相同的功能,但是ECMA-262标准中定义String Type
上没有功能。它公开的所有功能均来自String.prototype对象(并且我看不到任何事实,即 String Type
神奇地公开了ECMA-262标准中String.prototype对象的所有属性和功能)。那么,是否将 字符串类型类型 的值自动提升为具有原始
字符串类型 值作为其内部 Value 属性的 字符串对象

如果将它们完全相同地对待(出于所有意图和目的,它们似乎都一样),为什么要用两种不同的方式来表示 String 呢?


问题答案:

字符串是JS中的值类型,因此它们不能附加任何属性,没有原型等。任何对它们进行访问的尝试都是在技术上执行JS [[ToObject]]转换(实质上是新字符串)

区别的简单方法是(在浏览器中)

a = "foo"
a.b = "bar"
alert("a.b = " + a.b); //Undefined

A = new String("foo");
A.b = "bar";
alert("A.b = " + A.b); // bar

另外,

"foo" == new String("foo")

为true,仅由于==运算符的隐式类型转换而为true

"foo" === new String("foo")

将失败。



 类似资料:
  • 问题内容: 字符串文字和字符串对象的添加有什么区别? 例如 为什么/ 不指向与相同的位置? 问题答案: 因为不是 常量表达式 ,由于和不是,因此其结果不会被插入,即创建另一个对象来表示它,因此引用比较产生。 JLS 3.10.5字符串文字 : 使用String.intern方法,对字符串常量(或更常见的是常量表达式的值(第15.28节)的字符串)进行“ interned”,以便共享唯一的实例。 J

  • 问题内容: 之间有什么区别 和 问题答案: 当你使用字符串文字时,可以将字符串嵌入,但是当你使用时,你将获得一个新的字符串对象。 在此示例中,两个字符串文字均引用相同的对象: 在这里,创建了2个不同的对象,它们具有不同的引用: 通常,应尽可能使用字符串文字表示法。它更易于阅读,并且为编译器提供了优化代码的机会。

  • 问题内容: 空字符串()和空字符串()有什么区别? 这就是我所拥有的: 这是什么意思? 问题答案: 表示将空值分配给。在这种情况下,与相同,将按预期产生。 表示将()或“完全没有值”分配给。因此,这与相同,它将产生一个,因为您无法在Java中对变量(指针或类似物)调用方法。 还有一点,声明 实际上具有与以下功能相同的效果: 鉴于 如前所述,是另一回事。

  • 问题内容: 这些声明之间有何不同? 每种情况下的内存分配如何? 问题答案: 要更正编译错误,请使用以下语句之一替换 下一节将以上陈述相互比较 字符串常量 “ MY PROFESSION”是一个常量,并存储在String池中 是不可变的,即完整的内容无法修改。 字符串的大小/长度是固定的(无法附加) 字符数组 保存String的基础数组的副本(通过)并存储在堆空间中 通过加载单个字符常量在堆栈框架中

  • 本文向大家介绍字符数组和字符串之间的区别,包括了字符数组和字符串之间的区别的使用技巧和注意事项,需要的朋友参考一下 在本文中,我们将了解字符数组和字符串之间的区别。 字符串 他们是不可变的。 一旦它们被定义,就不能被更改。 它指的是一个字符序列,表示为单个数据类型。 它包含了substring()、charAt()等内置函数。 可以使用' + '操作符将字符串追加到一起,从而形成一个新的字符串。

  • 这章我们来着重介绍一下字符串。 刚刚学习Rust的同学可能会被Rust的字符串搞混掉,比如str,String, OsStr, CStr,CString等等…… 事实上,如果你不做FFI的话,常用的字符串类型就只有前两种。我们就来着重研究一下Rust的前两种字符串。 你要明白的是,Rust中的字符串实际上是被编码成UTF-8的一个字节数组。这么说比较拗口,简单来说,Rust字符串内部存储的是一个u