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

Car*_*Gil 7 javascript types object

var test = new Boolean(0)
test.prop = "OK!"
Run Code Online (Sandbox Code Playgroud)

你可以改变的价值testtrue

test.prop应该还是"好的!"

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

CMS*_*CMS 7

内置对象包装(与所创建的Boolean,Number,StringDateconstuctors)存储在内部属性原始包裹值命名的[[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!"
}
Run Code Online (Sandbox Code Playgroud)

它将起作用,因为该valueOf方法由equals运算符触发的类型转换机制在内部使用.

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

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

转换成布尔会产生任何对象true的值,即能够产生一个唯一的值false结果,是"falsey"值(null,undefined,0,NaN,一个空字符串,和当然的false值)时,任何东西都不会产生true.

更多信息:

  • @Gaby,嗯,这取决于如何进行类型转换,例如,如果你连接一个字符串,例如`test +''`结果仍然是''true'`(`valueOf`将首先使用),如果你使用`String`构造函数作为函数,例如:`String(test);`它将调用[`Boolean.prototype.toString`](http://ecma262-5.com/ELS5_HTML.htm#Section_15 .6.4.2)方法.我同意,同样覆盖`toString`是个好主意. (2认同)