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

if (!testvar)实际上做什么?它是否测试为undefined和null或只是undefined?

一旦一个变量被定义,我可以把它清除回未定义(因此删除变量)?

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

function test(var1, var2, var3) {

}

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

当前回答

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

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

语句if(!testvar)检查布尔值为true/false,这个语句测试testvar的结果是否为false。根据定义,null和undefined既不应该被赋值为true也不应该被赋值为false,但是JavaScript将null赋值为false,如果您尝试求值一个undefined变量,则会给出一个错误。

要正确地测试undefined或null,请使用以下命令:

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

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

其他回答

for if (something)和if (!something)通常用于检查某物是否有定义。例如:

if (document.getElementById)

标识符被转换为布尔值,因此undefined被解释为false。当然,还有其他值(如0和")也被解释为false,但要么标识符不应该有这样的值,要么您乐于将这样的值视为未定义。

Javascript有一个删除操作符,可以用来删除对象的成员。根据变量的作用域(即,如果它是全局的或非全局的),你可以删除它,使其未定义。

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

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

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

语句if(!testvar)检查布尔值为true/false,这个语句测试testvar的结果是否为false。根据定义,null和undefined既不应该被赋值为true也不应该被赋值为false,但是JavaScript将null赋值为false,如果您尝试求值一个undefined变量,则会给出一个错误。

要正确地测试undefined或null,请使用以下命令:

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

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

如何在命令行中设置一个变量为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

只是为了好玩,这里有一种相当安全的方法将“未赋值”赋值给变量。为了产生碰撞,需要有人在Object原型中添加与随机生成的字符串完全相同的名称。我确信随机字符串生成器可以得到改进,但我只是从这个问题中取了一个:在JavaScript中生成随机字符串/字符

这是通过创建一个新对象并尝试访问一个随机生成的名称在它上的属性,我们假设不存在,因此将有undefined的值。

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()];

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

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