小编典典

我可以将变量设置为未定义或将未定义作为参数传递吗?

all

我对 JavaScriptundefinednull价值观有点困惑。

实际上是做什么的if (!testvar)?它是否测试undefinedandnull或 just undefined

定义变量后,我可以将其清除回undefined(因此删除变量)吗?

我可以undefined作为参数传递吗?例如:

function test(var1, var2, var3) {

}

test("value1", undefined, "value2");

阅读 196

收藏
2022-03-29

共1个答案

小编典典

我对 Javascript undefined & null 有点困惑。

null通常行为类似于其他脚本语言的带外“null”、“nil”或“None”对象的概念。

undefined,另一方面,是一个奇怪的 JavaScript 怪癖。它是一个表示带外值的单例对象,本质上是第二个相似但不同的对象null。它出现:

  1. 当您调用参数少于function语句列表中的参数列表的函数时,未传递的参数设置为undefined. 您可以使用例如进行测试:

js function dosomething(arg1, arg2) { if (arg2===undefined) arg2= DEFAULT_VALUE_FOR_ARG2; ... }

使用这种方法,您无法区分dosomething(1)dosomething(1, undefined); arg2两者的值相同。如果你需要区分你可以看一下arguments.length,但是做这样的可选参数通常不是很可读。

  1. 当一个函数没有return value;时,它返回undefined。一般不需要使用这样的返回结果。

  2. 当您通过var a在块中使用语句来声明变量但尚未为其分配值时,它是undefined. 再一次,你不应该真的需要依赖它。

  3. 当它的操作数是一个不存在的简单变量时,幽灵typeof运算符返回,而不是像您尝试引用它时通常会发生的那样抛出错误。'undefined'(你也可以给它一个用括号括起来的简单变量,但不是一个包含不存在变量的完整表达式。)也没有多大用处。

  4. 这是有争议的。当您访问不存在的对象的属性时,您不会像在其他所有语言中那样立即收到错误。相反,你得到一个undefined对象。(然后当您稍后尝试undefined在脚本中使用该对象时,它会以一种奇怪的方式出错,这比 JavaScript 直接抛出错误更难追踪。)

这通常用于检查属性的存在:

js if (o.prop!==undefined) // or often as truthiness test, if (o.prop) ...do something...

但是,因为您可以undefined像分配任何其他值一样分配:

js o.prop= undefined;

这实际上并没有检测到该属性是否可靠。最好使用该in运算符,它不在最初的 Netscape 版本的 JavaScript 中,但现在随处可用:

js if ('prop' in o) ...

总而言之,undefined是 JavaScript 特有的一团乱麻,让每个人都感到困惑。除了可选的函数参数,JS 没有其他更优雅的机制,undefined应该避免。它不应该成为语言的一部分;null对于 (2) 和 (3) 本来可以正常工作的,而 (4) 是一个错误功能,它只存在是因为一开始 JavaScript 没有例外。

if (!testvar)实际上做什么?它是否测试未定义和 null 或只是未定义?

这样的“真实性”测试检查false, undefined, null,0NaN空字符串。但是在这种情况下,是的,它确实是undefined它所关心的。IMO,它应该更明确地说if (testvar!==undefined)

一旦定义了变量,我可以将其清除回未定义(因此删除变量)。

您当然可以分配undefined给它,但这不会删除变量。只有delete object.property操作员才能真正删除东西。

delete实际上是针对属性而不是变量本身。浏览器可以让您直接使用delete variable,但这不是一个好主意,并且在 ECMAScript 第五版的严格模式下不起作用。如果您想释放对某事物的引用以便对其进行垃圾收集,则更通常的说法是variable= null.

我可以将 undefined 作为参数传递吗?

是的。

2022-03-29