JavaScript:undefined!== undefined?

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函数时,我最初收到了错误消息Invalid Enumeration ValueHandler already exists

结果发现问题的原因是

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代码和我自己的代码之间的某种冲突。

什么会导致这种情况?

提示:有很好的文献记载,undefined == nullundefined !== null。这不是问题所在。问题是我们如何得到undefined !== undefined


问题是,与使用==的空值相比,未定义的值为真。因此,对未定义的常见检查如下:

1
typeof x =="undefined"

这样可以确保变量的类型确实是未定义的。


结果是,您可以将window.undefined设置为您想要的任何值,所以当object.x是真正的未定义值时,可以得到object.x !== undefined。在我的例子中,我无意中把未定义设置为空。

最简单的方法是:

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


我想发布一些关于undefined的重要信息,初学者可能不知道。

查看以下代码:

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');

如果运行此代码,其中变量a从未使用var声明,您将得到一个错误异常,并意外地看到没有任何警报。

您的脚本不会"在下面做重要的工作",而是意外终止,在第一行引发未处理的异常。

以下是使用typeof关键字检查undefined的唯一防弹方法,该关键字是专门为此目的设计的:

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中,undefined可能会被覆盖:

1
2
3
     /* @ Trollface @ */
        undefined = 2;
     /* Happy debuging! */

希望我足够清楚。


使用==相等运算符而不是===是一种不好的做法。

1
2
3
undefined === undefined // true
null == undefined // true
null === undefined // false

如果x是未知属性,object.x === undefined应返回true

在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有过任何问题。无论您身在何处,它都是在浏览器和undefined===undefined中运行的普通老javascript代码。

简而言之,您需要提供证据证明您的object.x确实是未定义的,而不是空的或其他的,因为我相信您所描述的事实是不可能的-没有犯罪:)-我会把钱放在Tersus代码中存在的问题上。