如何在类数组中使用数组的方法?
这里记点笔记,仅供学习参考。


文章目录

  • 判定数组
    • 1. Array.isArray( )
    • 2. instanceof 操作符
    • 3. 检测类属性
  • 数组
  • 类数组
  • 类数组对象使用数组方法
  • 总结

判定数组

1. Array.isArray( )

给定一个未知的对象,判断它是否为数组?
我们通常用数组的一些特性来进行判断。在ES5中,可以使用 Array.isArray()函数来做这件事:

 Array.isArray([]);      // trueArray.isArray({});       // false


但是在ES5之前,typeof在这里却没什么用。对于数组,它的返回值为一个对象(对于除了函数以外的所有值都是如此)。


2. instanceof 操作符

instanceof操作符也只能用语简单的情形:

 [] instanceof Array     // true({}) instanceof Array    // false


但使用 instanceof 的问题在于,web浏览器可能会有多个窗口存在,每个窗口都偶有自己的一个JavaScript环境,有自己的全局对象。并且,每个全局对象都有自己的一组构造函数。因此一个窗口中的对象将不可能是另外窗体中的构造函数实例。窗体之间的混淆不常发生,但这个问题足以证明 instaceof操作符不能视为一个可靠的数组检测方法。


3. 检测类属性

对于数组而言,数组的属性总是“Array”,因此在ES3中的isArray()函数的代码可以这样写:

var isArray = Array.isArray || function(o) {return typeof o === "object" &&Object.prototype.toString.call(o) === "[object Array]";
}

实际上,这里的类属性检测就是ES5中 Array.isArray() 函数所做的事情。


数组

在JavaScript中,数组有一些特性是其他对象所没有的:

  • 当有新元素添加到列表中时,自动更新 length 属性。
  • 设置 length 为一个较小的值将截断数组。
  • 从 Array.prototype 中继承一些有用的方法。
  • 其类属性为 “Array”。

这些特性让 JavaScript 数组和常见的对象有明显的区别。但是它们不是定义数组的本质特性。一种常常完全合理的看法把拥有一个数组为 length 属性和对应非负整数属性的对象看做一种类型的数组。


类数组

这些拥有length属性、并且非负整数属性的对象可以看做是“类数组”。
对于真正数组的遍历,很多数组算法针对类数组对象工作,也可以像针对真正的数组一样。

以下代码是为一个常规对象增加了一些属性使其变为类数组对象,然后遍历生成的伪数组的“元素”:

 var a = {};        // 从一个空对象开始var i= 0;       // 添加一些属性,使其成为“类数组”while(i < 10) {a[i] = i * i;i++;}a.length = i;

现在,把它当做真正的数组去遍历它:

 var total = 0;for(var j = 0; j < a.length; J++) {total += a[j];}

在客户端 JavaScript 中,一些 DOM 方法(如,document.getElementByTagName() )也返回类数组对象。下面的函数可以用来检测类数组对象:

  1. 判定o是否是一个类数组对象
  2. 字符串和函数都有length 属性,但是它们可以用 typeof 检测将其排除。
  3. 在客户端 JavaScript 中,DOM 文本结点也可以有 length 属性,需要用额外的 nodeType != 3 将其排除
 function isArrayLike(o) {if (o&&                                        // o 非 null 、undefined typeof o === "object" &&                // o 是对象o.length >= o &&                        // o.length 是有限数值o.length === Math.floor(o.length) &&    // o.length 是整数o.length < 4294967296 )                   // o.lengrh < 2^32return true;       // o 是类数组elsereturn false;      // o 不是}

类数组对象使用数组方法

JavaScript 数组的方法是特意定义为通用的,因此它们不仅应用在真正的数组上,而且,在类数组上也可以使用。

  • 在ES5中,所有数组的方法都是通用的。
  • 在ES3中,除了toString()toLocaleString()以外的所有方法也是通用的。
  • 类数组对象没有继承自Array.prototype,那就不能在它们上面直接调用数组的方法。尽管如此,也可以间接的使用Function.call方法调用:
 var a = {"0": "a", "1": "b", "2": "c", length: 3};     // 类数组对象Array.prototype.join.call(a, "+");                       // => "a+b+c"Array.prototype.slice.call(a, 0);                      // => ["a", "b", "c"] 真正的数组Array.prototype.map.call(a, function(x) {return x.toUpperCase();                               // => ["A", "B", "C"]})

ES5 数组的方法是在 Firefox 1.5 中引入的,同时 Firefox 将这些方法在 Array 的构造函数上直接定义为数组。即可以写为:

 var a = {"0": "a", "1": "b", "2": "c", length: 3};     // 类数组对象Array.join(a, "+");                      // => "a+b+c"Array.slice(a, 0);                     // => ["a", "b", "c"] 真正的数组Array.map(a, function(x) {return x.toUpperCase();              // => ["A", "B", "C"]})

总结

当用在类数组对象上时,数组的方法的静态函数版本非常有用。

数组与类数组以及在类数组对象使用数组的方法相关推荐

  1. java js对象转字符串数组_js 转json格式的字符串为对象或数组(前后台)的方法

    一.前台 // 转换成对象 var myObject = JSON.parse(_data); alert("对象:"+myObject.msg); // 转换成数组 var my ...

  2. a类怎么引用b类java_Java中A类的数组如何传入B类???急

    public class Test { public static void main(String[] args) { //方法一:引用传递 //创建A对象并给数组赋值 A a = new A(); ...

  3. php怎么创建对象数组对象数组对象,在PHP中把对象当数组使用

    在PHP中把对象当数组使用 我们了解,JAVASCRIPT中,对象的属性.方法,是可以用数组的模式来访问的.但通常情况下是不可能的. 为什么要这么做?这是因为,通过这一方式,可以更加方便地操作对象,我 ...

  4. php7 对象转数组,php中如何将对象转数组

    php中将对象转数组的方法:php中将对象转数组的方法:首先创建一个PHP示例文件:然后通过"get_object_vars ( object $obj )"函数将对象以数组的形式 ...

  5. 7.1.3 Python进阶 《函数》定义、调用,参数,返回值《面向对象》概念,类,实例,对象,属性,方法《模块、包》导入,自定义,常用内置:datatime,time,random,os,sys

    目录 ======== 第四部分 Python进阶 ======== 第一节 函数 4.1.1 函数定义及调用 4.1.2 函数的参数 4.1.3 函数的返回值 第二节 面向对象 4.2.1 面向对象 ...

  6. php closure 类,PHP中Closure类详解

    本文主要和大家分享PHP中Closure类详解,PHP Closure 类是用于代表匿名函数的类,匿名函数(在 PHP 5.3 中被引入)会产生这个类型的对象,Closure类摘要如下:Closure ...

  7. python 类的继承,类中的函数调用以及类输入数组

    第一部分,类的继承 先给出一个例子: class People(): #定义类,要大写,python 2中要在括号里加如object这个单词def __init__(self,n,a,w): #定义一 ...

  8. Object类 任何类都是object类的子类 用object对象接收数组 object类的向上向下转型...

    任何类都是object类的子类 用object对象接收数组 object类的向上向下转型 转载于:https://www.cnblogs.com/qingyundian/p/7744351.html

  9. 091_类数组对象转为数组

    1. 数组结构: var arr = [1001, 'zs', 18, true]; 2. 类数组对象结构: var obj = {0: 1001, 1: 'zs', 2: 18, 3: true, ...

  10. 类模板,多种类型的类模板,自定义类模板,类模板的默认类型,数组的模板实现,友元和类模板,友元函数,类模板与静态变量,类模板与普通类之间互相继承,类模板作为模板参数,类嵌套,类模板嵌套,类包装器

     1.第一个最简单的类模板案例 #include "mainwindow.h" #include <QApplication> #include <QPush ...

最新文章

  1. 16个免费和开源商业智能工具
  2. Bind 9.5安装入门指南
  3. PostGIS容器运行
  4. holer实现外网访问内网数据库
  5. root 授予oracle权限,oracle – 列出具有root(管理)权限的用户
  6. 使用Github Actions构建、发布和部署NuGet软件包
  7. Java 中的参数传递和引用类型
  8. 神经网络填充(padding)
  9. R语言之——字符串处理函数
  10. 【Objective-C】Objective-C语言的动态性
  11. RocketMQ的底层通信模块remoting 源码解析
  12. 社区版PyCharm安装并创建Django项目
  13. 操作系统-进程管理(信号量机制)
  14. 超频到3200最佳时序_攒啥电脑呢?笔记本内存也要超频?
  15. 显示杂谈(2)为啥选择gamma2.2
  16. 李航《统计学习方法》第二版 实战(mnist为例)
  17. history of program atan2(y,x)和pow(x,y)
  18. 判断Qstring是不是IP格式
  19. 基于Sigma protocol实现的零知识证明protocol集锦
  20. 新库上线 | CnOpenData农业工商注册企业数量统计数据

热门文章

  1. CSDN论坛学习工具(CSDN Study v1.0.0.2版)发布
  2. Rest环境搭建:服务提供者和消费者
  3. 以下关于关键字super的描述中,正确的是:
  4. IBM AppScan 安全扫描:Missing Content-Security-Policy ;X-Content-Type-Options ;X-XSS-Protection响应头
  5. 数据库ACID和CAP原则
  6. Win10使用docker桌面版本
  7. 虚拟机 网络不可达 连不上网 Destination Host Unreachable
  8. 手机热点通过无线路由器分享给有线服务器上网!
  9. 数据中心变电站: 从头开始设计
  10. STS(spring tool suit)中git代码拉取和冲突解决