JavaScript:undefined!== undefined?
注:根据ECMAScript5.1,第15.1.1.3节,window.undefined是只读的。
当我最近将Facebook Connect与Tersus集成时,我最初收到错误消息Invalid Enumeration Value
, Handler already exists
在尝试调用Facebook API函数时Handler already exists
。
原来,问题的原因是
object.x === undefined
“对象”中没有属性“x”时返回false。
我通过用两个Facebook功能中的常规平等来代替严格的平等来解决这个问题:
FB.Sys.isUndefined = function(o) { return o == undefined;};
FB.Sys.containsKey = function(d, key) { return d[key] != undefined;};
这让事情对我有用,但似乎暗示了Facebook的JavaScript代码和我自己的JavaScript代码之间的某种冲突。
什么会造成这种情况?
提示:有很多文档记录undefined == null
而undefined !== null
。 这不是问题。 问题是我们如何得到undefined !== undefined
。
问题在于,与使用==的null相比,未定义赋予true。 因此,未定义的常见检查就是这样完成的:
typeof x == "undefined"
这确保了变量的类型实际上是未定义的。
事实证明,您可以将window.undefined设置为您想要的任何内容,并且因此获取object.x !== undefined
当object.x是真正的未定义的时候。 在我的情况下,我无意中将undefined设置为null。
最容易看到这种情况的方法是:
window.undefined = null;
alert(window.xyzw === undefined); // shows false
当然,这不太可能发生。 在我的情况下,这个bug比较微妙,并且等同于以下情况。
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
我想发布一些关于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
,你会得到一个错误异常,并且令人惊讶地看不到任何警报。
而不是'做重要工作',脚本将终止意外,在第一行抛出未处理的异常。
这是使用typeof
关键字来检查undefined
的唯一防弹方法,该关键字专为此目的而设计:
/*
* 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
*/
此方法适用于所有可能的情况。
使用它的最后一个参数是在早期版本的Javascript中可能覆盖undefined
的:
/* @ Trollface @ */
undefined = 2;
/* Happy debuging! */
希望我很清楚。
链接地址: http://www.djcxy.com/p/19421.html