Object.prototype.is = function() {
for(var i in arguments) {
if(this === arguments[i]) {
return true;
}
}
return false;
};
这段代码的设计初衷是这样使用的:foo.is(undefined, false)
,用来检查 foo 是否为 undefined 或 false。我使用的测试案例是:
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
为什么相等性检查失败?
在解决这个问题的过程中,我检查了函数被调用时传入的单个布尔值参数后的参数数组,只发现其长度为两个,额外的参数是在 Object.prototype 中声明的 is
函数。
a.is(false);
arguments -> [false, is: function]
这是怎么出现在这里的?
顺便说一下,我知道这样像猴子补丁是个坏主意!这不是生产代码,我只是感兴趣。
arguments
:for (var i = 0; i < arguments.length; i++)
而不是你现在的方式。此外,只有当它们是完全相同的对象(不仅内容相同,而且是物理上不同的对象)时,才传递===
或==
。 - jfriend00