【问题标题】:Achieving safe dereference in jQuery?在 jQuery 中实现安全取消引用?
【发布时间】:2012-03-19 03:42:15
【问题描述】:

我正在研究使用 jQuery 对象作为安全的解引用器,就像在 Groovy 中一样。我要解决的问题是我从可能没有我正在寻找的值的 AJAX 调用中检索 JSON。我想要一种方便的方法来检查我是否在尝试使用该值执行某些操作之前返回值。

对于非 Groovy 程序员,如果 Groovy 中的变量为 null,则调用它的方法会静默失败,而不是抛出空指针异常。

我可以像这样使用 jQuery 运算符从 null 变量中创建一个空对象:

var myvar
$(myvar).chainedfunc()

在这个例子中,chainedfunc 仍然会在空对象上执行。

如果原始值为空,有没有办法阻止chainedfunc执行?

我知道我可能不得不忍受在一个空对象上执行链式函数。

注意:

我将下面的想法记录下来,但我意识到逻辑是错误的。情况 1,对象为 null,在这种情况下没有类型,因此无法创建相同类型的新对象,情况 2 对象存在,在这种情况下我返回对象不变。不过,总体问题仍然有意义。

在这种情况下,如果原始值不是一个对象,而是一个数组,那么问题就变成了,因为我用它创建了一个对象,以避免出现 null 错误。对于这种情况,我有以下功能:

$.fn.safe = function(){
    if (this.get(0)){
        return this.get(0)
    }
    else return []
}

在这种情况下,我假设原件是一个数组。理想情况下,我希望能够确定原始类型并返回相同类型的空实例。

// this does not work because type is not a constructor
$.fn.safe = function(){
    var type = typeof this.get(0)
    return this.get(0) || new type()
}

【问题讨论】:

  • 听起来像是law of the instrument 问题。
  • 聪明。这就是我问的原因,一定有更好的方法。

标签: javascript jquery dereference


【解决方案1】:

为什么要为此使用 jQuery?您可以创建自己的一组函数来对数据进行操作,这些函数在对数据进行任何操作之前都会检查数据的完整性,或者您可以使用方法检查数据的方法创建自己的对象。这就是 jQuery 所做的一切。

常规函数:

function func1(data, arg) {
    if (!data) return;
    // carry out func1 on data here
}

function func2(data, arg) {
    if (!data) return;
    // carry out func2 on data here
}

或者作为一个对象:

function dWrap(data) {
    this.data = data;
}

dWrap.protototype = {
    func1: function(arg) {
        if (!this.data) return(this);
        // do func1 operation here
        return(this);
    }

    func2: function(arg) {
        if (!this.data) return(this);
        // do func2 operation here
        return(this);
    }
    toString: function() {
        if (!this.data) {
            return("");
        }
        return(this.data.toString());
    }
};

var myData = 45;
var x = new dWrap(myData);
x.func1(3).func2("foo");
x.toString();                     // returns "45"

var y = new dWrap(null);
y.func1(3).func2("foo").toString();   // returns ""

【讨论】:

  • 感谢您的回复。与其说我为什么使用 jQuery,不如说我已经在使用 jQuery 并查看我可以免费获得什么。我可以免费将 null 变成一个空的 jQuery 对象,我只是在看是否有办法优化它。我知道这是我正在尝试做的一件简单的事情,我正在寻找的是最好的方法。
  • @saranicole - 如果您的数据不是 DOM 对象,那么您可能不会使用其他 jQuery 方法。如果您不使用其他 jQuery 方法,那么您唯一免费获得的 jQuery 就是构造函数,它是上面示例中用于您自己对象的几行代码。我个人认为拥有自己的实现比使用操作不同类型数据的方法重载 jQuery 实现要干净得多。
  • 公平点。因此,然后使用常规函数,如果我有一个函数尝试使用空变量,问题仍然存在: func1(myvar).toString() 抛出“变量未定义”错误。
  • @saranicole - 如果您希望 toString() 成为一个安全函数,那么您必须使用您自己的“安全”实现来定义该方法,或者确保 func1 始终返回 @987654325 的内容@可以操作。我觉得我在这里追我的尾巴,因为你还没有真正描述你的全部要求。
  • 感谢您对这个问题的想法。我理想的预期行为是调用空值的函数不会执行,就好像我要编写它一样:if (myvar){dosomething()}。如果该值为 null,则不会执行某项操作。拥有这个功能对我来说似乎并不牵强,因为它在 Groovy 中非常有用。
猜你喜欢
  • 2010-09-21
  • 2022-11-18
  • 2015-05-21
  • 1970-01-01
  • 1970-01-01
  • 2021-12-04
  • 2012-07-11
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多