Javascript 字符串是对象吗?

Javascript 字符串是对象吗?,javascript,Javascript,这里有两个理由认为字符串是对象。首先,可以通过以下方式创建字符串: var mystring = new String("asdf"); 我的印象是,新操作符后面的构造函数必须返回一个对象。其次,字符串似乎具有属性和方法。例如: mystring.toUpperCase(); typeof new String('foo'); // "object" typeof 'foo'; // "string" function Test () { // don't re

这里有两个理由认为字符串是对象。首先,可以通过以下方式创建字符串:

var mystring = new String("asdf");
我的印象是,新操作符后面的构造函数必须返回一个对象。其次,字符串似乎具有属性和方法。例如:

mystring.toUpperCase();
typeof new String('foo'); // "object"
typeof 'foo';             // "string"
function Test () {
  // don't return anything (equivalent to returning undefined)
}

new Test() instanceof Test; // true, an object
但是,如果字符串是对象,那么我们希望下面的操作能够正常工作:

function string_constructor() {
    return "asdf";
}

var mystring = new string_constructor();

但它不是,而且我被告知它不是,因为字符串不是对象。那么字符串是否是对象呢?不管怎样,我怎样才能理解我列出的所有内容呢?

基本字符串的行为类似于JavaScript中的对象,因为它们在调用对象方法时会自动转换为对象:

字符串对象可以由 调用构造函数new String()。 String对象包装JavaScript的 具有 方法如下所述。全球 也可以调用函数String() 没有新的在前面创建一个 基本字符串。中的字符串文本 JavaScript是基本字符串

因为JavaScript是自动生成的 在字符串原语和 字符串对象,您可以调用 上的字符串对象的方法 字符串原语。JavaScript 自动转换字符串 将基元转换为临时字符串 对象,调用该方法,然后 丢弃临时字符串对象。 例如,您可以使用 字符串的String.length属性 从字符串创建的基元 文字的


说到语言类型,字符串是字符串类型的

该语言有五种类型,分别是字符串、数字、布尔值、Null和未定义

有字符串对象(也用于数字或布尔值),它们被称为基本包装器,它们是在使用与其关联的构造函数时创建的,例如:

mystring.toUpperCase();
typeof new String('foo'); // "object"
typeof 'foo';             // "string"
function Test () {
  // don't return anything (equivalent to returning undefined)
}

new Test() instanceof Test; // true, an object
但不要混淆它们,您很少需要使用原语包装器,因为即使原语值不是对象,您仍然可以访问它们的继承属性,例如,在字符串上,您可以访问
字符串的所有成员。prototype
,例如:

'foo'.indexOf('o'); // 2
这是因为属性访问器(本例中的点)临时将原语值转换为对象,以便能够解析原型链中的
indexOf
属性

关于问题中的构造函数,您知道,它不会返回字符串

使用
new
运算符调用的函数返回一个隐式值,该值是从该函数的
原型继承的新对象,例如:

mystring.toUpperCase();
typeof new String('foo'); // "object"
typeof 'foo';             // "string"
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'

但对于基元值,它们只是被忽略,并且隐式返回构造函数中的新对象(有关更多详细信息,请检查内部操作(参见步骤9和10))。

字符串既是基元类型也是对象类型。想想int,float,char。。。在Java中,它们有实际的对象类,如Integer、Float和Char

String是原始字符串数据类型的包装器。当您执行类似于
var s=“My String”
的操作时,会在需要时在后台创建一个字符串包装器对象


然而有趣的是,
typeof s
='string'而不是'object'。有人知道为什么吗?

字符串是对象,但您在示例中所做的并不是创建新字符串。通过使用“新建”,您正在创建对象的实例,而不是“字符串”

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”。

在JavaScript中,字符串有两种风格:

  • 有一种字符串语言类型,它包含像
    “foo”
    “bar”
    这样的值。这些值是原始值

  • 然后是一个字符串构造函数。(构造函数是用于创建特定“类”(或伪类)的新实例的函数对象)。因此:
    newstring(“foo”)
    将创建一个新对象(类型对象的值),其中包含原语值“foo”

  • 实际上,您不使用
    新字符串('foo')
    表示法,而是使用字符串文字表示法
    'foo'


    所以要回答你的问题:
    在JavaScript中,字符串不是对象。它们是原始值。但是,存在可用于存储字符串值的字符串对象,但这些字符串对象在实践中并未使用。

    字符串是中的对象JavaScript@mplungjan在荷兰,我们说:短而有力。但这是回答,不是评论^^谢谢我回答。Langer en krachtigerBut字符串不一定是JavaScript中的对象。特别是字符串常量不是对象-它们是值。但必要时,它们会自动升级为“字符串”对象。您的答案自相矛盾。。。“字符串在JavaScript中肯定是对象:”。。。“JavaScript中的字符串文字都是原始字符串。”已经修复了-我应该说:行为肯定像对象,因为-sheez人在这里太苛刻了。这并不能回答问题。问题是:“字符串是对象吗?”。您的回答暗示字符串不是对象,但您必须弄清楚这一点。所以你的答案是+1。至少我把URL贴到了马口上——在JavaScript中,没有其他人这么做,语言类型名称是大写的。这5种基本类型是:数字、字符串、布尔值、Null和未定义。您可以说:字符串是值。但你也得说是哪种类型的。每一个值都是一种类型。@Šime:Yep,现在澄清它。谢谢:)只有在必须时才创建“字符串”包装对象-它不是通过简单地将字符串常量赋值给变量来创建的。因为
    s
    是字符串类型的值,而不是