var test = new Boolean(0)
test.prop = "OK!"
您可以将test
的值更改为true
吗?
但test.prop
仍然应该是“OK!”
换句话说,test
应该是同一个对象
答案 0 :(得分:7)
内置对象包装器(使用Boolean
,Number
,String
和Date
构造器创建)将原始包装值存储在名为{{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
结果的值是“假”值(false
,null
,undefined
,0
,空字符串,当然还有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));