将IsEmpty填充添加到JS Array

时间:2017-11-22 20:59:08

标签: javascript arrays foreach ecmascript-6

更新

感谢您的帮助,我不知道使用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,而我同意这是一个很好的解决方案,我试图推动我的知识界限。

感谢您提供的任何见解。

0 个答案:

没有答案