更改包装的基元数据类型的值

时间:2010-11-01 01:22:06

标签: javascript types object

var test = new Boolean(0)
test.prop = "OK!"

您可以将test的值更改为true吗?

test.prop仍然应该是“OK!”

换句话说,test应该是同一个对象

3 个答案:

答案 0 :(得分:7)

内置对象包装器(使用BooleanNumberStringDate构造器创建)将原始包装值存储在名为{{1的内部属性中},无法改变,但......

您可以覆盖[[PrimitiveValue]]对象的valueOf方法:

test

它将起作用,因为var test = new Boolean(0); test.prop = "OK!" // override valueOf: test.valueOf = function () { return true; }; if (test == true) { // using the equals operator explicitly for type conversion alert(test.prop); //"OK!" } 方法由equals运算符触发的类型转换机制在内部使用。

当其中一个操作数是布尔值时,两者都在末尾转换为数字。

如果我们不使用equals运算符(例如valueOf),因为if (test) { ... }是一个对象,当直接转换为Boolean时,它总是会产生test

转换为布尔值的任何对象都会产生true值,唯一可以产生true结果的值是“假”值(falsenullundefined0,空字符串,当然还有NaN值),其他任何内容都会产生false

更多信息:

答案 1 :(得分:1)

没有。

var test = new Boolean(0);

创建一个新的Object并在'test'

中添加对它的引用
test.prop = 'ss'

动态地在对象上放置一个新属性(元编程FTW!)

test = true;

将测试分配给布尔基元类型。对Boolean对象的引用将丢失。

最后,布尔对象似乎没有任何方法来切换或重新分配其值,即布尔对象是不可变的。

但是,您可以向Boolean.prototype添加一个方法,以便在需要时更改它....

答案 2 :(得分:0)

对象包装器在JS中创建一个不可变的引用类型。由于在JS中原始数据类型是不可变的,因此它们的引用也应该是不可变的。它可能对一些罕见的情况有用,但很可能不会做你想要的。例如,如果您需要更改源原始值并观察引用它,那么您就不能使用Object构造函数来实现所需的效果。那么你最好的办法就是避免使用Object构造函数,并使用适当的对象文字来保存属性下的原始值,如下所示;



var pv = "test",
   pvr = {0: pv},
   arr = new Array(5).fill().map(_ => pvr);
console.log(JSON.stringify(arr));
pvr[0] = "Hello";
console.log(JSON.stringify(arr));