JavaScript: undefined !== undefined?
注:根据ECMAScript5.1第15.1.1.3节,window.undefined是只读的。
- 现代浏览器正确地实现了这一点。例如:Safari 5.1、Firefox 7、Chrome 20等。
- 未定义在:chrome 14,…
当我最近将facebook connect与tersus集成在一起时,在尝试调用facebook api函数时,我最初收到了错误消息
结果发现问题的原因是
1 | object.x === undefined |
"object"中没有属性"x"时返回false。
我解决了这个问题,在两个facebook函数中用常规的相等替换了严格的相等:
1 2 | FB.Sys.isUndefined = function(o) { return o == undefined;}; FB.Sys.containsKey = function(d, key) { return d[key] != undefined;}; |
这让事情对我有用,但似乎暗示了Facebook的javascript代码和我自己的代码之间的某种冲突。
什么会导致这种情况?
提示:有很好的文献记载,
问题是,与使用==的空值相比,未定义的值为真。因此,对未定义的常见检查如下:
1 | typeof x =="undefined" |
这样可以确保变量的类型确实是未定义的。
结果是,您可以将window.undefined设置为您想要的任何值,所以当object.x是真正的未定义值时,可以得到
最简单的方法是:
1 2 | window.undefined = null; alert(window.xyzw === undefined); // shows false |
当然,这不太可能发生。在我的例子中,这个bug有点微妙,相当于下面的场景。
1 2 3 | 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 |
我想发布一些关于
查看以下代码:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 | /* * 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'); |
如果运行此代码,其中变量
您的脚本不会"在下面做重要的工作",而是意外终止,在第一行引发未处理的异常。
以下是使用
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 | /* * Correct and safe way of checking for `undefined`: */ if ( typeof a === 'undefined' ) { alert( 'The variable is not declared in this scope, ' + 'or you are pointing to unexisting property, ' + 'or no value has been set yet to the variable, ' + 'or the value set was `undefined`. ' + '(two last cases are equivalent, don\'t worry if it blows out your mind.' ); } /* * Use `typeof` for checking things like that */ |
这种方法适用于所有可能的情况。
最后一个使用它的理由是,在早期版本的javascript中,
1 2 3 | /* @ Trollface @ */ undefined = 2; /* Happy debuging! */ |
希望我足够清楚。
使用
1 2 3 | undefined === undefined // true null == undefined // true null === undefined // false |
如果
在javascript的"坏的部分:好的部分"一章中,Crockford写了以下内容:
If you attempt to extract a value from
an object, and if the object does not
have a member with that name, it
returns the undefined value instead.In addition to undefined, JavaScript
has a similar value called null. They
are so similar that == thinks they are
equal. That confuses some programmers
into thinking that they are
interchangeable, leading to code like
1
2
3
4 value = myObject[name];
if (value == null) {
alert(name + ' not found.');
}It is comparing the wrong value with
the wrong operator. This code works
because it contains two errors that
cancel each other out. That is a crazy
way to program. It is better written
like this:
1
2
3
4 value = myObject[name];
if (value === undefined) {
alert(name + ' not found.');
}
发件人-jquery_core_style_guidelines
全局变量:
typeof variable ==="undefined" 局部变量:
variable === undefined 性能:
object.prop === undefined
1 2 3 4 5 6 | var a; typeof a === 'undefined'; // true a === undefined; // true typeof a === typeof undefined; // true typeof a === typeof sdfuwehflj; // true |
A)我从来没有也永远不会相信任何一种工具,它声称在没有用户编码的情况下生成代码,而用户编码在图形化工具的情况下是双倍的。
B)我从来没有对Facebook Connect有过任何问题。无论您身在何处,它都是在浏览器和
简而言之,您需要提供证据证明您的object.x确实是未定义的,而不是空的或其他的,因为我相信您所描述的事实是不可能的-没有犯罪:)-我会把钱放在Tersus代码中存在的问题上。