哪种检查变量是否已初始化的方法更好/正确?(假设变量可以保存任何内容(字符串、int、对象、函数等))
if (elem) { // or !elem
or
if (typeof elem !== 'undefined') {
or
if (elem != null) {
哪种检查变量是否已初始化的方法更好/正确?(假设变量可以保存任何内容(字符串、int、对象、函数等))
if (elem) { // or !elem
or
if (typeof elem !== 'undefined') {
or
if (elem != null) {
当前回答
很难区分undefined和null。Null是一个值,当您想要指示变量没有特定值时,可以将其赋值给该变量。未定义是一个特殊值,它将是未分配变量的默认值。
var _undefined;
var _null = null;
alert(_undefined);
alert(_null);
alert(_undefined == _null);
alert(_undefined === _null);
其他回答
尝试捕捉
如果根本没有定义变量(例如:定义全局变量的外部库尚未加载-例如谷歌地图),您可以使用try-catch块检查这一点,无需中断代码执行,如下所示(不需要使用严格模式)
尝试{未定义变量;}捕获(e){console.log('检测到:变量不存在');}console.log('但代码仍在执行');未定义变量;//没有try-catch包装器代码在此处停止console.log('代码执行停止。您不会在控制台上看到此消息');
奖金:(参考其他答案)为什么==比==更清楚(来源)
如果(a==b)
如果(a===b)
我很惊讶这还没有被提及。。。
以下是使用此['var_name']的一些其他变体
使用此方法的好处是,它可以在定义变量之前使用。
if (this['elem']) {...}; // less safe than the res but works as long as you're note expecting a falsy value
if (this['elem'] !== undefined) {...}; // check if it's been declared
if (this['elem'] !== undefined && elem !== null) {...}; // check if it's not null, you can use just elem for the second part
// these will work even if you have an improper variable definition declared here
elem = null; // <-- no var here!! BAD!
我更喜欢这种方法,因为它的准确性和简洁性:
变量x如果(x===无效0){console.log(“x未定义”)}其他{console.log(“x已定义”)}
正如在其他评论和回答中提到的,undefined不能保证是undefineed。因为它不是关键字,所以可以在全局范围以外的范围中将其重新定义为变量。这里有一个小例子可以说明这种细微差别:
var undefined='bar'console.log(`在全局范围内:${undefined}`)函数foo(){var undefined=“已定义”变量x如果(x===未定义){console.log(`x===undefined`)}其他{console.log(`x!==undefined`)}如果(x===无效0){console.log(`x===void 0`)}其他{console.log(`x!==void 0`)}}foo()
请参阅void以了解兼容性(IE5支持!?!!哇!)。
测试未声明(未定义)变量的捷径是
if (typeof variable === "undefined") {
...
}
我发现它对于检测在浏览器外部运行的脚本(没有声明窗口变量)非常有用。
在问题中概述的特定情况下,
typeof window.console === "undefined"
与相同
window.console === undefined
我更喜欢后者,因为它更短。
请注意,我们只在全局范围内查找控制台(这是所有浏览器中的窗口对象)。在这种特殊情况下,这是可取的。我们不希望在其他地方定义控制台。
@BrianKelley在他出色的回答中解释了技术细节。我只是补充了不足的结论,并将其消化为更容易阅读的内容。