注意:根据ECMAScript5.1,第15.1.1.3节,window.undefined是只读的.
现代浏览器正确实现此功能 例如:Safari 5.1,Firefox 7,Chrome 20等.
未定义仍然可以改变:Chrome 14,...
当我最近将Facebook Connect与Tersus集成时,我最初收到错误消息,Invalid Enumeration Value
并Handler already exists
在尝试调用Facebook API函数时.
事实证明,问题的原因是
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
.
问题是与null相比,undefined使用==给出了true.因此,对undefined的常见检查是这样完成的:
typeof x == "undefined"
这确保了变量的类型确实是未定义的.
事实证明,您可以将window.undefined设置为您想要的任何内容,因此object.x !== undefined
当object.x是真正的未定义时获取.在我的情况下,我无意中将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
我想发布一些关于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
HAS NEEN BEEN DECLARED使用var
,您将获得错误异常,并且令人惊讶地看不到任何警报.
而不是"在下面执行重要工作",您的脚本将意外终止,在第一行上抛出未处理的异常.
以下是检查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! */
希望我足够清楚.
使用==
等于运算符代替的是一种不好的做法===
.
undefined === undefined // true null == undefined // true null === undefined // false
如果是未知属性,object.x === undefined
应该返回.true
x
在" Bad Bad 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.'); }
来自 - JQuery_Core_Style_Guidelines
全局变量:
typeof variable === "undefined"
局部变量:
variable === undefined
属性:
object.prop === undefined