变量x是真的吗?

时间:2011-08-11 19:32:04

标签: javascript variables

在Javascript中,是否有一种很好的方法可以在整个会话中检查变量是否永远为真,(或任何值)?我现在能想到的最好方法是像这样进行定期检查,在另一个变量中记录真实性:

if (variable){
  variablewasevertrue = true;
}

然后,当我想知道原始variable是否真实时,我会检查新的variablewasevertruetrue还是undefined。没有比if (variable was ever true){更优雅的了吗?这似乎不是Javascript-y。

6 个答案:

答案 0 :(得分:8)

该语言中没有if (variable was ever true)设施。变量存储值,而不是历史记录。

在分配值时拦截值并进行检查是唯一的方法。如果变量实际上是属性(例如,全局变量是全局对象的属性),则可以使用setters轻松拦截更改。

所以要保持历史记录保存全局变量

var hasEverBeenTruthy = false;
(function () {
  var value;
  Object.defineProperty(window, "myGlobal", {
    "get": function () { return value; },
    "set": function (newval) {
      if (newval) { hasEverBeenTruthy = true; }
      value = newval;
    }
  });
})();

这适用于现代浏览器,许多旧版浏览器都有__defineSetter__个变体。

答案 1 :(得分:7)

变量存储值,而不是内存位置的历史记录。如果你想做这样的事情,我建议你使用某种类型的对象:

var x = {
    value: false,
    history: [],
    set: function(val){
        history.push(this.value);
        this.value = val;
    },
    wasEver: function(val){
        return this.history.indexOf(val) >= 0;
    }
};

然后您可以像这样使用对象:

x.set(false);
x.value; //returns false

x.set(true);
x.value; //returns true

x.wasEver(true); // returns true
x.wasEver(false); //returns true
x.wasEver("hello"); //returns false

这为每个对象提供了自己的历史记录(例如,它可以检查多个值,而不仅仅是一个 - 与其他答案中提到的getter / setter一样),并且保证可以在任何范围内工作,因为所有功能都是包含在已定义的对象中。

答案 2 :(得分:5)

不,除了你可以使用这样的gettersetter,它会委托变量的设置,以便你可以检查它是否一次设置:

var value,
    wasevertrue = false;

window.__defineSetter__('test', function(v) {
    value = v;
    wasevertrue = wasevertrue || (v === true);
});

window.__defineGetter__('test', function() {
    return value;
});

现在,

test = false; // wasevertrue === false
test = true;  // wasevertrue === true
test = false; // wasevertrue === true

最好还是把它放在一个闭包中,因为你现在可以设置value = true作为setter的变通方法。

答案 3 :(得分:1)

不 - 变量没有状态跟踪。它只是它当前的价值。超出它自己的自定义实现,使用类似属性的方法进行状态跟踪。

答案 4 :(得分:1)

有另一个名为“wasevertrue = false”的变量。你设置“变量”的任何地方都会立即跟着它,看看是否变量== true。如果是,请设置wasevertrue = true。

答案 5 :(得分:1)

您不能使用单个标量变量来跟踪历史记录,但可以使用数组。这不是理想的,但它是另一种选择:

function setVar(arr, value) {
    arr.unshift(value);
    return arr;
}

function getVar(arr) {
    return arr[0];
}

function checkHist(arr, histValue) {
    var ii;
    for (ii = 0; ii < arr.length; ii++) {
        if (arr[ii] === histValue) {
            return true;
        }
    }
    return false;
}

var myVar = [];
myVar = setVar(myVar, true);
myVar = setVar(myVar, false);

alert(checkHist(myVar, true)); // alerts "true"