代码之家  ›  专栏  ›  技术社区  ›  Kev

为什么||在JavaScript中似乎不能作为合并/默认运算符工作?

  •  1
  • Kev  · 技术社区  · 16 年前

    我看过几个网页这么说 a = b || 'blah' 应该分配 'blah' a 如果 b undefined null 但如果我在Firebug中键入或在代码中使用它,它会抱怨 b 未在FF3/win列表中定义。有什么提示吗?

    编辑:我正在寻找以下案例 b 可能根本不存在。例如,一个没有DOM节点的DOM节点 id .

    4 回复  |  直到 5 年前
        1
  •  8
  •   Orion Edwards    16 年前

    如果b存在,并且是false、null等,那么它将以您期望的方式工作。你需要做的就是在上面的线上,把 var b = null ;

    仔细想想,这是有道理的。它基本上是这样的。..

    a = function(){ if(b){return b;} else{ return 'blah' } }();
    

    请注意,它正在检查b的值是否为真。..如果b不存在,则会出现异常。

    关于未定义的变量

    javascript中的“未定义”并不意味着“变量不存在”。它的意思是“变量的值是 undefined “.示例:

    alert(nosuchvariable);
    => throws exception
    
    var somevariable; // note it's never assigned
    alert(somevariable);
    => This alerts with 'undefined'
    

    关于检查变量是否存在。

    所以,如果我们试着阅读 b 并且没有b这样的变量,我们得到一个异常。如果我们试图找出b是否被定义,那么这没有帮助。

    通过检查顶层,您可以查看全局变量是否存在 window 对象。所有全局变量实际上都只是 对象。例子:

    foo = 'Hello';
    alert( window.foo );
    => alerts 'Hello'
    

    因为你知道窗口对象已经存在,所以你可以检查它的字段。
    检查javascript中不存在的字段将为您提供 未限定的 并且不会崩溃,所以你可以进行聚结,或者将 未限定的 在变量或任何东西中

    地方的 变量(用声明的东西 var ), 你无法检查它们的存在。 它们不会以全局变量在窗口对象中“存在”的方式“存在”在任何地方,任何正常的引用都会导致异常:例如:

    alert(a);
    => exception because a is meaningless
    alert(d45pwiu4309m9rv43);
    => exception because that is equally meaningless
    

    然而,有一个例外(据我所知,感谢评论中的JC) typeof 操作员。如果你试图得到不存在的东西的类型,它 不会 崩溃,它会回来的 字符串 "undefined" .
    这为您提供了一种检查不存在的局部变量的方法。如:

    if( typeof(djfsd) === "undefined" )
      alert('no such variable');
    

    关于不存在的DOM元素

    有几条评论提到了没有ID的DOM元素等等。..

    它是DOM元素的事实并不重要。将DOM视为数据库或文件,将元素视为数据库中的行或文件中的单词。为了 有了它,你必须在数据库中搜索,找到正确的行,并提取出它的数据。数据被放入一个javascript对象中。然后,您可以通过操纵该对象来访问它,如果您愿意,还可以将该对象放入变量中。例子:

    document.getElementById('foo');
    

    这将进入dom并查找ID为'foo'的元素。如果它找到一个,它会将有关该元素的一些信息放入javascript对象中,然后将该对象交还给您。如果它找不到元素,它会把你还给你 null ,但所有正常规则仍然适用(你可以坚持 无效的 在变量中或任何东西中)。

    它根本不会影响聚结。

        2
  •  3
  •   Jake Devine Jake Devine    16 年前

    我想你在找这个:

    var a = typeof b == 'undefined' ? 'blah' : b;
    
        3
  •  0
  •   bart    16 年前

    但如果我在Firebug中键入或在代码中使用它,它会抱怨FF3/win上的列表中没有定义b

    你是什么意思,“没有定义”?你是说Javascript不知道变量?然后你可以使用 window.b 因为“window”是顶层对象,或者首先声明b var b; 但前提是 一个变量。

    如果它是一个DOM元素,您可能必须先尝试查找它,例如使用 document.getElementById :

    a = document.getElementById('b') || 'blah'
    

    为我工作。

        4
  •  0
  •   Alex    5 年前

    || 是JavaScript中的短路逻辑OR运算符,与C、C++、Java、C#、Perl、PHP等语言中的逻辑OR运算符非常相似。

    According to Wikipedia ,如果你把括号括起来 b ,它会像你期望的那样工作。

    var a = (b) || 'blah';