JavaScript - 为什么我不能向“字符串”对象添加新属性?

时间:2011-04-04 13:18:52

标签: javascript

我已尝试使用JavaScript并注意到这个奇怪的事情:

var s = "hello world!";
s.x = 5;
console.log(s.x); //undefined

JavaScript中的每种类型的变量都是从对象继承而来的。因此,应该可以为每个对象添加新属性。

我误解了什么错误吗?

6 个答案:

答案 0 :(得分:10)

JavaScript中的字符串不是String的实例。如果你做new String('my string')那么它就会。否则它是一个原语,当你在其上调用方法时,它会动态转换为String个对象。如果要获取字符串的值,则需要调用toString(),如下所示:

var s = new String("hello world!");
s.x = 5;
console.log(s.x); //5
console.log(s); //[object Object]
console.log(s.toString()); //hello world!

答案 1 :(得分:1)

String对象是对象,可以展开,但字符串文字不是字符串对象,不能展开。

示例:

var s = 'asdf';
s.x = 42;
alert(s.x); // shows "undefined"

s = new String('asdf');
s.x = 1337;
alert(s.x); // shows "1337"

答案 2 :(得分:0)

Skilldrick的答案解释了为什么它不起作用,因此回答了你的问题。

作为旁注, 可以这样做:

var s = {
  toString: function() { return "hello world!"; }
};
s.x = 5;
console.log(s.x); // 5
console.log('result: ' + s); // "result: hello world!";
console.log(String(s)); // "hello world!";

答案 3 :(得分:0)

您的s是字符串文字,而不是字符串对象。字符串文字是handled differently

  

您无法向字符串文字添加属性或方法的原因是,当您尝试访问文字的属性或方法时,Javascript解释器会临时将字符串的值复制到新对象中,然后使用该对象的属性或方法。这意味着String文字只能访问字符串的默认属性或方法以及已作为原型添加的属性。

答案 4 :(得分:0)

Primitives MDC docs是不可变的。

  

原始,原始价值
  不是对象且没有任何方法的数据   JavaScript有5种原始数据类型:字符串数字布尔 null 未定义
  除 null undefined 之外,所有基元值都具有包围原始值的对象等价物,例如, String对象包裹字符串原语     所有原语都是不可变的

答案 5 :(得分:0)

尝试这样做:

var s = "hello world!";
s.prototype.x = 5;
console.log(s.x);