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

AJ.*_*AJ. 296 javascript undefined

我对JavaScript undefinednull价值观有点困惑.

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

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

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

function test(var1, var2, var3) {

}

test("value1", undefined, "value2");
Run Code Online (Sandbox Code Playgroud)

bob*_*nce 501

我对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;
        ...
    }
    
    Run Code Online (Sandbox Code Playgroud)

    用这种方法你无法区分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...
    
    Run Code Online (Sandbox Code Playgroud)

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

    o.prop= undefined;
    
    Run Code Online (Sandbox Code Playgroud)

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

    if ('prop' in o)
        ...
    
    Run Code Online (Sandbox Code Playgroud)

总之,这undefined是一个特定于JavaScript的混乱,让每个人都感到困惑.除了可选的函数参数,JS没有其他更优雅的机制,undefined应该避免.它永远不应该成为语言的一部分; null对于(2)和(3)来说,它的效果会很好,而(4)只是存在的错误,因为在开始时JavaScript没有例外.

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

这样的"感实性"测试检查对抗false,undefined,null,0,NaN和空字符串.但在这种情况下,是的,它确实undefined是关注的.国际海事组织,应该更明确地说并且说if (testvar!==undefined).

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

你当然可以分配undefined它,但不会删除变量.只有delete object.property操作员真正删除了东西.

delete真正意味着属性而不是变量.浏览器会让你直接逃脱delete variable,但这不是一个好主意,并且不适用于ECMAScript第五版的严格模式.如果你想释放对某些东西的引用以便它可以被垃圾收集,那么更常见的说法是variable= null.

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

是.

  • 多么棒的回答.我刚刚通过了JavaScript测试:http://perfectionkills.com/javascript-quiz/稍后我将重新阅读你的答案并再次尝试测试! (9认同)
  • #2的一个警告,通常是没有`return`语句的函数返回`undefined`,但是如果函数是构造函数(用`new`操作符调用),它将返回新对象(里面的`this`的值)尽管没有`return`语句,但构造函数).`console.log((function(){}()));`返回`undefined`.`console.log((new function(){}()));`返回一个对象. (4认同)
  • @bobince`undefined`是一个单例对象?你什么意思?它是一个原始值,而不是一个对象. (2认同)
  • @Hortitude:这是重点(4).我一般不会'typeof foo =='undefined'`; 它倾向于用于(4a)全局嗅探,在这种情况下我更喜欢明确并在窗口中说''foo',或者(4b)测试`undefined`-value本身,在这种情况下我更喜欢可读,并说'foo === undefined`.理论上,测试`typeof`对`'undefined'`可能有一个其他结构无法提供的用例:嗅探局部变量的存在.但实际上,你几乎总是知道哪些变量被声明为local. (2认同)

Tat*_*nen 16

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

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

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

要正确测试undefinednull使用这些:

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

if(testvar === null) { ... }
Run Code Online (Sandbox Code Playgroud)

  • 对于未定义的变量使用`typeof`测试有另一个很好的理由:与`null`不同,`undefined`只是全局对象的一个​​属性,本身可以重新定义.它只需要一个特定的编码风格和一个缺少的等号,并且`undefined`被默默地改变:`if(undefined = someVar){...}` (4认同)
  • 您可以将某些内容定义为未定义.`var a = undefined`.你可以通过`fn(undefined)`.如果你想找到对象`o`的未定义属性`p`和已经定义并设置为`undefined`的属性`p`之间的区别,你必须在o`运算符中使用`'p' . (3认同)
  • @IanGrainger:ECMAScript 5(在所有浏览器的当前版本中实现)主要通过使 `undefined` 成为全局对象的不可变属性来解决这个问题,因此它比以前更安全。但是,仍然可以在函数中定义一个名为“undefined”的可变变量,因此问题并没有完全消失。 (2认同)

小智 13

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

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

var a;

a == null; // This is true
a == undefined; // This is true;
a === undefined; // This is true;
Run Code Online (Sandbox Code Playgroud)

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

var b = null;
b == null; // This is true
b == undefined; // This is true;
b === undefined; // This is false;
Run Code Online (Sandbox Code Playgroud)

查看此处的引用,而不是依赖于人们轻率地说垃圾"总之,undefined是一个特定于JavaScript的混乱,这让每个人感到困惑".只是因为你感到困惑,这并不意味着它是一团糟.

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

这种行为也是不特定的JavaScript和它完成了广义的概念,一个布尔结果可能是true,false未知(null),没有值(undefined),或出事了(error).

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


rah*_*hul 11

检查空值的最佳方法是

if ( testVar !== null )
{
    // do action here
}
Run Code Online (Sandbox Code Playgroud)

并且未定义

if ( testVar !== undefined )
{
    // do action here
}
Run Code Online (Sandbox Code Playgroud)

你可以指定一个未定义的avariable.

testVar = undefined;
//typeof(testVar) will be equal to undefined.
Run Code Online (Sandbox Code Playgroud)

  • 检查空值的最好方法是使用`!==`,而不是`!=` (3认同)

小智 6

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

console.log(
   /*global.*/undefined === window['undefined'] &&
   /*global.*/undefined === (function(){})() &&
   window['undefined']  === (function(){})()
) //true
Run Code Online (Sandbox Code Playgroud)

你的情况:

test("value1", undefined, "value2")
Run Code Online (Sandbox Code Playgroud)

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

Object.defineProperty(this, 'u', {value : undefined});
console.log(u); //undefined
Run Code Online (Sandbox Code Playgroud)


Ski*_*ick 5

为了回答你的第一个问题,not运算符(!)将强制赋予它一个布尔值.所以null,0,false,NaN""(空字符串)都将出现错误.