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

2022-08-29 23:48:00

我对JavaScript和价值观有点困惑。undefinednull

实际上有什么作用?它是测试和还是只是?if (!testvar)undefinednullundefined

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

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

function test(var1, var2, var3) {

}

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

答案 1

我对Javascript undefined和null有点困惑。

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

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

  1. 调用参数数少于语句列表中参数列表的函数时,未传递的参数将设置为 。你可以用例如:functionundefined

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

    使用此方法,您无法区分 和 ; 两者中的值将相同。如果你需要分辨出区别,你可以看看,但是做这样的可选参数通常不是很可读。dosomething(1)dosomething(1, undefined)arg2arguments.length

  2. 当函数没有 时,它返回 。通常不需要使用这样的返回结果。return value;undefined

  3. 当您通过在块中包含语句来声明变量,但尚未为其赋值时,该变量为 。同样,你真的不需要依赖它。var aundefined

  4. 当 spooky 运算符的操作数是不存在的简单变量时,将返回该运算符,而不是像尝试引用它时通常发生的那样引发错误。(您也可以给它一个用括号括起来的简单变量,但不能给它一个涉及不存在的变量的完整表达式。这也没有多大用处。typeof'undefined'

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

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

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

    但是,因为您可以像任何其他值一样进行赋值:undefined

    o.prop= undefined;
    

    这实际上并不能检测到该物业是否可靠地存在。最好使用运算符,它不在原始的Netscape版本的JavaScript中,但现在随处可用:in

    if ('prop' in o)
        ...
    

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

实际上做了什么?它是测试未定义的和空的还是只是未定义的?if (!testvar)

这样的“真实性”检验针对 、、、 和空字符串进行检查。但在这种情况下,是的,它确实是它所关心的。IMO,它应该更明确地说明这一点,并说.falseundefinednull0NaNundefinedif (testvar!==undefined)

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

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

delete实际上意味着属性而不是变量本身。浏览器会让你直接逃脱,但这不是一个好主意,在 ECMAScript Fifth Edition 的严格模式下也不起作用。如果你想释放对某物的引用,以便可以对其进行垃圾收集,那么更常见的说法是。delete variablevariable= null

我可以将未定义作为参数传递吗?

是的。


答案 2

你不能(不应该?)将任何东西定义为未定义的,因为变量将不再是未定义的 - 你只是将其定义为某些东西。

你不能(不应该?)传递给一个函数。如果要传递空值,请改用。undefinednull

该语句检查布尔值真/假值,此特定值测试是否计算结果为 。根据定义,并且不应作为 或 进行计算,但 JavaScript 的计算结果为 ,并且如果您尝试计算未定义的变量,则会给出错误。if(!testvar)testvarfalsenullundefinedtruefalsenullfalse

要正确测试 或 ,请使用:undefinednull

if(typeof(testvar) === "undefined") { ... }

if(testvar === null) { ... }