我已经看到几个网页说a = b || 'blah'
应该分配'blah'
给a
if b
isundefined
或null
. 但是,如果我将它输入到 Firebug 或在代码中使用它,它会抱怨b
未定义,在 FF3/win 的列表中。有什么提示吗?
编辑:我正在寻找b
可能根本不存在的情况。例如,没有id
.
我已经看到几个网页说a = b || 'blah'
应该分配'blah'
给a
if b
isundefined
或null
. 但是,如果我将它输入到 Firebug 或在代码中使用它,它会抱怨b
未定义,在 FF3/win 的列表中。有什么提示吗?
编辑:我正在寻找b
可能根本不存在的情况。例如,没有id
.
如果 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
放在一个变量中,或者其他什么)。
它根本不影响合并。
我想你正在寻找这个:
var a = typeof b == 'undefined' ? 'blah' : b;
||
是 JavaScript 中的短路逻辑 OR 运算符,很像 C、C++、Java、C#、Perl、PHP 等中的逻辑或运算符。
根据 Wikipedia,如果您在 周围加上括号b
,它将按您的预期工作。
var a = (b) || 'blah';
但是如果我将它输入到 Firebug 或在代码中使用它,它会抱怨 b 未定义,在 FF3/win 的列表中
你是什么意思,“未定义”?你的意思是Javascript不知道这个变量?然后你可以使用window.b
"window" 是顶级对象,或者首先用var b;
;声明 b 但前提是它是一个变量。
如果它是一个 DOM 元素,您可能必须先尝试寻找它,例如 document.getElementById
:
a = document.getElementById('b') || 'blah'
为我工作。