2010-11-01 63 views

回答

7

内置对象包装(与BooleanNumberStringDate constuctors创建)存储原始在名为[[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方法由等号运算符触发的类型转换机制在内部使用。

当其中一个操作数是一个布尔值时,两者都在最后转换为Number。

如果我们不使用等号运算符(例如if (test) { ... }),因为test是一个对象,所以当直接转换为布尔值时,它总是会产生true

任何对象转换成布尔会产生true值,即能产生false结果的唯一的值,是“falsey”值(nullundefined0NaN,一个空字符串,当然还有false值),其他任何东西都会产生true

更多信息:

+0

虽然字符串表示仍然'FALSE',因为潜在价值还没有真正改变.. – 2010-11-01 01:43:04

+2

@Gaby,好了,这取决于类型转换是怎么制成的,例如,如果你连接一个字符串,例如'test +'''结果仍然是'true'(如果你使用'String'构造函数作为函数,例如:'String(test);'它会调用['Boolean.prototype.toString'](http://ecma262-5.com/ELS5_HTML.htm#Section_15.6.4.2)方法。我同意,重写'toString'也是一个好主意。 – CMS 2010-11-01 01:49:08

+0

啊非常好..我刚刚警告值'alert(test)',它显示'false'。看起来'alert'方法使用String构造函数或者在其参数上调用'toString' ..谢谢你的提升。 – 2010-11-01 09:09:00

1

var test = new Boolean(0); 

创建一个新对象,并在 '测试' 使对它的引用

test.prop = 'ss' 

动态放对象上的新属性(元编程FTW!)

test = true; 

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

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

但是,你可以添加一个方法来Boolean.prototype改变,如果你想....

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));