Была ли переменная x когда-либо истинной? - PullRequest
4 голосов
/ 11 августа 2011

В Javascript есть хороший способ проверить, была ли переменная когда-либо истинной (или любым значением) во всем сеансе? Лучший способ, о котором я могу думать прямо сейчас, - это выполнять регулярную проверку, например, записывая правдивость в другую переменную:

if (variable){
  variablewasevertrue = true;
}

Затем, когда я хочу узнать, был ли оригинал variable когда-либо истинным, я проверяю, является ли новый variablewasevertrue true или undefined. Там нет ничего более изящного, как if (variable was ever true){ там? Это не похоже на Javascript-у.

Ответы [ 6 ]

8 голосов
/ 11 августа 2011

Нет, на языке нет возможности if (variable was ever true).Переменные хранят значения, а не историю.

Перехват значений при их назначении и проверка - единственный способ сделать это.Если переменная действительно является свойством (например, глобальная переменная является свойством глобального объекта), вы можете легко перехватывать изменения, используя setters .

Поэтому, чтобы иметь историю, хранящую глобальную переменную, вы моглиdo

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

Это будет работать в современных браузерах, и во многих старых браузерах есть варианты __defineSetter__.

7 голосов
/ 11 августа 2011

Значение переменной хранится, а не история расположения в памяти. Если вы хотите сделать что-то подобное, я бы посоветовал вам использовать какой-нибудь объект:

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

Это дает каждому объекту собственную историю (например, он может проверять несколько значений, а не только одно - как в случае с методами получения / установки, упомянутыми в других ответах) и гарантированно работает в любой области, поскольку содержится в определенном объекте.

5 голосов
/ 11 августа 2011

Нет, за исключением того, что вы можете использовать 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 в качестве обходного пути для сеттера.

1 голос
/ 11 августа 2011

Вы не можете использовать одну скалярную переменную для отслеживания истории, но вы можете использовать массив. Это не идеально, но это альтернатива:

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"
1 голос
/ 11 августа 2011

Есть еще одна переменная с именем "wasevertrue = false."Везде, где вы устанавливаете «переменную», сразу же следуйте за ней, проверяя, видит ли переменная == true.Если это так, установите wasevertrue = true.

1 голос
/ 11 августа 2011

нет - отслеживание состояния по переменным отсутствует. это только то, что является его текущим значением. кроме того, это ваша собственная пользовательская реализация, использующая подобные свойства методы для отслеживания состояния.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...