认为字符串是对象的原因有两个。首先,您可以通过以下方式创建一个字符串:
var mystring = new String("asdf");
我的印象是 new 运算符后面的构造函数必须返回一个对象。其次,字符串似乎有属性和方法。例如:
mystring.toUpperCase();
但是,如果字符串是对象,那么我们希望像下面这样的东西可以工作:
function string_constructor() {
return "asdf";
}
var mystring = new string_constructor();
但事实并非如此,有人告诉我事实并非如此,因为字符串不是对象。那么字符串是不是对象呢?而且,无论哪种方式,我怎样才能理解我列出的所有内容?
谈到语言类型,字符串是 values 的字符串类型。
语言有五种primitive types ,它们是 String、Number、Boolean、Null 和 Undefined。 p>
有 String 对象(也用于 Number 或 Boolean),它们被称为 primitive wrappers,它们是在您使用与它们相关联的构造函数时创建的,例如:
typeof new String('foo'); // "object"
typeof 'foo'; // "string"
但是不要与它们混淆,您很少需要使用原始包装器,因为即使原始值不是对象,您仍然可以访问它们的继承属性,例如,在字符串,你可以访问String.prototype
的所有成员,例如:
'foo'.indexOf('o'); // 2
这是因为属性访问器(在本例中为点)临时将原始值转换为对象,以便能够解析原型(prototype)链中的 indexOf
属性。
关于您问题中的构造函数,如您所知,它不会返回字符串。
使用new
运算符调用的函数返回一个隐式值,它是一个继承自该函数的prototype
的新对象,例如:
function Test () {
// don't return anything (equivalent to returning undefined)
}
new Test() instanceof Test; // true, an object
如果从构造函数返回一个对象,那么新创建的对象(构造函数中的this)将丢失,因此显式返回的对象将从函数中出来:
function Test2() {
return {foo: 'bar'};
}
new Test2().foo; // 'bar'
但在原始值的情况下,它们只是被忽略,并且隐式返回构造函数中的新对象(有关更多详细信息,请查看 [[Construct]]
内部操作,(参见步骤 9 和 10))。