【问题标题】:What is the benefit of angular.isdefined?angular.isdefined 有什么好处?
【发布时间】:2015-01-07 11:21:32
【问题描述】:

angular.isdefinedfoo === undefined 有什么好处?

我无法立即想到好处。

【问题讨论】:

  • 书写方便、一致
  • 无论如何你都想使用typeof foo === "undefined",以防处理未定义的变量。
  • @theonlygusti 为什么foo === undefined 不够用?窗户,框架?
  • @Ben 有时会报错,见this question,答案见here
  • 别忘了,在遗留代码中undefined 可能会被重新定义

标签: javascript angularjs


【解决方案1】:

在 Javascript 中以任何方式访问真正未定义的变量,除了 typeof 会引发错误。您只能将Angular.isDefined 与属性一起使用。例如,这可以正常工作:

angular.isDefined(window.obj);

因为 obj 是 window 的未定义属性。

预期行为示例:

var foo;
var bar = 42;

typeof foo !== 'undefined'; // false
typeof bar !== 'undefined'; // true
typeof baz !== 'undefined'; // false

angular.isDefined(foo); // false
angular.isDefined(bar); // true
angular.isDefined(baz); // ReferenceError

【讨论】:

  • 应该是angular.isDefined(window.obj); 使用大写会导致引用错误
  • 所以在您的示例中, foo 是“未定义”,因为它已声明但未分配,而 baz 是“真正未定义”,因为它甚至没有被声明? ... 有趣。
  • 那么,这有什么好处呢? :)
  • 或许所谓的好处是,询问某事物是否已定义比询问它是否未定义更容易产生心理压力。
  • @PetrPeller - 它不一定是一个好处,但允许 truthyfalseythat thing that may or may not be 的评估结果 - 所以它的好处是its easy to not break things by leaning on this construct
【解决方案2】:

这里是来源:

function isDefined(value) {return typeof value !== 'undefined';}

显然,第一个原因是冗长程度较低,但它也证明了未来的角度,尤其是在内部使用该函数时。

【讨论】:

    【解决方案3】:

    就像 Kamrul 所说的那样:

    function isDefined(value) { return typeof value !== 'undefined'; }
    

    这意味着“这个变量的类型是未定义的”......在你的例子中你比较变量的内容等于未定义并且角度正在检查变量的类型。

    在 js 中,类型是动态的,所以在你不赋值之前,变量没有类型......所以 isDefined 会告诉你是否存在变量声明以及该变量是否有任何内容。

    但是,要小心,因为变量可能为空,在这种情况下,变量的类型将是对象。

    你可以试试这个代码:

    var a;
    var b = 'asd';
    var c = null;
    
    console.log('a: ' + typeof a);
    console.log('b: ' + typeof b);
    console.log('c: ' + typeof c);
    console.log('d: ' + typeof d);
    

    你会在控制台看到下一个:

    a: undefined
    b: string 
    c: object 
    d: undefined
    

    所以,

    a) var 存在但没有值所以未定义

    b) var 存在并且有值.. 这个值是一个字符串,所以这是它的类型

    c) var存在但为null,类型不受干扰,所以它的类型是object

    d) var 没有被声明所以......它是未定义的

    重点是“a”和“d”的区别……所以试试下一个:

    console.log('a is undefined? ' + a === undefined);
    console.log('d is undefined? ' + d === undefined);
    

    您将在控制台中看到下一个:

    false
    Uncaught ReferenceError: d is not defined
    

    这是一个大问题,因为:

    a) 告诉你那不是未定义的,当那不是真的时

    d) 引发异常,所以...您的代码将失败

    结论

    当你想检查一个变量是否存在并且已经用一个值初始化时定义了使用,但要小心 null 值,因为 null 是一个对象(定义的 var 也是)。

    如果您想验证变量是否存在并且具有任何有效值(因此不为空),您可以简单地执行以下操作:

    if (myvar) {
      console.log('myvar is defined and is not null');
    } else {
        console.log('myvar is undefined or null');
    }
    

    如果 var 没有用 || 定义,另一个好技巧是初始化某个值

    myvar = myvar || 'some init value';
    

    上面的代码如果定义了 myvar 并且不为 null 则取 myvar 的值,如果没有用某个值初始化它。

    正如@TonyBrasunas 发表的评论,如果 myvar 被评估为 false,则将分配“一些初始值”。在使用这个技巧之前要考虑到这一点。

    这在功能上很好,例如:

    function split(input, charToSplit) {
      charToSplit = charToSplit || ' ';
      return input.split(charToSplit);
    }
    

    那么默认情况下你可以用空格分割: var 输入 = 'asd asd'; var splited = split(输入); // --> splited = ['asd', 'asd']

    或者...与另一个字符:

    var input = 'asd|asd';
    var splited = split(input, '|');
    // --> splited= ['asd', 'asd']
    

    【讨论】:

    • 实际上,myvar = myvar || 'some init value'; 也将分配字符串值,如果 myvar 定义不为 null 而是为 false。例如,如果 myvarfalse,那么您的分配技巧就无法预测。
    【解决方案4】:

    我只能猜测,但我认为我的猜测很不错。

    这两个表达式在功能上是等价的:

    typeof foo !== 'undefined'
    
    angular.isDefined(foo)
    

    后者的好处包括:

    1) 可以说,询问某事物是否已定义比询问某事物是否未定义要少。

    2) angular.isDefined(foo) 可以说比 typeof foo !== 'undefined' 更“嘈杂”,因此可以更快地掌握正在发生的事情。

    注意:这些并不是angular.isDefined 优越性的我的论据。我想表达的是我对 Angular 团队为什么要创建 angular.isDefined 以及为什么他们认为它比普通的 JavaScript 替代方案更好的猜测。

    【讨论】:

    • 恐怕它们在功能上并不相同。在最上面的情况下,foo 可以是当前范围内未定义的名称,而在第二种情况下,它会抛出 ReferenceError。
    猜你喜欢
    • 1970-01-01
    • 2011-01-04
    • 1970-01-01
    • 2010-11-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-11-05
    相关资源
    最近更新 更多