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

Can I set variables to undefined or pass undefined as an argument?

我对javascript的undefinednull值有点困惑。

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

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

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

1
2
3
4
5
function test(var1, var2, var3) {

}

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


I'm a bit confused about Javascript undefined & null.

不要对null感到困惑。它通常是有意义的,其行为类似于其他脚本语言关于带外"空"、"零"或"无"对象的概念。

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

  • 当调用参数少于function语句列表中的参数列表的函数时,未通过的参数设置为undefined。你可以用例如:

    1
    2
    3
    4
    5
    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直接抛出错误更难跟踪。)

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

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

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

    1
    o.prop= undefined;

    但这并不能真正检测到房地产是否可靠。最好使用in操作符,它不在最初的Netscape版本的javascript中,但现在可以在任何地方使用:

    1
    2
    if ('prop' in o)
        ...
  • 总之,undefined是一个特定于javascript的混乱局面,它让每个人都感到困惑。除了可选的函数参数,JS没有其他更优雅的机制,应该避免使用undefined。它不应该是语言的一部分;对于(2)和(3)来说,null应该是很好的,(4)是一个错误的功能,因为在最初的javascript中没有例外。

    what does if (!testvar) actually do? Does it test for undefined and null or just undefined?

    这样的"真实性"测试检查了falseundefinednull0NaN和空字符串。但在这种情况下,是的,这确实是它所关心的问题。在我看来,这一点应该更加明确,比如说if (testvar!==undefined)

    once a variable is defined can I clear it back to undefined (therefore deleting the variable).

    您当然可以将undefined赋给它,但这不会删除变量。只有delete object.property运算符才能真正删除内容。

    delete实际上是用于属性而不是变量。浏览器可以让你摆脱直截了当的delete variable,但这不是一个好主意,不能在ecmascript第五版的严格模式下工作。如果您希望释放对某个对象的引用,以便可以对其进行垃圾收集,那么更常见的做法是说variable= null

    can I pass undefined as a parameter?

    对。


    你不能(不应该?)将任何内容定义为未定义,因为变量不再是未定义的–您只是将其定义为某个内容。

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

    声明if(!testvar)检查布尔真/假值,这个特殊的语句测试testvar是否评估为false。根据定义,不应该将nullundefined评估为truefalse,但javascript将null评估为false,如果试图评估未定义的变量,则给出错误。

    要正确测试undefinednull,请使用:

    1
    2
    3
    if(typeof(testvar) ==="undefined") { ... }

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


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

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

    1
    2
    3
    4
    5
    var a;

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

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

    1
    2
    3
    4
    var b = null;
    b == null; // This is true
    b == undefined; // This is true;
    b === undefined; // This is false;

    查看这里的引用,而不是轻蔑地说"总之,未定义是一个特定于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/undefinedu值


    检查空值的最佳方法是

    1
    2
    3
    4
    if ( testVar !== null )
    {
        // do action here
    }

    对于未定义的

    1
    2
    3
    4
    if ( testVar !== undefined )
    {
        // do action here
    }

    可以指定一个未定义的可用项。

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


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

    1
    2
    3
    4
    5
    console.log(
       /*global.*/undefined === window['undefined'] &&
       /*global.*/undefined === (function(){})() &&
       window['undefined']  === (function(){})()
    ) //true

    你的情况:

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

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

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

    要回答第一个问题,not运算符(!将强制将给定的值转换为布尔值。因此,null0falseNaN""(空字符串)都会出现错误。


    试试这个:

    1
    2
    // found on UglifyJS
    variable = void 0;

    javascript,如何在命令行上将变量设置为未定义:

    在Ubuntu 12.10的EDCOX1、0、JavaScript命令行终端中设置变量为未定义的。

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    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中将变量设置为未定义:

    把它放在myjs.html中:

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    <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);
       
    </body>
    </html>

    它打印:

    1
    2
    3
    4
    5
    6
    7
    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 = 'rm -rf /';,那么每当您将变量设置为未定义时,您将收到该值。

    您可能想知道我如何在开始时输出未定义的值aliens并使其仍然运行。这是因为javascript提升:http://www.adequatelygood.com/javascript-scoping-and-lifting.html


    为了好玩,这里有一个相当安全的方法来为变量分配"未分配"。要使其发生冲突,需要有人将与随机生成的字符串同名的对象添加到原型中。我确信可以改进随机字符串生成器,但我只是从这个问题中选择了一个:在javascript中生成随机字符串/字符

    它的工作原理是创建一个新对象,并尝试使用随机生成的名称访问其上的属性,我们假设该名称不存在,因此其值为Undefined。

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    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()];

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

    1
    if (document.getElementById)

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

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

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