在Javascript中,是否有一种很好的方法可以在整个会话中检查变量是否永远为真,(或任何值)?我现在能想到的最好方法是像这样进行定期检查,在另一个变量中记录真实性:
if (variable){
variablewasevertrue = true;
}
然后,当我想知道原始variable
是否真实时,我会检查新的variablewasevertrue
是true
还是undefined
。没有比if (variable was ever true){
更优雅的了吗?这似乎不是Javascript-y。
答案 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)
不,除了你可以使用这样的getter
和setter
,它会委托变量的设置,以便你可以检查它是否一次设置:
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"