注意:根据ECMAScript5.1, section 15.1.1.3,window.undefined是只读的。
当我最近将Facebook Connect与Tersus集成时,我在尝试调用Facebook API函数时最初收到错误消息Invalid Enumeration Value
和Handler already exists
。
事实证明问题的原因是
object.x === undefined
当'object'中没有属性'x'时返回false。
我通过在两个Facebook函数中用常规相等替换严格相等来解决这个问题:
FB.Sys.isUndefined = function(o) { return o == undefined;};
FB.Sys.containsKey = function(d, key) { return d[key] != undefined;};
这使得事情对我有用,但似乎暗示了Facebook的JavaScript代码和我自己的代码之间的某种冲突。
是什么导致这种情况?
提示:undefined == null
和undefined !== null
有详细记录。这不是问题。问题是我们如何得到undefined !== undefined
。
答案 0 :(得分:89)
问题是与null相比,undefined使用==给出了true。 因此,对undefined的常见检查是这样完成的:
typeof x == "undefined"
这确保变量的类型确实是未定义的。
答案 1 :(得分:61)
事实证明,您可以将window.undefined设置为您想要的任何内容,因此当object.x是 real 未定义时,请获取object.x !== undefined
。在我的情况下,我无意中将undefined设置为null。
最简单的方法是:
window.undefined = null;
alert(window.xyzw === undefined); // shows false
当然,这不太可能发生。在我的情况下,错误更加微妙,相当于以下场景。
var n = window.someName; // someName expected to be set but is actually undefined
window[n]=null; // I thought I was clearing the old value but was actually changing window.undefined to null
alert(window.xyzw === undefined); // shows false
答案 2 :(得分:19)
我想发布一些关于undefined
的重要信息,初学者可能不知道这些信息。
请查看以下代码:
/*
* Consider there is no code above.
* The browser runs these lines only.
*/
// var a;
// --- commented out to point that we've forgotten to declare `a` variable
if ( a === undefined ) {
alert('Not defined');
} else {
alert('Defined: ' + a);
}
alert('Doing important job below');
如果您运行此代码,其中变量a
始终未使用var
声明,
你会得到一个ERROR EXCEPTION,并且令人惊讶地看不到任何警报。
而不是“在下面执行重要工作”,您的脚本将意外终止,在第一行上抛出未处理的异常。
以下是使用undefined
关键字检查typeof
的唯一防弹方式,该关键字专为此目的而设计:
/*
* Correct and safe way of checking for `undefined`:
*/
if ( typeof a === 'undefined' ) {
alert(
'The variable is not declared in this scope, \n' +
'or you are pointing to unexisting property, \n' +
'or no value has been set yet to the variable, \n' +
'or the value set was `undefined`. \n' +
'(two last cases are equivalent, don\'t worry if it blows out your mind.'
);
}
/*
* Use `typeof` for checking things like that
*/
此方法适用于所有可能的情况。
使用它的最后一个参数是undefined
可能在早期版本的Javascript中被覆盖:
/* @ Trollface @ */
undefined = 2;
/* Happy debuging! */
希望我足够清楚。
答案 3 :(得分:15)
使用==
等于运算符而不是===
是不好的做法。
undefined === undefined // true
null == undefined // true
null === undefined // false
object.x === undefined
如果true
是未知属性,则应返回x
。
在第Bad Parts of JavaScript: The Good Parts章中,Crockford写了以下内容:
如果您尝试从中提取值 一个对象,如果该对象没有 有一个有这个名字的成员,它 返回未定义的值。
除了undefined,JavaScript 有一个名为null的类似值。他们 是如此相似,==认为他们是 等于。这让一些程序员感到困惑 认为他们是 可互换,导致像
这样的代码value = myObject[name]; if (value == null) { alert(name + ' not found.'); }
将错误的值与之比较 错误的操作员。这段代码有效 因为它包含两个错误 互相取消。那太疯狂了 编程方式。写得更好 像这样:
value = myObject[name]; if (value === undefined) { alert(name + ' not found.'); }
答案 4 :(得分:10)
从 - JQuery_Core_Style_Guidelines
全局变量:
typeof variable === "undefined"
本地变量:
variable === undefined
属性:
object.prop === undefined
答案 5 :(得分:4)
var a;
typeof a === 'undefined'; // true
a === undefined; // true
typeof a === typeof undefined; // true
typeof a === typeof sdfuwehflj; // true
答案 6 :(得分:2)
A)。我从来没有,也永远不会相信任何声称在没有用户编码的情况下生成代码的工具,在用作图形工具的情况下它会加倍。
B)。我对Facebook Connect一直没有任何问题。它仍然是在浏览器中运行的普通旧JavaScript代码,无论您身在何处都是undefined===undefined
。
简而言之,您需要提供证据证明您的object.x确实是未定义的,而不是null或其他,因为我相信您所描述的实际情况是不可能的 - 没有冒犯:) - 我把钱投入到Tersus代码中存在的问题上。