拥有代码:
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
,因为我明确地设置了它?
答案 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
将不会设置。
这是严格模式下的代码:
.baz
&#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;
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
因为您正在尝试设置数字的属性。