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

我对JavaScript的undefined值和null值有点困惑。

if (!testvar)实际上做了什么? 它测试undefinednull或只是undefined

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

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

function test(var1, var2, var3) {

}

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

我对Javascript undefined&null有点困惑。

不要对null感到困惑。 它通常是有意义的,其行为与其他脚本语言的带外'null','nil'或'None'对象的概念相似。

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

  • 当您调用function语句列表中的参数数量少于参数列表的function ,超出的参数将设置为undefined 。 你可以用例如:

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

    用这种方法你不能区分dosomething(1)dosomething(1, undefined)之间的区别; arg2在两者中都是相同的值。 如果你需要说明不同之处,你可以看看arguments.length ,但是做这样的可选参数通常不太可读。

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

  • 当你通过在一个块中声明一个var a语句来声明一个变量,但尚未给它赋值时,它是undefined 。 再一次,你不应该真的需要依靠那个。

  • 当它的操作数是一个不存在的简单变量时,这个令人毛骨悚然的typeof运算符返回'undefined' ,而不是像通常发生的那样抛出错误,如果你试图引用它。 (你也可以给它一个包含在括号中的简单变量,但不能包含一个不存在变量的完整表达式)。对此也没什么用处。

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

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

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

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

    o.prop= undefined;
    

    这实际上并没有检测到房产是否有可靠的存在。 最好使用in运算符,该运算符不在原始的Netscape版本的JavaScript中,但现在到处都可用:

    if ('prop' in o)
        ...
    
  • 总之, undefined是一个JavaScript特定的混乱,混淆了每个人。 除了可选的函数参数,其中JS没有其他更优雅的机制,应该避免undefined 。 它不应该是语言的一部分; null对于(2)和(3)来说工作得很好,而(4)是只存在的错误特征,因为在开始时JavaScript没有例外。

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

    这种'真实性'测试针对falseundefinednull0NaN和空字符串进行检查。 但是在这种情况下,是的,它确实undefined它所关心的。 国际海事组织,它应该更明确的说, if (testvar!==undefined)

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

    你当然可以为它undefined ,但不会删除变量。 只有delete object.property操作符才能真正删除东西。

    delete实际上是指属性而不是变量。 浏览器会让你直接delete variable ,但这不是一个好主意,并且不适用于ECMAScript第五版的严格模式。 如果你想释放一个对某些东西的引用,以便它可以被垃圾回收,那么通常说variable= null

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

    是。


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

    你不能(不应该)将undefined传递给一个函数。 如果您想传递一个空值,请使用null

    语句if(!testvar)检查布尔真/假值,这个特定的测试testvar是否计算为false 。 根据定义, nullundefined不应被评估为truefalse ,但JavaScript会将null评估为false ,并且如果您尝试评估未定义的变量,则会发出错误。

    要正确测试undefinednull ,请使用以下内容:

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

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

    如果只有null可用,那么您将无法确定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 ,unknown( null ),no value( undefined )或出错( error )的概念。

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

    链接地址: http://www.djcxy.com/p/76653.html

    上一篇: Can I set variables to undefined or pass undefined as an argument?

    下一篇: How do I check for null values in JavaScript?