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

时间:2010-02-10 09:20:05

标签: javascript undefined

我对JavaScript的undefinednull值感到有点困惑。

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

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

我可以将undefined作为参数传递吗? E.g:

function test(var1, var2, var3) {

}

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

10 个答案:

答案 0 :(得分:487)

  

我对Javascript undefined&空。

不要对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运算符,该运算符不在原始的Netscape版本的JavaScript中,但现在随处可用:

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

      

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

    这种“真实性”测试会检查falseundefinednull0NaN和空字符串。但在这种情况下,是的,它确实是undefined所关注的。国际海事组织,它应该更加明确,并说if (testvar!==undefined)

      

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

    您当然可以为其分配undefined,但这不会删除该变量。只有delete object.property运算符才会删除。

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

      

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

答案 1 :(得分:16)

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

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

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

要正确测试undefinednull,请使用以下命令:

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

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

答案 2 :(得分:12)

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

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

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),没有值({{1 }},或出了什么问题(undefined)。

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

答案 3 :(得分:11)

检查空值的最佳方法是

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

和未定义的

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

您可以使用undefined分配aariable。

testVar = undefined;
//typeof(testVar) will be equal to undefined.

答案 4 :(得分:6)

是的,你可以,因为未定义的defined未定义。

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

你的案子:

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

你也可以create你自己的未定义变量:

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

答案 5 :(得分:5)

要回答你的第一个问题,not运算符(!)将强制赋予它一个布尔值。因此,null0falseNaN""(空字符串)都会显示为false。

答案 6 :(得分:2)

JavaScript,如何在命令行上将变量设置为undefined:

在Ubuntu 12.10上的Java附带的js javascript命令行终端中将变量设置为undefined。

el@defiant ~ $ js

js> typeof boo
"undefined"

js> boo
typein:2: ReferenceError: boo is not defined

js> boo=5
5

js> typeof boo
"number"

js> delete(boo)
true

js> typeof boo
"undefined"

js> boo
typein:7: ReferenceError: boo is not defined

如果在javascript中将变量设置为undefined:

把它放在myjs.html中:

<html>
<body>
    <script type="text/JavaScript">
        document.write("aliens: " + aliens);
        document.write("typeof aliens: " + (typeof aliens));
        var aliens = "scramble the nimitz";
        document.write("found some aliens: " + (typeof aliens));
        document.write("not sayings its aliens but... " + aliens);
        aliens = undefined;
        document.write("aliens deleted");
        document.write("typeof aliens: " + (typeof aliens));
        document.write("you sure they are gone? " + aliens);
    </script>
</body>
</html>

打印出来:

aliens: undefined
typeof aliens: undefined
found some aliens: string
not sayings its aliens but... scramble the nimitz
aliens deleted
typeof aliens: undefined
you sure they are gone? undefined

警告!将变量设置为undefined时,您将变量设置为另一个变量。如果某个偷偷摸摸的人运行undefined = 'rm -rf /';,那么无论何时将变量设置为undefined,您都会收到该值。

您可能想知道我如何在开始时输出未定义的值外星人并让它仍然运行。这是因为javascript挂起:http://www.adequatelygood.com/JavaScript-Scoping-and-Hoisting.html

答案 7 :(得分:2)

试试这个:

// found on UglifyJS
variable = void 0;

答案 8 :(得分:0)

for if (something)if (!something)通常用于检查是否定义了某些内容。例如:

if (document.getElementById)

标识符转换为布尔值,因此undefined被解释为false。当然还有其他值(如0和'')也被解释为false,但是标识符不应该合理地具有这样的值,或者您很乐意将这样的值视为未定义。< / p>

Javascript有一个delete运算符,可用于删除对象的成员。根据变量的范围(即,如果它是全局的),您可以删除它以使其未定义。

没有undefined关键字可用作未定义的文字。您可以省略函数调用中的参数以使它们未定义,但只能通过向函数发送较少的参数来使用,您不能在中间省略参数。

答案 9 :(得分:0)

只是为了好玩,这是一种将“未分配”分配给变量的相当安全的方法。要发生冲突,需要有人为Object添加原型,其名称与随机生成的字符串完全相同。我确信随机字符串生成器可以改进,但我刚从这个问题中选择了一个:Generate random string/characters in JavaScript

这是通过创建一个新对象并尝试使用随机生成的名称访问其上的属性来实现的,我们假设该名称不存在,因此将具有未定义的值。

function GenerateRandomString() {
    var text = "";
    var possible = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789";

    for (var i = 0; i < 50; i++)
        text += possible.charAt(Math.floor(Math.random() * possible.length));

    return text;
}

var myVar = {}[GenerateRandomString()];