如您所见,undefined 不是 javascript 中的关键字(对吗?)。所以我们可以将它用作变量,尽管我确信这是一个坏主意。现在我的问题是为什么我不能为不明确的。
代码:
var undefined=3;
undefined;//still undefined
任何建议将不胜感激。
如您所见,undefined 不是 javascript 中的关键字(对吗?)。所以我们可以将它用作变量,尽管我确信这是一个坏主意。现在我的问题是为什么我不能为不明确的。
代码:
var undefined=3;
undefined;//still undefined
任何建议将不胜感激。
因为在旧环境中(在 JS 1.8.5 之前),可以更改 undefined 的值,并且检查不存在的东西是以可能破坏的方式进行的。在自己的闭包中开发库是一种常见的选择,使用 IIFE 模式来创建一个未从外部代码(例如 jQuery 和大多数库)触及的变量 undefined,这是一个示例:
(function(undefined) {
//code which safely uses undefined
})();
请注意,调用了一个参数,并且在没有任何参数undefined
的情况下调用了 IIFE ,这使得它实际上变成了. 在较新的环境中,无法更改 undefined 的值,但为了向后兼容,它还被大量使用。undefined
undefined
然而,检查未定义类型的最安全方法是使用typeof
. 实际上,它的用法不能以任何方式被覆盖,并且可以安全地使用:typeof foo == 'undefined'
.
请记住, undefined和undeclared之间存在细微差别:
var x; //declared but undefined
x === undefined; //true
但是在较旧的环境中,您可以做到
var undefined = 1;
var x; //declared, of type undefined, but...
x === undefined // false, because undefined is 1 and x is of type undefined
正如我之前所说,检查未定义变量的最安全方法(确保它可以在旧环境中工作)是使用 typeof:
var undefined = 1;
var x;
typeof x == 'undefined'; //true
还要记住,使用相等性检查(==
)undefined
也检查null
(事实上,undefined == null
但是undefined !== null
),所以我建议使用严格相等运算符(===
),它只 undefined
检查。
根据MDN,从 JavaScript 1.8.5 开始, undefined 变得不可写。这表明在此之前将其用作变量是完全“合法的”。
但这显然不是一个好主意。
请参阅此处http://javascriptweblog.wordpress.com/2010/08/16/understanding-undefined-and-preventing-referenceerrors/如何在 JavaScript 中使用“未定义”的完整解释(我不是作者)
与其他语言相比,JavaScript 的 undefined 概念有点混乱。特别是,试图理解 ReferenceErrors(“x 未定义”)以及如何最好地针对它们进行编码可能会令人沮丧。
在 JavaScript 中有未定义(类型)、未定义(值)和未定义(变量)。
Undefined (type) 是一个内置的 JavaScript 类型。
undefined (value) 是一个原始类型,是 Undefined 类型的唯一值。任何尚未分配值的属性都假定为未定义的值。(ECMA 4.3.9 和 4.3.10)。没有 return 语句的函数或带有空 return 语句的函数返回 undefined。未提供的函数参数的值未定义。
undefined (variable) 是一个全局属性,其初始值为 undefined (value),由于它是一个全局属性,我们也可以将其作为变量访问。
从 ECMA 3 开始,它的值可以重新分配:
undefined = "washing machine"; //assign a string to undefined (variable)
typeof undefined //"string"
f = undefined;
typeof f; //"string"
f; //"washing machine"
不用说,将值重新分配给未定义的变量是非常糟糕的做法,实际上 ECMA 5 不允许这样做(尽管在当前的完整浏览器版本中,只有 Safari 强制执行此操作)。