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