Effective JavaScript Item 51 在类数组对象上重用数组方法「建议收藏」

Effective JavaScript Item 51 在类数组对象上重用数组方法

大家好,又见面了,我是全栈君。

Array.prototype对象上的标准方法被设计为也能够在其他对象上重用 – 即使不是继承自Array的对象。

因此,在JavaScript中存折一些类数组对象(Array-like Objects)。

一个典型的样例是函数的arguments对象,在Item 22中对它进行过介绍。该对象并不继承自Array.prototype,所以我们不能直接调用arguments.forEach来对当中的元素进行遍历。可是,我们能够通过首先得到forEach方法的对象。然后调用call方法(能够參考Item 20):

function highlight() {
    [].forEach.call(arguments, function(widget) {
        widget.setBackground("yellow");
    });
}

forEach方法本身而是一个Function类型的对象,因此它可以继承Function.prototype的call方法。

在Web环境中,DOM的NodeList类型的实例也是类数组对象。

因此,对于它也能够使用以上的方式借助Array中的方法进行操作。

那么,到底什么才是”类数组对象”呢?实际上。仅仅要对象满足了下面两个规定,那么它就是一个”类数组对象”:

  • 它拥有一个名为length。介于0到2^32-1之间的整型属性。
  • length属性的值大于该对象上的最大索引值。索引值的范围在0到2^32-2之间。索引值的字符串表示就是该对象上相应于一个属性值的键。

所以以下的这个对象就是一个”类数组对象”,它可以利用Array.prototype上定义的方法:

var arrayLike = { 0: "a", 1: "b", 2: "c", length: 3 };
var result = Array.prototype.map.call(arrayLike, function(s) {
    return s.toUpperCase();
}); // ["A", "B", "C"]

对于字符串类型的实例,也可以将它们看做是一种”类数组对象”。

毕竟它们也拥有length属性,也可以通过索引值訪问到当中的每个字符。因此。它们也可以利用Array.prototype上定义的方法:

var result = Array.prototype.map.call("abc", function(s) {
    return s.toUpperCase();
}); // ["A", "B", "C"]

仅仅只是。须要注意字符串实际上是一个不可变(Immutable)的”类数组对象”。

对于”类数组对象”,他还具有两个比較特别的行为:

  • 将length属性设置的比当前实际的大小要小时。会自己主动的删除多余的元素。
  • 当加入的属性的索引值大于等于当前的length属性时,比方索引值为n,length属性的仅仅会被自己主动的更新为n + 1。

在全部Array提供的方法中,仅仅有一个是不可以被”类数组对象”使用的:Array.prototype.concat方法。

它尽管可以被”类数组对象”通过call方法进行调用。可是它还会检查[[class]]的值(实际上就是对象的类型)。关于[[class]],在Item 40有提到过。

concat方法会推断传入的对象是否是一个真正的数组对象。假设是数组对象。就会依照期望的方式运行连接操作。假设不是真正的数组对象,那么会直接将參数作为一个总体进行连接,像以下这样:

function namesColumn() {
    return ["Names"].concat(arguments);
}

namesColumn("Alice", "Bob", "Chris");
// ["Names", { 0: "Alice", 1: "Bob", 2: "Chris" }]

可见,concat方法将arguments对象作为一个总体进行了连接。

那么,解决方法就是让concat方法将”类数组对象”当做是一个真正的数组对象。一种比較简便和经常使用的方法是使用slice方法:

function namesColumn() {
    return ["Names"].concat([].slice.call(arguments));
}

namesColumn("Alice", "Bob", "Chris");
// ["Names", "Alice", "Bob", "Chris"]

总结

  1. 通过获取方法的引用结合call方法。对Array上的方法进行重用,使之可以被用在”类数组对象”上。
  2. 不论什么对象都可以利用Array上的方法,仅仅要改方法满足了”类数组对象”的两条规则。

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。

发布者:全栈程序员-用户IM,转载请注明出处:https://javaforall.cn/115370.html原文链接:https://javaforall.cn

【正版授权,激活自己账号】: Jetbrains全家桶Ide使用,1年售后保障,每天仅需1毛

【官方授权 正版激活】: 官方授权 正版激活 支持Jetbrains家族下所有IDE 使用个人JB账号...

(0)


相关推荐

  • 使用request对象进行数据传递「建议收藏」

    使用request对象进行数据传递「建议收藏」在进行请求转发时,需要把一些数据传递到转发后的页面进行处理,需要使用request对象的setAttribute方法将数据保存到request范围内的变量中使用:request对象可以视为一个域,可以应用setAttribute()方法向域范围内存放数据request对象的setAttribute()方法的格式:request.setAttribute(Stringname,Objectobject);参数说明name:变量名,为String类型,object:用于指定需要在request

  • windows fastcgi「建议收藏」

    windows fastcgi「建议收藏」一.编译apachefastcgi模块  1.编译mod_fastcgi.so  方式一: mod_fastcgi/Win32目录下有mod_fastcgi.dsp和mod_fastcgi_AP2.dsp两个工程文件,但是无法用vc6打开,只能手动编译,文章参见: http://blog.csdn.net/feisan/article/details/1813482…

  • Postman :中文汉化界面一键配置「建议收藏」

    Postman :中文汉化界面一键配置「建议收藏」开心到飞起!!!Postman工具界面被大佬汉化啦!!Gitee和Github链接跳转地址:黄连木笛大佬的Gitee地址:PostmanCn黄连木笛大佬的Github地址:PostmanCn汉化包下载地址【2021-04-1320:22如有新版可以自己更新下载】:https://gitee.com//hlmd/PostmanCn/attach_files/670442/download/app.zip使用方法:解压并复制app文件夹到路径:C:/Users/用户名/AppData/Lo.

  • 搭建PHP开发环境(Apache+PHP+MySQL)「建议收藏」

    简介:总结在Windows环境搭建PHP开发环境(Apache+PHP+MySQL)安装Apache1、下载Apache,地址:http://www.apachelounge.com/download/,如下图:2、解压压缩包,最好放到磁盘根目录,不然配置时容易报路径错误,我这里改了文件夹名,方便以后配置,如下图:安装PHP1、下载PHP压缩包,地址:https://w…

  • poe交换机供电原理图_poe供电原理详解

    poe交换机供电原理图_poe供电原理详解POE指的是在现有的以太网Cat.5布线基础架构不作任何改动的情况下,在为一些基于IP的终端(如IP电话机、无线局域网接入点AP、网络摄像机等)传输数据信号的同时,还能为此类设备提供直流电的技术.就是支持以太网供电的交换机。那么,POE交换机的供电原理及工作过程是什么呢?接下来我们就跟随飞畅科技的小编一起来详细了解下吧!POE交换机供电原理标准的五类网线有四对双绞线,但是在10MBASE-T和100MBASE-T中只用到其中的两对。IEEE802.3af允许两种用法,应用空闲脚供电时,4、5脚连

  • python zipfile_Python 学习入门(16)—— zipfile

    python zipfile_Python 学习入门(16)—— zipfilezipfile是python里用来做zip格式编码的压缩和解压缩的,由于是很常见的zip格式,所以这个模块使用频率也是比较高。zipfile里有两个非常重要的class,分别是ZipFile和ZipInfo,在绝大多数的情况下,只需要使用这两个class就可以。1)ZipFile是主要的类,用来创建和读取zip文件;2)ZipInfo是存储的zip文件的每个文件的信息的。1)简单应用如果你仅…

发表回复

您的电子邮箱地址不会被公开。

关注全栈程序员社区公众号