认为字符串是对象有两个原因。首先,您可以通过以下方式创建字符串:
var mystring = new String("asdf");
我的印象是new运算符后面的构造函数必须返回一个对象。其次,字符串似乎有属性和方法。例如:
mystring.toUpperCase();
但是,如果字符串是对象,那么我们期望像下面这样的东西起作用:
function string_constructor() {
return "asdf";
}
var mystring = new string_constructor();
但它没有,而且我被告知它没有,因为字符串不是对象。字符串对象是否也是如此?无论哪种方式,我怎样才能理解我列出的所有内容?
答案 0 :(得分:19)
说到语言类型,字符串类型的字符串是values 。
该语言有五个primitive types, String , Number , Boolean , Null 和未定义。
有String对象(也用于Number或Boolean),它们被称为原始包装,它们是在使用与它们关联的构造函数时创建的,例如:
typeof new String('foo'); // "object"
typeof 'foo'; // "string"
但是不要与它们混淆,你很少需要来使用原始包装器,因为即使原始值不是对象,你仍然可以访问它们的继承属性,例如,字符串,您可以访问String.prototype
的所有成员,例如:
'foo'.indexOf('o'); // 2
这是因为属性访问器(在这种情况下为点)暂时将原始值转换为对象,以便能够在原型链中解析indexOf
属性。
关于你问题中的构造函数,如你所知,它不会返回字符串。
使用new
运算符调用的函数返回一个隐式值,这是一个从该函数的prototype
继承的新对象,例如:
function Test () {
// don't return anything (equivalent to returning undefined)
}
new Test() instanceof Test; // true, an object
如果从构造函数返回对象,则新创建的对象(在构造函数中)将丢失,因此显式返回的对象将出现在函数中:
function Test2() {
return {foo: 'bar'};
}
new Test2().foo; // 'bar'
但是在原始值的情况下,它们被忽略,并且隐式返回构造函数中的新对象(有关详细信息,请查看{{3}内部操作,(见步骤9和10))。
答案 1 :(得分:3)
在JavaScript中,字符串有两种形式:
有一种String语言类型,其中包含"foo"
和'bar'
等值。这些值是原始值。 Read about the String type here
然后有一个String构造函数。 (构造函数是一个函数对象,用于创建某个“类”(或伪类)的新实例)。所以:new String("foo")
将创建一个新对象(Object类型的值),其中包含原始值“foo”。 Read about the String constructor here
实际上,您不使用new String('foo')
表示法,而是使用字符串文字表示法'foo'
。
在JavaScript中,字符串不是对象。它们是原始价值观。但是,存在可用于存储字符串值的String对象,但实际上不使用这些String对象。
答案 2 :(得分:1)
原始字符串的行为类似于JavaScript中的对象,因为在调用对象方法时它们会自动转换为对象:
https://developer.mozilla.org/en/JavaScript/Reference/Global_Objects/String
可以通过创建字符串对象 调用构造函数new String()。 String对象包装了JavaScript 字符串原始数据类型 方法如下所述。全球 函数String()也可以被调用 没有新的前面创造一个 原始字符串。字符串文字 JavaScript是原始字符串。
因为JavaScript自动生成 在字符串原语和。之间转换 字符串对象,你可以调用任何一个 一个String对象的方法 字符串原语。 JavaScript的 自动转换字符串 原始到临时字符串 对象,调用方法,然后 丢弃临时String对象。 例如,您可以使用 字符串上的String.length属性 从字符串创建的原语 字面
答案 3 :(得分:0)
String既是原始类型又是对象类型。想想int,float,char ......它们在Java中有真正的Object类,如Integer,Float和Char。
答案 4 :(得分:0)
String是原始字符串数据类型的包装器。当您执行var s = "My String"
之类的操作时,会在需要时在后台创建String包装器对象。
然而有趣的是typeof s
='字符串'而不是'对象'。谁知道为什么会这样?
答案 5 :(得分:0)
字符串是对象,但您在示例中所做的不是创建新的String。通过使用'new',您将创建一个Object实例,而不是'string'
var F = function() {
return 'c';
};
var a = new String('a');
var b = 'b';
var c = new F();
alert("a is: " + typeof a + ", b is: " + typeof b + ", c is: " + typeof c);
// alerts: a is: object, b is: string. c is: object
对于字符串,不应使用'new'(或数组或“简单”对象。)