我看过一些网页说“a = b ||'blah'”应该将'blah'分配给a,如果b未定义或为null。但是,如果我在Firebug中键入它或在代码中使用它,它会抱怨b未定义,在FF3 / win列表中。任何提示?
编辑:我正在寻找可能根本不存在b的情况。例如,没有id的DOM节点。
答案 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');
有几条评论提到没有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'
适合我。