JavaScript-为什么可以';t I向“添加新属性”;“字符串”;对象

JavaScript-为什么可以';t I向“添加新属性”;“字符串”;对象,javascript,Javascript,我曾经尝试过JavaScript,并注意到了一件奇怪的事情: var s = "hello world!"; s.x = 5; console.log(s.x); //undefined JavaScript中的每种类型的变量都是从对象继承的。因此,应该可以为每个对象添加新属性 我误解了什么吗?JavaScript中的字符串不是string的实例。如果您使用新建字符串(“我的字符串”)则它将是。否则,它是一个原语,当您调用它的方法时,它会动态转换为字符串对象。如果要获取字符串的值,需要调用to

我曾经尝试过JavaScript,并注意到了一件奇怪的事情:

var s = "hello world!";
s.x = 5;
console.log(s.x); //undefined
JavaScript中的每种类型的变量都是从对象继承的。因此,应该可以为每个对象添加新属性


我误解了什么吗?

JavaScript中的字符串不是
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!

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

例如:

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

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

斯基尔德里克的回答解释了为什么它不起作用,因此回答了你的问题

作为旁注,可以这样做:

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!";
var s = "hello world!";
s.prototype.x = 5;
console.log(s.x);

您的
s
是字符串文本,而不是字符串对象。字符串文字是:

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

它们是不变的

原语,原语值
不是对象且没有任何方法的数据。
JavaScript有5种基本数据类型:字符串数字布尔未定义
除null和undefined外,所有原语值都具有环绕原语值的对象等价物,例如字符串对象环绕字符串原语。
所有原语都是不可变的

尝试这样做:

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!";
var s = "hello world!";
s.prototype.x = 5;
console.log(s.x);

有些基元类型不是从
对象继承的。这是字符串、数字和布尔文本的情况。JS最差语言类型系统谢谢!我从未注意到“hello”和新字符串(“hello”)之间有区别;我记录了“你好”.\uuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuu。所以我很清楚……这会将x属性添加到所有字符串对象中,而不是我想要做的;)给出“TypeError:expression's.prototype'[undefined]的结果不是对象”。无论如何,即使s是字符串对象,对象也不会从它们自己的原型继承,而是从它们的构造函数继承,后者由内部[[prototype]]属性引用。这是引号吗?如果是,从哪里来?是的,这是一个报价。引用链接在引用之前。