如果 JavaScript 很容易在原语和对象之间进行强制转换,为什么向其添加属性会导致未定义?
var a = "abc";
var b = a.length
console.log(b)//outputs 3
强制允许我为原语赋值吗?如果不是,为什么?
如果 JavaScript 很容易在原语和对象之间进行强制转换,为什么向其添加属性会导致未定义?
var a = "abc";
var b = a.length
console.log(b)//outputs 3
强制允许我为原语赋值吗?如果不是,为什么?
强制允许我为基元赋值吗?
是的。原语被包装在一个对象中,并在其上创建一个属性。不会抛出异常。
为什么向它添加属性会导致未定义?
添加本身确实会产生价值。
var str = "abc";
console.log(str.someProperty = 5); // 5
然而,你所要求的是从一个原语中获得一个属性。这将返回,undefined
因为原语被包装在一个新的包装对象中 - 而不是您分配属性的那个:
console.log(str.someProperty); // undefined
它仅适用于.length
使用对象创建的特殊属性,或继承的属性slice
或charAt
方法(请参阅文档)。
如果你想要这样的东西,你需要显式地创建包装器对象并将其存储在某处:
var strObj = new String("abc");
strObj.someProperty = 5;
console.log(strObj.someProperty); // 5
// coercion and the `toString` method will even make the object act like a string
console.log(strObj + "def"); // "abcdef"
你为什么不这样做呢?
var abc=Number(3);
abc.foo="bar";
abc; //3
abc.foo; //bar
@Bergi 确实,对此感到抱歉。我错过了new
声明。这里是:
var abc=new Number(3);
abc.foo="bar";
abc; //3
abc.foo; //bar
至少它工作得恰到好处。我不知道其他人可能还需要什么 :) 原语...强制...等等。