javascript - 字符串是对象吗?

标签 javascript

<分区>

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

var mystring = new String("asdf");

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

mystring.toUpperCase();

但是,如果字符串是对象,那么我们希望像下面这样的东西可以工作:

function string_constructor() {
    return "asdf";
}

var mystring = new string_constructor();

但事实并非如此,有人告诉我事实并非如此,因为字符串不是对象。那么字符串是不是对象呢?而且,无论哪种方式,我怎样才能理解我列出的所有内容?

最佳答案

谈到语言类型,字符串是 values 的字符串类型。

语言有五种primitive types ,它们是 StringNumberBooleanNullUndefined。 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))。

关于javascript - 字符串是对象吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5156196/

相关文章:

javascript - 在javascript中,我可以锁定一个var吗?

javascript - 使用 Webstorm (Babel) 进行 ES6 调试

JavaScript - 调用看起来很有趣

javascript - jQuery 文件上传导致浏览器崩溃

Javascript:获取实例 getter 和字段名称或名称和值

javascript - async.timesLimit() 将不接受有效的回调函数

javascript - 以对象作为键(不是字符串而是唯一对象)的关联映射的 javascript 方法是什么?

javascript - 如何将两个或多个模型绑定(bind)到 p 或 span 标签

javascript - 如何在 TableTools 中使用链接而不是闪光按钮

javascript - 在 CF 的正则表达式中排除 $