如何在JavaScript中创建类似布尔的对象?
我想创建类似布尔值的对象。 但我不想污染Boolean.prototype。 所以我创建了MyBool如何在JavaScript中创建类似布尔的对象?,javascript,Javascript,我想创建类似布尔值的对象。 但我不想污染Boolean.prototype。 所以我创建了MyBool MyBool = function (x) { this.value = x; this.valueOf = function () { return x; }; this.toString = function () { return x; }; } MyBool.prototype.and = function (y) { if (y.constructor !== MyB
MyBool = function (x) {
this.value = x;
this.valueOf = function () { return x; };
this.toString = function () { return x; };
}
MyBool.prototype.and = function (y) {
if (y.constructor !== MyBool) throw 'You cannot do that!';
return this.value && y.value;
}
及其实例
mytrue = new MyBool(true);
myfalse = new MyBool(false);
但是现在,我注意到
if (myfalse) {
console.log ("myfalse is true!!!")
}
打印myfalse是真的
(然而+myfalse(即[[ToNumber]]转换)来到了falsy,这要感谢valueOf)
这很明显,因为在ECMAScript中只有以下值是错误的
undefined, null, false, +0, -0, NaN, ''
如果参数类型是Object,[[ToBoolean]]在任何情况下都为true。
(参见ECMA类型转换和测试)
有没有什么巧妙的方法来创造一个虚假的物体?
如果
myfalse.constructor is MyBool
(!! myfalse) is false
任何欺骗都是受欢迎的,包括ECMA5的set/get/defineProperty或其他任何东西
提前感谢。了解
如果(myfalse){}
正在做什么。它正在检查是否存在myfalse
,而不是它是真是假。在这种情况下,myfalse
是一个对象,因此存在,因此为真。如果您考虑以下因素,我认为目前不可能做到这一点:
var myBool = new Boolean(false);
if (myBool) {
alert('Not false');
}
作为对您的评论的回应,表示您需要一个严格的布尔值。为什么不使用相等运算符
var someBoolean = false,
someObj = { };
if (someBoolean === false)
{
// tada, someBoolean is a boolean AND false
}
// Returns false because someObj is NOT a boolean
if (someObj === true)
{
..
}
你这么做的原因是什么?Boolean有什么问题?当我想在JavaScript中处理其他语言(A,用于解释)时,应该区分A的false和JavaScript的false。而且,构造函数的检查将我的代码引导到严格的代码。如果myfalse实际上不存在,则应该抛出ReferenceError。但是是的,也许我的话太少了。谢谢。哦,这和false没什么区别。。。无论如何谢谢。不过很有趣-如果您从上面的示例中删除新关键字,myBool的计算结果将为false.oppps。。。我忽略了这一点。是的,那确实很有趣。谢谢你提醒我。