Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/lua/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何在JavaScript中创建类似布尔的对象?_Javascript - Fatal编程技术网

如何在JavaScript中创建类似布尔的对象?

如何在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

我想创建类似布尔值的对象。 但我不想污染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 !== 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。。。我忽略了这一点。是的,那确实很有趣。谢谢你提醒我。