JS 18 - 阵列也有赝品?如何辨识伪造的阵列?

大家好!

昨天我们建立了看似阵列的物件,其实它就是接下来要介绍的伪阵列物件(Array-like Object)。
我们进入今天的主题吧!


伪阵列

因为伪阵列不是真正的阵列,因此定义也是见仁见智,但是一般都有下列特性:

typeof arrarlike; // 'object'
typeof arraylike.length; // 'number'

对了,既然有 ArrayisArray 这个静态方法,那麽有没有辨识伪阵列的方法呢?
这是当然的,实作就像这样:

Felix.isArrayLike = function (item) {
    return (
        Array.isArray(item) || (
            !!item &&
            typeof item === 'object' &&
            typeof item.length === 'number' && (
                item.length === 0 || (
                    item.length > 0 &&
                    item.length - 1 in item
                )
            )
        )
    );
};

试试看:

/* 伪阵列就是伪阵列 */
Felix.isArrayLike(new Felix('body')); // true

/* 阵列也属於伪阵列 */
Felix.isArrayLike([]); // true

/* 物件不属於伪阵列 */
Felix.isArrayLike({}); // false

伪阵列的 forEach 方法

Array 有一个 forEach 静态方法,用途就像是用回圈将阵列的元素逐一操作。
伪阵列就没有这个方法了,但是我们也能靠自己实作一个:

Felix.forEach = function (obj, callback, args) {
    var i;
    if (this.isArrayLike(obj)) {
        for (i = 0; i < obj.length; i++) {
            if (callback.apply(obj[i], args) === false) break;
        }
    } else {
        for (i in obj) {
            if (callback.apply(obj[i], args) === false) break;
        }
    }
    return obj;
};

如果是阵列或伪阵列,就将元素遍历一次(不含 length);如果是物件,则将所有属性都遍历一次。


差不多也到尾声了。
如果对文章有任何疑问,也欢迎在下方提问和建议!
我是 Felix,我们明天再见!


<<:  [DAY 19] GAN 简介

>>:  [第十八只羊] 迷雾森林舞会XII Hotwire 101

IT 铁人赛 k8s 入门30天 -- day30 Share Process Namespace between Containers in a Pod

参考文件 https://kubernetes.io/docs/tasks/configure-po...

从 JavaScript 角度学 Python(10) - 容器型别(下)

前言 前一篇我们聊了一些字典有趣的取值方式,所以接下来我想接着继续聊关於字典的部分。 字典取值 在 ...

Day 6:监控系统的设计

昨天稍微谈到了一些有关警报的设计,然而,警报的发出与否,应是建立在我们观测到的一些系统的行为,例如说...

Day6. Array & Hash 之间的组合应用

Hash 在其他语言称为Object, Dictionary,但无论是在哪个程序语言中,Hash 和...

建立第一个RESTful api server(重构篇)-1 (Day16)

在之前的开发过程中,会发现整个main.go越来越长,在阅读理解上会相对没有那麽直觉且快速,因此接下...