如果JavaScript很容易在基元和对象之间强制转换,为什么向它添加属性会导致未定义?
var a = "abc";
var b = a.length
console.log(b)//outputs 3
强制是否允许我为原语分配值?如果没有原因?
答案 0 :(得分:1)
强制是否允许我为基元分配值?
是。原语包装在一个对象中,并在其上创建一个属性。不会抛出异常。
为什么向它添加属性会导致未定义?
添加本身会产生值。
var str = "abc";
console.log(str.someProperty = 5); // 5
然而,你所要求的是从原始人那里获得财产。这将在undefined
中返回,因为基元包含在 new 包装器对象中 - 而不是您为其分配属性的对象:
console.log(str.someProperty); // undefined
它仅适用于使用对象创建的.length
等特殊属性,或者slice
或charAt
方法等继承的属性(请参阅the docs)。< / p>
如果你想要这样的东西,你需要明确地创建包装器对象并将其存储在某个地方:
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"
答案 1 :(得分:0)
你为什么不这样做?
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
至少它的工作正常。我不知道还有什么人可能需要:) 原始......胁迫......等等。