【发布时间】:2011-05-03 05:44:47
【问题描述】:
var test = new Boolean(0)
test.prop = "OK!"
你能把test的值改成true吗?
但test.prop 仍应为“OK!”
换句话说,test 应该是同一个对象
【问题讨论】:
标签: javascript types object
var test = new Boolean(0)
test.prop = "OK!"
你能把test的值改成true吗?
但test.prop 仍应为“OK!”
换句话说,test 应该是同一个对象
【问题讨论】:
标签: javascript types object
对象包装器在 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));
【讨论】:
内置对象包装器(使用Boolean、Number、String 和Date 构造函数创建)将原始包装值存储在名为[[PrimitiveValue]] 的内部属性中,该属性无法更改,但是。 ..
您可以覆盖 test 对象的 valueOf 方法:
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!"
}
它将起作用,因为 valueOf 方法在内部由 equals 运算符触发的类型转换机制使用。
当其中一个操作数是布尔值时,两者都在末尾转换为数字。
如果我们不使用等号运算符(例如if (test) { ... }),由于test是一个对象,当直接转换为布尔值时,它总是会产生true。
任何转换为布尔值的对象都将产生true 值,唯一可以产生false 结果的值是“假”值(null、undefined、0、NaN , 一个空字符串,当然还有false 值),其他任何东西都会产生true。
更多信息:
【讨论】:
false,因为基础值并没有真正改变..
test+'' 结果仍然是 'true' (valueOf 将首先使用),如果您使用 String 构造函数作为函数,例如:String(test); 它将调用 Boolean.prototype.toString 方法。我同意,最好也覆盖 toString。
alert(test),它显示false。看起来 alert 方法使用 String 构造函数或在其参数上调用 toString .. 感谢您的注意。
没有。
var test = new Boolean(0);
创建一个新对象并将其引用放在“测试”中
test.prop = 'ss'
在对象上动态放置一个新属性(元编程 FTW!)
test = true;
将 test 分配给布尔原始类型。对布尔对象的引用丢失。
最后,布尔对象似乎没有任何方法来切换或重新分配其值,即布尔对象是不可变的。
但是,如果需要,您可以向 Boolean.prototype 添加一个方法来更改它....
【讨论】: