当前位置:  开发笔记 > 编程语言 > 正文

JavaScript:undefined!== undefined?

如何解决《JavaScript:undefined!==undefined?》经验,为你挑选了5个好方法。

注意:根据ECMAScript5.1,第15.1.1.3节,window.undefined是只读的.

现代浏览器正确实现此功能 例如:Safari 5.1,Firefox 7,Chrome 20等.

未定义仍然可以改变:Chrome 14,...

当我最近将Facebook Connect与Tersus集成时,我最初收到错误消息,Invalid Enumeration ValueHandler 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.



1> Wolfram Krie..:

问题是与null相比,undefined使用==给出了true.因此,对undefined的常见检查是这样完成的:

typeof x == "undefined"

这确保了变量的类型确实是未定义的.


这里的许多答案中最大的误解是'undefined'是一个Javascript关键字.它根本不是关键字,而是(大多数情况下)恰好未定义的变量.因此,"somevar === undefined"唯一有效的时间是'undefined'变量确实尚未定义.我见过代码(jcanvas),其中类包装函数包含一个名为'undefined'的最后一个参数(从未使用过),只是为了确保函数范围内有一个名为'undefined'的未定义变量.除了这样的特殊情况,使用'typeof'是唯一"正确"的方式.
实际上,那不是真的.`undefined`不是关键字,但它是JavaScript内置的.引用实际上未定义的东西会引发一个`ReferenceError:无法定义的东西.

2> Youval Broni..:

事实证明,您可以将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属性的主要原因(而不是使用typeof).恭喜你完成这个bug.+1
始终命名对象的另一个原因... var n = blah.someName; 嗒嗒[N] = NULL; 会让你不会得到那个错误......

3> Dan..:

我想发布一些关于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');

如果您运行此代码,其中变量aHAS 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! */  

希望我足够清楚.



4> Török Gábor..:

使用==等于运算符代替的是一种不好的做法===.

undefined === undefined // true
null == undefined // true
null === undefined // false

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

在" 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.');
}



5> Dinuka Thila..:

来自 - JQuery_Core_Style_Guidelines

全局变量:
typeof variable === "undefined"

局部变量:
variable === undefined

属性:
object.prop === undefined

推荐阅读
落单鸟人
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有