我可以检测javascript中的变量值是增加还是减少?

时间:2014-01-14 22:18:02

标签: javascript jquery variables var

我有一个变量,它总是一个整数,不时增加和/或减少值,从1-5开始。 我想知道我是否可以以任何方式检测它是否上升或下降,例如:

变量当前为3,如果变为4,则运行一个函数,但如果变量减少到2,则运行另一个函数。

能做到吗?

8 个答案:

答案 0 :(得分:7)

以下四种方法将取决于浏览器兼容性的支持,这篇文章 花了我一段时间,但它也教会了我 ___ 是的,我希望我列出大多数方法,如果你知道更多,你可以发一个答案。 然而,您可以在评论中发布您的方法,这样我就可以将其添加到此答案中。干杯!


1 使用 Object.observe:

Object.observe(i, function(b){ b.object[change.name] > b.type ? console.log('decreased') : console.log('increased'); });

关于Object.observe

的其他说明

如果您想在Chrome 33中启用它,

访问chrome:// flags /

启用启用实验性JavaScript


2 使用 setInterval:

var i = 4;
var a = i;
setInterval(function()
{
    if(i != a) a > i ? console.log('decreased') : console.log('increased');
}, 1000);
i = 10;

应该在一秒内记录'增加'。


3 使用 Object.watch:

var i = {i:5};
i.watch("i", function (id, oldval, newval) {
    newval > oldval ? console.log('decreased') : console.log('increased');
    return newval;
});

关于Object.watch

的其他说明

要支持更多浏览器,请添加以下脚本:

if (!Object.prototype.watch) {
    Object.defineProperty(Object.prototype, "watch", {
          enumerable: false
        , configurable: true
        , writable: false
        , value: function (prop, handler) {
            var
              oldval = this[prop]
            , newval = oldval
            , getter = function () {
                return newval;
            }
            , setter = function (val) {
                oldval = newval;
                return newval = handler.call(this, prop, oldval, val);
            }
            ;

            if (delete this[prop]) { // can't watch constants
                Object.defineProperty(this, prop, {
                      get: getter
                    , set: setter
                    , enumerable: true
                    , configurable: true
                });
            }
        }
    });
}

// object.unwatch
if (!Object.prototype.unwatch) {
    Object.defineProperty(Object.prototype, "unwatch", {
          enumerable: false
        , configurable: true
        , writable: false
        , value: function (prop) {
            var val = this[prop];
            delete this[prop]; // remove accessors
            this[prop] = val;
        }
    });
}

https://gist.github.com/eligrey/384583

获得

4. 使用自定义值集功能:

i = 4;

function setValue(obj, val)
{
    val < obj ? console.log('decrease') : console.log('increase');
    obj = val;
}

setValue(i, 10);

应记录'增加'。


其中大多数都要求变量为对象,所以我宁愿随时间检测,如方法 2中所见。

答案 1 :(得分:1)

当然,但你必须定期检查。既然你没有提供代码,我也不会。 : - )

  1. 设置第二个变量等于第一个
  2. 定期(或在某些事件中)检查第二个与第一个
  3. 做出相应的回应
  4. 正如评论中所提到的,有更好的方法,例如在一开始就对变量的值进行任何更改时运行功能(或作为回调)。

答案 2 :(得分:0)

我不会检测变量是否发生变化,而是使用函数来修改变量。这样,函数可以检查值是否已更改,如果有,则调用新函数。类似的东西:

var triggerVariable;

function changeVariable(newVal){
    if(triggerVariable !== newVal){
        triggerVariable = newVal;
        callFunction();
    }
}

function callFunction(){
    alert('variable changed!');
}

changeVariable(10);

答案 3 :(得分:0)

应该很好地支持Object.observe。您可以随意跟踪您的状态(可能在某种关闭中)。

http://updates.html5rocks.com/2012/11/Respond-to-change-with-Object-observe

答案 4 :(得分:0)

您还可以为此特殊变量创建一个类,并使用回调为数学函数编写自定义函数。这是添加功能

的示例
function specVal (value) 
{
  this.onChange = null;
  this.value = value;
  this.val = function() 
  {
    return this.value;
  };

  this.add = function(i)
  {  
    this.value += i;
    if (this.onChange != null)
      this.onChange(this);
    return this;
  }
}

function somethingChanged(val)
{
  alert('changed: ' + val.val());
}

myValue = new specVal(10);
myValue.onChange = somethingChanged;
myValue.add(5);
myValue.add(4);

答案 5 :(得分:0)

我会按照建议使用 MV *框架(淘汰赛是一个轻量级选项) 或者永远不要直接改变变量。   使用setter函数更改其值并每次触发自定义事件。 JQuery 示例:

Function setMyVar(val){  
    if(_myVar  !== val){
    _myVar = val;
    $('#anyelement').triggerHandler('myvarupdated', [myVar]);
    }
}

答案 6 :(得分:0)

与之前的答案非常相似。

  
      
  1. 设置第二个变量等于第一个
  2.   
  3. 定期(或在某些事件中)检查第二个与第一个
  4.   
  5. 做出相应的回应
  6.   

但以不同的方式组织它。 并确保将最后一个变量留在函数之外。此外,在 if 条件语句的末尾更新正在检查更改的值的值。

希望它有所帮助!

var lastValue = 0;
$(function () {


    if (lastValue > originalValue){
        console.log ("Increasing");
    }
    else if (lastValue < originalValue) {
        console.log("Decreasing");
    }
    lastValue = originalValue;            

});

选中此JSFiddle

答案 7 :(得分:0)

let prev;

const change = (i) => {

    if (prev === undefined) prev = i;

    const next = i;

    if (prev < next) console.log("increase");

    if (prev > next) console.log("decrease");

    prev = next;
};
相关问题