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

JavaScript:未定义!==未定义?,javascript,Javascript,注意:根据,window.undefined是只读的 现代浏览器正确地实现了这一点。例如:Safari5.1、Firefox7、Chrome20等 Undefined在:Chrome 14 当我最近与集成时,最初在尝试调用Facebook API函数时收到错误消息无效枚举值,并且处理程序已经存在 原来问题的原因是 object.x === undefined 当“对象”中没有属性“x”时返回false 我解决了这个问题,在两个Facebook函数中将严格平等替换为常规平等: FB.Sys.

注意:根据,window.undefined是只读的

  • 现代浏览器正确地实现了这一点。例如:Safari5.1、Firefox7、Chrome20等
  • Undefined在:Chrome 14
当我最近与集成时,最初在尝试调用Facebook API函数时收到错误消息
无效枚举值
,并且
处理程序已经存在

原来问题的原因是

object.x === undefined
当“对象”中没有属性“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!==空
。这不是这里的问题。问题是我们如何得到
未定义!==undefined

问题在于,undefined与null相比,使用==给出true。 因此,对undefined的常规检查如下所示:

typeof x == "undefined"
value = myObject[name];
if (value === undefined) {
    alert(name + ' not found.');
}
这确保了变量的类型实际上是未定义的。

A)。我从来没有也永远不会相信任何工具,它声称在没有用户编码的情况下生成代码,而用户编码是图形工具的两倍

B) 。我在Facebook Connect上从来没有遇到过任何问题。无论您身在何处,它仍然是在浏览器中运行的普通老JavaScript代码,并且
undefined===undefined


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

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

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

在第章中,Crockford写道:

如果试图从中提取值 一个对象,如果该对象没有 有一个叫这个名字的成员,它 返回未定义的值

除了未定义的JavaScript之外 具有一个名为null的类似值。他们 它们如此相似以至于==认为它们是相似的 平等。这让一些程序员感到困惑 认为他们是 可互换,导致类似代码

value = myObject[name];
if (value == null) {
    alert(name + ' not found.');
}
它将错误的值与 接线员搞错了。此代码有效 因为它包含两个错误 相互抵消。那是一个疯狂的想法 编程的方式。它写得更好 像这样:

typeof x == "undefined"
value = myObject[name];
if (value === undefined) {
    alert(name + ' not found.');
}

事实证明,您可以将window.undefined设置为您想要的任何值,从而获得
object.x!==未定义
当object.x是真正的未定义对象时。在我的例子中,我无意中将undefined设置为null

最简单的方法是:

window.undefined = null;
alert(window.xyzw === undefined); // shows false
当然,这不太可能发生。在我的例子中,这个bug稍微微妙一点,相当于下面的场景

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

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

请看以下代码:

 /* 
  * 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
的唯一防弹方法,该关键字的设计正是为了此目的:

   /* 
    * 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
    */
这种方法适用于所有可能的情况

使用它的最后一个参数是,
未定义
可能在早期版本的Javascript中被覆盖:

     /* @ Trollface @ */
        undefined = 2;
     /* Happy debuging! */  
希望我说得够清楚

来自-

var a;

typeof a === 'undefined'; // true
a === undefined; // true
typeof a === typeof undefined; // true
typeof a === typeof sdfuwehflj; // true
  • 全局变量:
    typeof变量==“未定义”

  • 局部变量:
    变量===未定义

  • 属性:
    object.prop==未定义


谢谢你,安娜卡塔。你怀疑的回答让我重新审视这个问题,并找到正确的答案(见下文)。啊哈!这就是我反对使用未定义属性(而不是使用typeof)的主要原因。恭喜你解决了这个问题+1始终为对象命名名称空间的另一个原因。。。var n=blah.someName;blah[n]=null;可能会让你永远不会得到那个错误…它不能在现代浏览器中被覆盖,尽管这里的许多答案中最大的误解是“undefined”是一个Javascript关键字。它根本不是一个关键字,而是一个(大多数情况下)碰巧未定义的变量。因此,“somevar===undefined”唯一起作用的时间是“undefined”变量实际上还没有定义的时候。我看过代码(jcanvas),其中类包装函数包含最后一个名为“undefined”的参数(从未使用过),只是为了确保函数范围内有一个名为“undefined”的未定义变量。除了这样的特殊情况外,使用“typeof”是唯一“正确”的方法。这是否意味着,在没有定义的情况下,我也可以使用garglblarg,只要它从未被定义过?@Dercsár:是的,
var foo;foo==未定义//true
。事实上,这不是真的
undefined
不是关键字,但它是内置的JavaScript。引用实际未定义的内容会引发一个
ReferenceError:未定义的内容都会引发一个
。有人能解释一下为什么myVar==undefined会引发ReferenceError,而this.myVar==undefined不会(只返回true)?P.S.myVar从未定义过。
函数xx(a){if(a==undefined)a='default';}xx()
-这是在ja中排列默认参数的一种好方法