更新
感谢您的帮助,我不知道使用lambda(胖箭头)功能时需要注意的事项。
if (window.Array && !Array.prototype.isEmpty)
{
Array.prototype.isEmpty = function ()
{
return this.length === 0;
};
}
console.log("[]", [].isEmpty());
console.log("[1]", [1].isEmpty());
现在可以使用了。
原始问题
我一直在尝试在javascript中将isEmpty的功能添加到Array原型中,以使我的代码更清晰,并且因为我想学习如何正确地执行它。
我明白,建议不要将自己的方法添加到现有对象中并制作自己的方法,但此时,我真的想弄清楚我在哪里误入歧途。
我也明白,只需执行array.length === 0
即可测试空数组。
我遇到的问题是this
指的是window object
而不是调用数组。
这是我的代码
if (window.Array && !Array.prototype.isEmpty)
{
Array.prototype.isEmpty = (callback, thisArg) =>
{
return this.length === 0;
};
}
console.log("[]", [].isEmpty());
console.log("[1]", [1].isEmpty());
因为this
是对窗口对象的引用,this.length
为false所以无论调用什么数组,该函数都返回true。
如何让this
引用调用对象而不是窗口?
我基于forEach
的{{1}}垫片,我试图改变我的isEmpty函数来模拟它,因为我看到forEach正在使用回调而我的垫片不是。
NodeList.forEach shim:
NodeList
看到这一点,我试图将我的功能改为
if (window.NodeList && !NodeList.prototype.forEach)
{
NodeList.prototype.forEach = (callback, thisArg) =>
{
thisArg = thisArg || window;
for (let i = 0; i < this.length; i++)
{
callback.call(thisArg, this[i], i, this);
}
};
}
不幸的是,这导致错误,因为没有定义回调函数,我希望发送一个空函数。
这两个函数之间的区别在于if (window.Array && !Array.prototype.isEmpty)
{
Array.prototype.isEmpty = (callback, thisArg) =>
{
thisArg = thisArg || window;
callback.call(thisArg, this.length === 0, 0, this);
};
}
console.log("[]", [].isEmpty());
console.log("[1]", [1].isEmpty());
NodeList.forEach
是对NodeList的引用,而NodeList正在调用this
而不是对forEach
的引用。
从我所知道的,代码中,工作window
和失败的NodeList.forEach
之间的区别在于,对于forEach,你为它提供了一个函数来对其进行操作,但是使用isEmpty它只是一个空函数调用。
我承认我不理解回调函数以及我想要的,所以我在这里有点啰嗦。我已经尝试查找isEmpty for JS的实现,但大多数响应只是使用Array.isEmpty
,而我同意这是一个很好的解决方案,我试图推动我的知识界限。
感谢您提供的任何见解。