Javascript 那么字符串对象类型还是基元类型呢?

Javascript 那么字符串对象类型还是基元类型呢?,javascript,Javascript,来自JavaScript:David Flanagan的权威指南 JavaScript类型可以分为两类:基本类型 和对象类型。JavaScript的基本类型包括数字, 文本字符串(称为字符串)和布尔真值(称为 布尔人) 它表示字符串是基元类型。但后来出现了一个示例代码 var s = "hello, world" // Start with some text. s.charAt(0) // => "h": the first character. s.charAt(s.length-1)

来自JavaScript:David Flanagan的权威指南

JavaScript类型可以分为两类:基本类型 和对象类型。JavaScript的基本类型包括数字, 文本字符串(称为字符串)和布尔真值(称为 布尔人)

它表示
字符串
是基元类型。但后来出现了一个示例代码

var s = "hello, world" // Start with some text.
s.charAt(0) // => "h": the first character.
s.charAt(s.length-1) // => "d": the last character.
s.substring(1,4) // => "ell": the 2nd, 3rd and 4th characters.
s.slice(1,4) // => "ell": same thing
s.slice(-3) // => "rld": last 3 characters
s.indexOf("l") // => 2: position of first letter l.
s.lastIndexOf("l") // => 10: position of last letter l.
s.indexOf("l", 3) // => 3: position of first "l" at or after 3

那么字符串是对象类型还是原语呢?基元类型如何具有方法?这不是对象类型属性吗?如果它是两者的某种混合,那么当它是基元时,当它是对象时?

字符串是基元值:

未定义、Null、Boolean、Number或String类型之一的成员

但也有字符串对象,它们是对象而不是原语:

作为标准内置对象实例的对象类型的成员
String
构造函数

基本字符串似乎有属性,但没有

当您使用例如
string.charAt(0)
时,将创建一个字符串对象,其值与您的基本字符串相同。此对象继承自
String.prototype
。调用此字符串对象的
charAt
方法,并在
string.charAt(0)
中返回返回值。然后删除字符串对象

将属性指定给基元字符串时,会发生类似的情况:将属性指定给新字符串对象,而不是基元

一些例子:

var primitiveStr = 'foo',
    objectStr = new String('foo');
typeof primitiveStr; // 'string'
typeof objectStr; // 'object'
typeof primitiveStr.charAt; // 'function'
typeof objectStr.charAt; // 'function'
primitiveStr.foo = objectStr.foo = 123;
typeof primitiveStr.foo; // 'undefined'
typeof objectStr.foo; // 'number'

继续读下去,你会自己找到解释的。另外,这不是一个你应该问的问题,因为你的代码没有问题,只是对语言缺乏理解。建议阅读:Primitve类型也可以有类似对象类型的方法。但您不能将新方法/属性分配给文字基本类型,但可以将新方法/属性分配给文字对象类型。这是primitves和objects之间的一个区别。从@nicael的链接,你甚至可以直接跳到。