字符串对象?

时间:2011-03-01 15:01:04

标签: javascript

认为字符串是对象有两个原因。首先,您可以通过以下方式创建字符串:

var mystring = new String("asdf");

我的印象是new运算符后面的构造函数必须返回一个对象。其次,字符串似乎有属性和方法。例如:

mystring.toUpperCase();

但是,如果字符串是对象,那么我们期望像下面这样的东西起作用:

function string_constructor() {
    return "asdf";
}

var mystring = new string_constructor();

但它没有,而且我被告知它没有,因为字符串不是对象。字符串对象是否也是如此?无论哪种方式,我怎样才能理解我列出的所有内容?

6 个答案:

答案 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中,字符串有两种形式:

  1. 有一种String语言类型,其中包含"foo"'bar'等值。这些值是原始值。 Read about the String type here

  2. 然后有一个String构造函数。 (构造函数是一个函数对象,用于创建某个“类”(或伪类)的新实例)。所以:new String("foo") 将创建一个新对象(Object类型的值),其中包含原始值“foo”。 Read about the String constructor here

  3. 实际上,您不使用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'(或数组或“简单”对象。)

相关问题