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

IT技术 javascript undefined
2021-03-12 10:32:30

我对 JavaScriptundefinednull有点困惑

什么是if (!testvar)真正做到?它是否测试undefinednull或只是undefined

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

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

function test(var1, var2, var3) {

}

test("value1", undefined, "value2");
6个回答

我对 Javascript undefined & null 有点困惑。

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

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

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

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

    使用这种方法,您无法区分dosomething(1)dosomething(1, undefined); arg2两者的值相同。如果您需要区分差异,您可以查看arguments.length,但执行这样的可选参数通常不是很容易阅读。

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

  3. 当您通过var a在块中使用语句来声明一个变量,但尚未为其赋值时,它是undefined. 同样,你真的不需要依赖它。

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

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

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

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

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

    o.prop= undefined;
    

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

    if ('prop' in o)
        ...
    

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

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

这样的“感实性”对测试检查falseundefinednull0NaN和空字符串。但是在这种情况下,是的,它确实与undefined它有关。IMO,应该更明确地说if (testvar!==undefined)

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

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

delete真正用于属性而不是变量本身。浏览器会让你摆脱直接delete variable,但这不是一个好主意,并且在 ECMAScript Fifth Edition 的严格模式下不起作用。如果你想释放对某物的引用以便它可以被垃圾收集,通常说variable= null.

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

是的。

固定,ta。(我倾向于不太担心重新分配,因为脚本可以重新定义很多事情,把一般情况下无法解决的一切都搞砸。)
2021-04-22 10:32:30
多么美妙的答案。我刚刚没有通过 JavaScript 测试:perfectkills.com/javascript-quiz 稍后我将重新阅读您的答案并再次尝试测试!
2021-04-25 10:32:30
#2 的一个警告,通常是一个没有return语句的函数返回undefined,但如果函数是一个构造函数(用new运算符调用),它会返回新对象(this构造函数内部的),尽管没有return语句。console.log((function (){}()));返回undefinedconsole.log((new function (){}()));返回一个对象。
2021-04-29 10:32:30
@bobinceundefined是单例对象吗?你是什​​么意思?它是一个原始值,而不是一个对象。
2021-05-15 10:32:30
@Hortitude:这就是(4)点。我一般不会typeof foo=='undefined'它趋向于被用于(4a)的全球嗅探,在这种情况下,我宁愿是明确的和说'foo' in window,或(4b)中测试针对undefined-值本身,在这种情况下,我宁愿是可读的和说foo===undefined从理论上讲测试typeof'undefined'能有一个用例,其他构造不能提供:嗅探本地变量的存在。然而实际上,您几乎总是知道哪些变量被声明为局部变量。
2021-05-20 10:32:30

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

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

该语句if(!testvar)检查布尔真/假值,这个特定的测试是否testvar评估为false根据定义,null并且undefined不应该既不评估为truefalse,但JavaScript的求值nullfalse,如果你试图评估一个未定义的变量给出了一个错误。

要正确测试undefinednull,请使用这些:

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

if(testvar === null) { ... }
您可以将某些内容定义为未定义。var a= undefined. 你可以通过fn(undefined)如果要查找p对象的未定义属性op已定义并设置为的属性之间的差异undefined,则必须使用'p' in o运算符。
2021-04-24 10:32:30
@IanGrainger:ECMAScript 5(在所有浏览器的当前版本中实现)主要通过创建undefined全局对象的不可变属性来解决这个问题,因此它比以前更安全。但是,仍然可以定义undefined在函数内调用的可变变量,因此问题并未完全消失。
2021-04-24 10:32:30
三重等号也检查类型,因此不执行类型强制。Douglas Crockford 建议不要使用类型强制运算符(==!=)。
2021-04-28 10:32:30
是否有理由不测试testvar === undefined而不是更复杂的typeof(testvar) === "undefined"
2021-04-28 10:32:30
typeof对未定义的变量使用测试还有另一个很好的理由:与null,undefined只是全局对象的一个​​属性,它本身可能会被重新定义。它只需要一种特定的编码风格和一个缺少的等号,undefined并被悄悄地改变:if (undefined = someVar) {...}
2021-05-03 10:32:30

基本的区别在于undefinednull代表不同的概念。

如果 onlynull可用,您将无法确定null是有意设置为值还是尚未设置该值,除非您使用了繁琐的错误捕获:例如

var a;

a == null; // This is true
a == undefined; // This is true;
a === undefined; // This is true;

但是,如果您有意将值设置为null,则严格相等与undefined失败,从而允许您区分nullundefined值:

var b = null;
b == null; // This is true
b == undefined; // This is true;
b === undefined; // This is false;

查看这里的参考资料,而不是依赖人们轻蔑地说像“总之, undefined 是 JavaScript 特定的混乱,让每个人都感到困惑”。仅仅因为你感到困惑,并不意味着它是一团糟。

https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/undefined

这种行为也不是 JavaScript 特有的,它完善了布尔结果可以是truefalse、未知 ( null)、 无值 ( undefined) 或出现问题 ( error)的通用概念

http://en.wikipedia.org/wiki/Undefined_value

而且仍然 null可以正常工作。a == nulltrue因为 Javascript 类型强制。
2021-04-28 10:32:30

检查空值的最佳方法是

if ( testVar !== null )
{
    // do action here
}

对于未定义

if ( testVar !== undefined )
{
    // do action here
}

您可以使用 undefined 分配变量。

testVar = undefined;
//typeof(testVar) will be equal to undefined.
检查空值的最佳方法是使用!==,而不是!=
2021-05-02 10:32:30

是的,你可以,因为 undefined 被定义为 undefined。

console.log(
   /*global.*/undefined === window['undefined'] &&
   /*global.*/undefined === (function(){})() &&
   window['undefined']  === (function(){})()
) //true

你的情况:

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

您还可以创建自己的未定义变量:

Object.defineProperty(this, 'u', {value : undefined});
console.log(u); //undefined