代码之家  ›  专栏  ›  技术社区  ›  Steven

Javascript中未定义和未定义的区别

  •  24
  • Steven  · 技术社区  · 14 年前

    http://jsfiddle.net/FDhQF/1/ 举个小例子。

    在Javascript中未定义和未定义有什么区别?例如,尝试访问未定义的对象的属性(实际上,尝试访问变量)将返回 undefined . 但你也可以设置一些 = undefined . 当您这样做,试图访问它仍然返回未定义,但指针仍然存在。如上所述,一个例子是对一个对象的迭代如何仍然覆盖您(重新)声明为未定义的属性。似乎有两种不同的未定义类型。有人能解释一下情况吗?

    2 回复  |  直到 14 年前
        1
  •  46
  •   Christian C. Salvadó    13 年前

    同时访问未在对象上定义的属性和包含基元的属性 undefined 价值,会回报你 未定义

    例如:

    var obj = {
      a: undefined
    };
    
    obj.a; // undefined
    obj.b; // undefined
    

    不同的是 a b 不是:

    obj.hasOwnProperty('a'); // true
    obj.hasOwnProperty('b'); // false
    

    在第一种情况下 未定义 作为它的价值。在第二种情况下, 不是自己的财产,访问 obj.b 将查找名为 b

    当原型链结束时(当它到达具有 null [[Prototype]] ),属性查找结束,然后 未定义 显式返回。

    hasOwnProperty 方法仅在对象上实际存在属性时进行检查( 拥有 但我们也有 继承 属性,在这种情况下,我们可以使用 in operator

    function Test () {}
    Test.prototype.a = 'foo'; // instances of Test will inherit from Test.prototype
    
    var obj = new Test(); // { a="foo",  b="bar"}
    obj.b = 'bar';
    
    obj.hasOwnProperty('a');  // false
    'a' in obj;               // true
    obj.a;                    // 'foo'
    
    obj.hasOwnProperty('b');  // true
    

    如你所见, obj 继承自 Test.prototype 属性不是 自有财产 拥有自己的财产 退货 false 以及 在里面 操作员返回 true .

    [[Get]] 内部操作

    笔记:

    • 因为标识符在ECMAScript 3(语言标准的最广泛实现版本)上被认为是不安全的,因为它不是语言关键字(例如 无效的 例如)只是全局对象的一个属性,它在这个版本的规范上是可写的,这意味着如果有人替换它的值(例如。 window.undefined = 'LOL';

    这个 typeof operator 可以使用@strager提到的,例如:

    if (typeof obj.prop == 'undefined') { /*....*/ }
    

    这个操作符总是返回一个字符串(使用起来很安全) == :),并且其值取决于其操作数的类型,可能的值如下所示 here .

    解决这个问题的另一个常见方法是声明自己的 变量,在函数范围内可用,例如,某些库使用以下模式:

    (function(undefined) {
      // code here
    })();
    

    函数有一个名为 未定义

    也许值得一提的是 undefined global property 最后在ECMAScript 5中被描述为不可写(不可变、不可枚举和不可配置-不可删除-)。

    • 使用 拥有自己的财产 直接来自对象实例的方法也不被视为 ,因为如果某个对象具有同名的属性,则原始方法将被隐藏。例如:

      var obj = { hasOwnProperty: function () { /* evil code :) */ } };
      

        obj.hasOwnProperty('prop'); 
    

    将执行在对象上定义的方法(您不希望这样做,因为您确切地知道要调用哪个方法……),因为 阴影 Object.prototype 但是,可以通过以下方式安全地调用它:

        Object.prototype.hasOwnProperty.call(obj, 'prop');
    
        2
  •  1
  •   Strelok    14 年前

    Here 是对“未定义”的一个很好的解释。不过,要点是,将某个对象设置为“undefined”并不是取消对它的定义,因为“undefined”实际上是一个原语值,在变量(或属性)没有赋值时使用。