1

我已经看到几个网页说a = b || 'blah'应该分配'blah'aif bisundefinednull. 但是,如果我将它输入到 Firebug 或在代码中使用它,它会抱怨b未定义,在 FF3/win 的列表中。有什么提示吗?

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

4

4 回答 4

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放在一个变量中,或者其他什么)。

它根本不影响合并。

于 2008-11-19T19:13:28.353 回答
3

我想你正在寻找这个:

var a = typeof b == 'undefined' ? 'blah' : b;
于 2008-11-19T22:01:45.003 回答
0

||是 JavaScript 中的短路逻辑 OR 运算符,很像 C、C++、Java、C#、Perl、PHP 等中的逻辑或运算符。

根据 Wikipedia,如果您在 周围加上括号b,它将按您的预期工作。

var a = (b) || 'blah';
于 2008-11-19T19:13:33.487 回答
0

但是如果我将它输入到 Firebug 或在代码中使用它,它会抱怨 b 未定义,在 FF3/win 的列表中

你是什​​么意思,“未定义”?你的意思是Javascript不知道这个变量?然后你可以使用window.b"window" 是顶级对象,或者首先用var b;;声明 b 但前提是它一个变量。

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

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

为我工作。

于 2008-11-19T19:56:57.173 回答