如何将JavaScript变量设置为未定义

40

给定:

console.log(boo); this outputs undefined

给定:

var boo = 1;
console.log(boo); this outputs 1

在定义boo并将其设置为1之后,我该如何重置boo,以便console.log输出undefined?

谢谢


1
不要这样做。null是更好的选择。 - Randy L
@coldtree 请将您的已采纳答案更改为gooseberry的答案。 - Jay Jay Jay
1
Colin的回答也非常好:https://dev59.com/fW025IYBdhLWcg3wyZIn#24748543 - RhinoDevel
6个回答

50

解决方案

为了可靠地将变量boo设置为undefined,请使用一个带有空的return表达式的函数:

boo = (function () { return; })();

执行完这行代码后,typeof(boo) 的值为 'undefined',无论 undefined 全局属性是否被设置为其他的值。例如:

undefined = 'hello';
var boo = 1;
console.log(boo); // outputs '1'
boo = (function () { return; })();
console.log(boo); // outputs 'undefined'
console.log(undefined); // outputs 'hello'

编辑 但是也请参考 @Colin 的 简单方法

参考文献

自ECMAScript 1以来,该行为就已经是标准了。 相关规范部分地说明:

语法

return [此处无LineTerminator] Expression ;

语义

return语句会导致函数停止执行并将值返回给调用者。 如果省略Expression,则返回值为undefined

要查看原始规范,请参阅:

附录

为了完整起见,我附加了一个简要概述此问题的其他解决方法以及对这些方法的反驳,这是基于其他回答者的答案和评论。

1. 将boo赋值为undefined

boo = undefined; // not recommended
尽管将undefined直接赋值给boo更简单,但undefined不是保留字,并且可以被替换为任意值,例如数字或字符串。详情请看 2. 删除boo
delete boo; // not recommended

删除boo会完全删除boo的定义,而不是将其赋值为undefined,即使这样做只有在boo是全局属性时才会生效。仅当如此


9
关于你提到的附录第一项:根据MDN文档,“在现代浏览器(JavaScript 1.8.5 / Firefox 4+)中,根据ECMAScript 5规范,undefined是一个不可配置的、不可写的属性。”因此,在“现代浏览器”中,boo = undefined;是安全的,因为undefined无法被覆盖。 - TachyonVortex
3
返回语句是不是多余的?这个对我有用: _foo = (function () {})(); - Andresch Serj
3
@AndreschSerj 我也试过了,这个方法对我也有效。return语句是多余的。我的IDE也有提示 :) - Mickey Puri
1
在此还可以看到Colin的更简单的解决方案链接 - Gooseberry

44

16

你可以简单地将一个变量赋值为undefined:

boo = undefined;

或者,您可以使用delete运算符来删除变量:

delete boo;

9

delete boo

不要使用var boo = undefined。undefined只是一个变量,如果有人设置undefined = "hello",那么你将在任何地方得到hello :)

编辑:

null并不等同于undefined。已删除此部分。


8
你不能删除boo,它是一个变量。只有当变量在全局作用域中时才有效,即使如此,在IE浏览器中也无法正常工作,并且在严格模式下会抛出错误。 - Esailija
请注意,这可能无法在每个JavaScript运行时环境中正常工作。我在Node.js中尝试过,但它没有起作用。 - Lee Jenkins
3
Esailija是正确的。根据MDN文档:“delete仅适用于对象属性。它对变量或函数名称没有影响。” - TachyonVortex

3
var boo = 1;
console.log(boo); // prints 1
boo = undefined;
console.log(boo); // now undefined

2
这在Chrome的Javascript控制台上可以运行:
delete(boo)

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接