JavaScript:未定义!== 未定义?

IT技术 javascript
2021-01-14 05:58:50

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

  • 现代浏览器正确地实现了这一点。例如:Safari 5.1、Firefox 7、Chrome 20 等。
  • Undefined 在以下版本中仍然可以更改:Chrome 14,...

当我最近将Facebook ConnectTersus集成时,我最初收到错误消息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 == nullundefined !== null. 这不是这里的问题。问题是我们是怎么得到的undefined !== undefined

6个回答

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

typeof x == "undefined"

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

此处许多答案中最大的误解是“未定义”是 Javascript 关键字。它根本不是关键字,而是一个(大部分时间)碰巧未定义的变量。所以“somevar === undefined”唯一有效的时候是“undefined”变量真的没有被定义。我见过代码 (jcanvas),其中类包装函数包含一个名为“undefined”(从未使用过)的最后一个参数,只是为了确保在函数范围内会有一个名为“undefined”的未定义变量。除了这样的特殊情况,使用 'typeof' 是唯一“正确”的方法。
2021-03-18 05:58:50
这是否意味着,只要它永远不会被定义,我也可以使用 garlglblarg 代替 undefined ?
2021-03-20 05:58:50
有人可以解释为什么 myVar === undefined 会引发 ReferenceError,而 this.myVar === undefined 不会(只是返回 true)?PS myVar 从未被定义。
2021-03-25 05:58:50
@Dercsár:是的,var foo; foo === undefined // true
2021-03-30 05:58:50
事实上,事实并非如此。undefined不是关键字,但它是 JavaScript 内置的。引用实际上未定义的内容会引发ReferenceError: whatever is not defined.
2021-04-07 05:58:50

事实证明,您可以将 window.undefined 设置为您想要的任何值,因此object.x !== undefined在 object.x 是真正的undefined得到就我而言,我无意中将 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
虽然它不能在现代浏览器中被覆盖
2021-03-18 05:58:50
啊哈!是主要的原因,我反对用未定义的属性(相对于使用typeof)。恭喜你解决了这个错误。+1
2021-03-22 05:58:50
始终为对象命名的另一个原因... var n = blah.someName; 等等[n]=空;会让你永远不会得到那个错误......
2021-03-29 05:58:50

我想发布一些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 NEVER BEEN BEEN BEEN BEEN BEEN BEEN BEEN BEEN BEEN BEEN BEEN BEEN BEEN BEEN BEEN BEEN 使用var,您将得到一个错误异常并且令人惊讶的是根本看不到任何警报。

您的脚本将意外终止,而不是“在下面做重要的工作”,在第一行抛出未处理的异常。


这是检查undefinedusingtypeof关键字的唯一防弹方法,专为此目的而设计:

   /* 
    * 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! */  

希望我说得够清楚了。

function xx(a) { if(a === undefined)a='default'; } xx() - 这是在 javascript 中安排默认参数的好方法
2021-04-07 05:58:50

使用==相等运算符而不是===.

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

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

在第二章坏件JavaScript的:好零件,克罗克福德写入以下:

如果您尝试从对象中提取值,并且该对象没有具有该名称的成员,则它会返回未定义的值。

除了 undefined,JavaScript 还有一个类似的值叫做 null。他们是如此相似以至于 == 认为他们是平等的。这让一些程序员感到困惑,认为它们是可以互换的,导致代码如下

value = myObject[name];
if (value == null) {
    alert(name + ' not found.');
}

它正在将错误的值与错误的运算符进行比较。此代码有效,因为它包含两个相互抵消的错误。这是一种疯狂的编程方式。最好这样写:

value = myObject[name];
if (value === undefined) {
    alert(name + ' not found.');
}
你有没有读过这篇精彩的文章:webreflection.blogspot.ie/2010/10/...
2021-03-22 05:58:50
(value == null)通常可以是一个完全理智和有效的比较。您实际上多久区分未定义的内容和明确为空的内容?为什么没有value很少重要
2021-04-04 05:58:50

来自 - JQuery_Core_Style_Guidelines

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

  • 局部变量:
    variable === undefined

  • 特性:
    object.prop === undefined

只是一个说明 - 如果一个变量根本不存在,那么它既不是局部的也不是全局的。不太直观的是,我们应该像检查全局变量一样检查那些可能不存在的变量,正如 Dan 在他的示例中向我们展示的那样。
2021-04-03 05:58:50