0

如果 JavaScript 很容易在原语和对象之间进行强制转换,为什么向其添加属性会导致未定义?

var a = "abc";
var b = a.length
console.log(b)//outputs 3

强制允许我为原语赋值吗?如果不是,为什么?

4

2 回答 2

1

强制允许我为基元赋值吗?

是的。原语被包装在一个对象中,并在其上创建一个属性。不会抛出异常。

为什么向它添加属性会导致未定义?

添加本身确实会产生价值。

var str = "abc";
console.log(str.someProperty = 5); // 5

然而,你所要求的是从一个原语中获得一个属性。这将返回,undefined因为原语被包装在一个的包装对象中 - 而不是您分配属性的那个:

console.log(str.someProperty); // undefined

它仅适用于.length使用对象创建的特殊属性,或继承的属性slicecharAt方法(请参阅文档)。

如果你想要这样的东西,你需要显式地创建包装器对象并将其存储在某处:

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"
于 2013-07-18T15:31:16.043 回答
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

至少它工作得恰到好处。我不知道其他人可能还需要什么 :) 原语...强制...等等。

于 2013-07-18T15:18:31.110 回答