我很快起草了一个小辅助方法,使未定义的变量检查更容易一些。
Object.prototype.is = function() {
for(var i in arguments) {
if(this === arguments[i]) {
return true;
}
}
return false;
};
设计如下:foo.is(undefined, false)
检查 foo 是否未定义或为假。我使用的测试用例是:
var a = false;
a.is(false);
> false
有点困惑,我又玩了一会儿。一些 console.logging 显示相等检查失败,因为被比较的两个对象不相同。
Boolean {is: function} === false
> false
所以,从它的曾祖父a
那里继承了方法: Object.prototype 但在比较中没有。is
false
我想我可以通过使用它来强制继承,new Boolean(false)
这肯定会创建一个对象的新实例(希望能规避在扩展 Object 的原型之前创建的对象的引用可能发生的任何风险)。结果:
Boolean {is: function} === Boolean {is: function}
> false
为什么平等检查失败?
作为解决这里发生的事情的过程的一部分,我在使用单个布尔值作为参数调用函数后检查了参数数组,结果发现它的长度为 2,额外的参数is
是在 Object.prototype 中声明。
a.is(false);
arguments -> [false, is: function]
那是怎么结束的?
作为参考,我知道像这样修补猴子是个坏主意!这不是生产代码,我只是感兴趣。