将属性设置为null

时间:2016-07-10 09:26:47

标签: javascript

拥有代码:

foo = {};
foo.bar = 78;
foo.bar.baz = null;

针对foo.bar.baz测试null

if( foo.bar.baz === null )
  console.log("foo.bar.baz is null");
else
  console.log("foo.bar.baz is NOT null");

结果" foo.bar.baz不为空"。为什么它不是null,因为我明确地设置了它?

4 个答案:

答案 0 :(得分:4)

因为基元没有属性,foo.bar中的值是基元。

当您访问(获取或设置)基元上的属性时,JavaScript引擎会为该基元创建一个对象,设置或检索属性值(如果有),然后抛弃该对象。 (这就是为什么(42).toString()有效;原语被提升为由Number.prototype支持的对象,toString从该对象中检索并用this引用该对象进行调用,然后对象被扔掉了。)

尽管在foo.bar.baz = null语句中创建了一个对象,并且其baz属性设置为null,但该对象从未存储在任何位置(当然不在foo.bar中),所以它被扔掉了。稍后当您执行if (foo.bar.baz === null)时,会创建一个没有该属性的 new 对象,并为其undefined属性获取baz(因为它没有一个)。 (当然,JavaScript引擎可以优化此过程以避免不必要的对象创建。)

我们可以在Number.prototype上创建一个函数来返回创建的对象,以证明每次访问基元上的属性时对象创建确实发生了:

// Add a `nifty` method to numbers
Object.defineProperty(
  Number.prototype,
  "nifty",
  {
    value: function() {
      console.log("Number#nifty called");
      return this;
    }
  }
);

var n = 42;                 // A primitive number
console.log(typeof n);      // "number"
var obj1 = n.nifty();       // Creates an object, which we keep
console.log(typeof obj1);   // "object"
var obj2 = n.nifty();       // Do it again, and a new object is created
console.log(obj1 === obj2); // false, they're not the same object

如果要设置数字的属性并保留它们,可以通过显式创建Number对象来实现:

var n = new Number(42);
n.baz = null;
console.log(n.baz === null); // true

很少想要这样做,但这是可能的。请注意,正如我们之前展示的那样,具有相同原始值的两个Number 对象彼此不是==

var n1 = new Number(42);
var n2 = new Number(42);
console.log(n1 == n2);  // false
console.log(n1 === n2); // false

><>=<=会将该号码强制回原语并使用原始值,但==和{{ 1}}不会。

答案 1 :(得分:1)

在严格模式下使用数值作为对象将遇到异常。

默认情况下,Admob.Instance().initAdmob(BannerId,videoId); 未定义,因为foo.bar.baz = null不是对象,foo.bar将不会设置。

这是严格模式下的代码:

&#13;
&#13;
.baz
&#13;
&#13;
&#13;

这是解决方案:

&#13;
&#13;
'use strict';

var foo = {};
foo.bar = 78;
foo.bar.baz = null;

if(foo.bar.baz === null )
  alert("foo.bar.baz is null");
else
  alert("foo.bar.baz is NOT null");
&#13;
&#13;
&#13;

P.S。总是将'use strict'; var foo = {}; foo.bar = {}; foo.bar.num = 78; // your number here foo.bar.baz = null; if( foo.bar.baz === null ) alert("foo.bar.baz is null"); else alert("foo.bar.baz is NOT null");放在你的JS文件中,以使JS不那么通用。

答案 2 :(得分:0)

foo.bar是一个数字原语,而不是一个对象。您无法在数字基元上设置属性,但可以在数字对象上设置属性。

foo = {};
foo.bar = new Number(78);
foo.bar.baz = null;

现在foo.bar.baz == null

答案 3 :(得分:0)

这是因为

0 to 143

因为您正在尝试设置数字的属性。