数组与类数组以及在类数组对象使用数组的方法
如何在类数组中使用数组的方法?
这里记点笔记,仅供学习参考。
文章目录
- 判定数组
- 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()
)也返回类数组对象。下面的函数可以用来检测类数组对象:
- 判定o是否是一个类数组对象
- 字符串和函数都有length 属性,但是它们可以用 typeof 检测将其排除。
- 在客户端 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"]})
总结
当用在类数组对象上时,数组的方法的静态函数版本非常有用。
数组与类数组以及在类数组对象使用数组的方法相关推荐
- java js对象转字符串数组_js 转json格式的字符串为对象或数组(前后台)的方法
一.前台 // 转换成对象 var myObject = JSON.parse(_data); alert("对象:"+myObject.msg); // 转换成数组 var my ...
- a类怎么引用b类java_Java中A类的数组如何传入B类???急
public class Test { public static void main(String[] args) { //方法一:引用传递 //创建A对象并给数组赋值 A a = new A(); ...
- php怎么创建对象数组对象数组对象,在PHP中把对象当数组使用
在PHP中把对象当数组使用 我们了解,JAVASCRIPT中,对象的属性.方法,是可以用数组的模式来访问的.但通常情况下是不可能的. 为什么要这么做?这是因为,通过这一方式,可以更加方便地操作对象,我 ...
- php7 对象转数组,php中如何将对象转数组
php中将对象转数组的方法:php中将对象转数组的方法:首先创建一个PHP示例文件:然后通过"get_object_vars ( object $obj )"函数将对象以数组的形式 ...
- 7.1.3 Python进阶 《函数》定义、调用,参数,返回值《面向对象》概念,类,实例,对象,属性,方法《模块、包》导入,自定义,常用内置:datatime,time,random,os,sys
目录 ======== 第四部分 Python进阶 ======== 第一节 函数 4.1.1 函数定义及调用 4.1.2 函数的参数 4.1.3 函数的返回值 第二节 面向对象 4.2.1 面向对象 ...
- php closure 类,PHP中Closure类详解
本文主要和大家分享PHP中Closure类详解,PHP Closure 类是用于代表匿名函数的类,匿名函数(在 PHP 5.3 中被引入)会产生这个类型的对象,Closure类摘要如下:Closure ...
- python 类的继承,类中的函数调用以及类输入数组
第一部分,类的继承 先给出一个例子: class People(): #定义类,要大写,python 2中要在括号里加如object这个单词def __init__(self,n,a,w): #定义一 ...
- Object类 任何类都是object类的子类 用object对象接收数组 object类的向上向下转型...
任何类都是object类的子类 用object对象接收数组 object类的向上向下转型 转载于:https://www.cnblogs.com/qingyundian/p/7744351.html
- 091_类数组对象转为数组
1. 数组结构: var arr = [1001, 'zs', 18, true]; 2. 类数组对象结构: var obj = {0: 1001, 1: 'zs', 2: 18, 3: true, ...
- 类模板,多种类型的类模板,自定义类模板,类模板的默认类型,数组的模板实现,友元和类模板,友元函数,类模板与静态变量,类模板与普通类之间互相继承,类模板作为模板参数,类嵌套,类模板嵌套,类包装器
1.第一个最简单的类模板案例 #include "mainwindow.h" #include <QApplication> #include <QPush ...
最新文章
- 16个免费和开源商业智能工具
- Bind 9.5安装入门指南
- PostGIS容器运行
- holer实现外网访问内网数据库
- root 授予oracle权限,oracle – 列出具有root(管理)权限的用户
- 使用Github Actions构建、发布和部署NuGet软件包
- Java 中的参数传递和引用类型
- 神经网络填充(padding)
- R语言之——字符串处理函数
- 【Objective-C】Objective-C语言的动态性
- RocketMQ的底层通信模块remoting 源码解析
- 社区版PyCharm安装并创建Django项目
- 操作系统-进程管理(信号量机制)
- 超频到3200最佳时序_攒啥电脑呢?笔记本内存也要超频?
- 显示杂谈(2)为啥选择gamma2.2
- 李航《统计学习方法》第二版 实战(mnist为例)
- history of program atan2(y,x)和pow(x,y)
- 判断Qstring是不是IP格式
- 基于Sigma protocol实现的零知识证明protocol集锦
- 新库上线 | CnOpenData农业工商注册企业数量统计数据
热门文章
- CSDN论坛学习工具(CSDN Study v1.0.0.2版)发布
- Rest环境搭建:服务提供者和消费者
- 以下关于关键字super的描述中,正确的是:
- IBM AppScan 安全扫描:Missing Content-Security-Policy ;X-Content-Type-Options ;X-XSS-Protection响应头
- 数据库ACID和CAP原则
- Win10使用docker桌面版本
- 虚拟机 网络不可达 连不上网 Destination Host Unreachable
- 手机热点通过无线路由器分享给有线服务器上网!
- 数据中心变电站: 从头开始设计
- STS(spring tool suit)中git代码拉取和冲突解决