为什么不||似乎在JavaScript中作为coalesce / default运算符工作?

时间:2008-11-19 19:08:24

标签: javascript firefox-3 coalesce

我看过一些网页说“a = b ||'blah'”应该将'blah'分配给a,如果b未定义或为null。但是,如果我在Firebug中键入它或在代码中使用它,它会抱怨b未定义,在FF3 / win列表中。任何提示?

编辑:我正在寻找可能根本不存在b的情况。例如,没有id的DOM节点。

4 个答案:

答案 0 :(得分:8)

如果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对象,可以查看是否存在全局变量。所有全局变量实际上只是window对象中的字段。例如:

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

因为你知道窗口对象已经存在,你可以查看它的字段 检查javascript中不存在的字段将为您提供undefined并且不会崩溃,因此您可以执行合并,或将undefined放入变量或其他内容

对于本地变量(用var声明的事物),你无法检查它们是否存在。它们不会“存在”任何地方全局变量在窗口对象中“生存”的方式,以及任何引用它的正常尝试都会导致异常:例如:

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

但有一个例外(我知道,感谢评论中的J c),typeof运算符。如果您尝试获取不存在的类型,将不会崩溃,它将返回字符串 "undefined"
这为您提供了一种检查不存在的局部变量的方法。例如:

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

关于不存在的DOM元素

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

它是一个DOM元素并不是真正相关的事实。将DOM视为数据库或文件,将元素视为该数据库中的行或该文件中的单词。为了任何事情,你必须搜索数据库,找到正确的行,然后将数据拉出来。数据被放入javascript对象中。然后,您可以通过操作该对象来访问它,并且可以根据需要将对象放在变量中。例如:

document.getElementById('foo');

这会进入dom并查找ID为'foo'的元素。如果找到一个,它会将有关该元素的一些信息放入javascript对象中,然后将该对象交还给您。如果找不到该元素,它会将您送回null,但所有正常规则仍然适用(您可以将null粘贴到变量或其他任何内容中。

它根本不会影响合并。

答案 1 :(得分:3)

我认为你正在寻找这个:

var a = typeof b == 'undefined' ? 'blah' : b;

答案 2 :(得分:0)

||是Javascript中的短路逻辑OR运算符,非常类似于C,C ++,Java,C#,Perl,PHP等......

According to Wikipedia,如果你在b周围加上括号,它会按预期工作。

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

答案 3 :(得分:0)

  

但是如果我在Firebug中键入它或在代码中使用它,它会抱怨b未定义,在FF3 / win上列出

你是什么意思,“没有定义”?你的意思是Javascript不知道变量?然后您可以使用window.b,因为“窗口”是顶级对象,或者首先使用var b;声明b;但只有当变量时才会这样。

如果是DOM元素,您可能必须首先尝试搜索它,例如使用document.getElementById

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

适合我。