JavaScript:undefined!== undefined?

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

  • 现代浏览器正确实现了这一点。 例如:Safari 5.1,Firefox 7,Chrome 20等
  • 未定义仍然可以改变:Chrome 14,…

当我最近整合Facebook连接与Tersus ,我最初收到错误消息Invalid Enumeration ValueHandler already exists当试图调用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代码和我自己之间的某种冲突。

什么可能导致这个?

提示:很好的logging, undefined == nullundefined !== null 。 这不是这个问题。 问题是我们如何得到undefined !== undefined

问题是未定义的比较null使用==给出了真实的。 未定义的常见检查就是这样完成的:

 typeof x == "undefined" 

这确保了variables的types真的是未定义的。

事实certificate,你可以设置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重要信息,哪些初学者可能不知道。

看下面的代码:

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

如果你运行这个代码,variablesa从来没有被声明为var ,那么你会得到一个ERROR EXCEPTION,而且令人惊讶的是根本看不到任何提醒。

你的脚本不是“在下面做重要工作”,而是在第一行抛出未处理的exception。


下面是使用typeof关键字检查undefined的唯一防弹方法,它是为此目的而devise的:

  /* * 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中可能覆盖undefined的:

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

希望我已经清楚了。

这是使用==等号运算符而不是===的不好的做法。

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

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

在“ JavaScript的 坏部分 :好的部分”一章中,Crockford写道:

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

除了未定义,JavaScript还有一个类似的值,名为null。 他们是如此相似,==认为他们是平等的。 这使一些程序员认为它们是可以互换的,导致类似的代码

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

它将错误的值与错误的操作符进行比较。 这段代码的工作原理是它包含两个互相抵消的错误。 这是一个疯狂的方式来编程。 最好这样写:

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

来自 – JQuery_Core_Style_Guidelines

  • 全局variables:
    typeof variable === "undefined"

  • 局部variables:
    variable === undefined

  • 属性:
    object.prop === undefined

 var a; typeof a === 'undefined'; // true a === undefined; // true typeof a === typeof undefined; // true typeof a === typeof sdfuwehflj; // true 

一个)。 我从来没有,也永远不会相信任何声称在没有用户编码的情况下产生代码的工具,这是一个graphics工具。

B)。 Facebook Connect从未遇到任何问题。 这是所有在浏览器中运行的普通的旧JavaScript代码,无论你身在何处, undefined===undefined

总之,你需要提供证据,certificate你的object.x真的没有被定义,也不是null或者其他的,因为我相信你所描述的实际上是不可能的 – 没有冒犯性的:) – 关于Tersus代码中存在的问题的钱。