我已尝试使用JavaScript并注意到这个奇怪的事情:
var s = "hello world!";
s.x = 5;
console.log(s.x); //undefined
JavaScript中的每种类型的变量都是从对象继承而来的。因此,应该可以为每个对象添加新属性。
我误解了什么错误吗?
答案 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);