浅谈JavaScript和DOM中的类数组对象
JavaScript是一门弱类型语言,它的数据类型分为两大类:简单数据类型(5种:Undefined、Null、Boolean、Number、String)和复杂数据类型(1种:Object)。Object是ECMAScript中使用最多的一个类型,所有的引用类型的值都是Object类型的实例。引用类型,本质上是一种数据结构,用于将数据和功能组织在一起。对象是某个特定引用类型的实例。
在JavaScript中,有一种特殊的对象,被称为类数组(array-like)对象,其在书中的定义为:
- 拥有length属性,其它属性(索引)为非负整数
- 不具有数组所具有的方法
类数组示例:
1:
var a = {'1':'gg','2':'love','4':'meimei',length:5};
2:
var a= {}; for(var i=0; i<10 ; i++){
a[i] = i*i;
} a.length = i;
可以看出,通过将对象的每个属性名设为递增的非负整数,且动态定义一个length属性来表示元素个数,就可以使用对象来模拟数组。类数组对象可以像数组一样,使用[]通过下标访问。但它们终究只是类似数组,而不是数组,所以并不能使用数组的特有方法,如splice、indexOf、pop等。
类数组对象和数组的区别:
- 一个是对象,一个是数组
- 当新元素被添加时,数组的length属性的值会自动更新,类数组对象则不会
- 设置数组的length属性可扩展或截断数组,而对于类数组对象来说仅仅是改变了一个属性的值而已
- 类数组不能调用数组方法
类数组判断:
《javascript权威指南》上给出了代码用来判断一个对象是否属于“类数组”:
// Determine if o is an array-like object.
// Strings and functions have numeric length properties, but are
// excluded by the typeof test. In client-side JavaScript, DOM text
// nodes have a numeric length property, and may need to be excluded
// with an additional o.nodeType != 3 test.
function isArrayLike(o) {
if (o && // o is not null, undefined, etc.
typeof o === 'object' && // o is an object
isFinite(o.length) && // o.length is a finite number
o.length >= 0 && // o.length is non-negative
o.length===Math.floor(o.length) && // o.length is an integer
o.length < 4294967296) // o.length < 2^32
return true; // Then o is array-like
else
return false; // Otherwise it is not
}
类数组转换:
有些时候,我们需要将一个类数组对象转换为一个真正的数组,转换之后可使用数组方法
Array.prototype.slice.call(Object)
对于IE9以前的版本(DOM实现基于COM),可以使用makeArray来实现:
// 伪数组转化成数组
var makeArray = function(obj) {
if (!obj || obj.length === 0) {
return [];
}
// 非伪类对象,直接返回最好
if (!obj.length) {
return obj;
}
// 针对IE8以前 DOM的COM实现
try {
return [].slice.call(obj);
} catch (e) {
var i = 0,
j = obj.length,
res = [];
for (; i < j; i++) {
res.push(obj[i]);
}
return res;
}
};
常见类数组对象:
1.arguments
//属性:
length //长度
callee //正在执行的函数
arguments是最常见的类数组对象,在函数内部使用,示例:arguments[0] 或 functionName.arguments[0]
在JS的DOM中,有三个常用到的类数组对象:NodeList NamedNodeMap 和 HTMLCollection
2.NodeList
//属性:
length //长度 //方法:
item(idx) //通过索引访问节点
以下代码形式返回类型为NodeList:
childNodes
getElementsByClassName(className)
getElementsByTagName(tagName)
3.NamedNodeMap
//属性:
length //长度 //方法:
item(idx) //通过索引访问节点
getNamedItem(NS) //通过名称(和命名空间)访问节点
setNamedItem(NS) //通过名称(和命名空间)设置节点
removeNamedItem(NS) //根据名称(和命名空间)删除节点
以下代码形式返回类型为NamedNodeMap:
element.attributes
4.HTMLCollection
//属性:
length //长度 //方法:
item(idx) //通过索引访问节点
namedItem(name) //通过name 属性或 id 属性访问节点
以下代码形式返回类型为HTMLCollection:
document.images //所有img元素
document.links //所有带href属性的a元素和area元素
document.anchors //所有带name属性的a元素
document.forms //所有form元素
document.scripts //所有script元素
tBodies(table元素)
rows(table、tbody、thead、tfoot元素)
cells(tr元素)
HTMLCollection NodeList以及NamedNodeMap都是“动态的”,每当文档结构发生变化时,他们都会得到更新,始终会保存着最新,最准确的信息
浅谈JavaScript和DOM中的类数组对象的更多相关文章
- JavaScript中的类数组对象
在javascript中,对象与数组都是这门语言的原生规范中的基本数据类型,处于并列的位置. 一般来说,如果我们有一个对象obj和一个数组a: obj["attr1"]; / ...
- JavaScript、ES6中的类和对象
面向对象可以用于描述现实世界的事物,但是事物分为具体的(特指的)事物和抽象的(泛指的)事物. 面向对象思维的特点: 1.抽取(抽象)对象共有的属性和行为组织(封装)成一个类(模板) 2. ...
- js中的类数组对象---NodeList
动态 NodeList 这是文档对象模型(DOM,Document Object Model)中的一个大坑. NodeList 对象(以及 HTML DOM 中的 HTMLCollection对象)是 ...
- JavaScript类数组对象参考
JavaScript和DOM中有很多类数组对象,它们有以下特点 1.有length属性 2.可以使用[]通过下标访问 3.部分类数组对象使用[]访问成员时不只可以使用下标,还可以使用id或name 4 ...
- 简述JavaScript对象、数组对象与类数组对象
问题引出 在上图给出的文档中,用JavaScript获取那个a标签,要用什么办法呢?相信第一反应一定是使用document.getElementsByTagName('a')[0]来获取.同样的,在使 ...
- JS中集合对象(Array、Map、Set)及类数组对象的使用与对比
原文地址 在使用js编程的时候,常常会用到集合对象,集合对象其实是一种泛型,在js中没有明确的规定其内元素的类型,但在强类型语言譬如Java中泛型强制要求指定类型. ES6引入了iterable类型, ...
- 浅谈JavaScript中的正则表达式(适用初学者观看)
浅谈JavaScript中的正则表达式 1.什么是正则表达式(RegExp)? 官方定义: 正则表达式是一种特殊的字符串模式,用于匹配一组字符串,就好比用模具做产品,而正则就是这个模具,定义一种规则去 ...
- 浅谈JavaScript中的闭包
浅谈JavaScript中的闭包 在JavaScript中,闭包是指这样一个函数:它有权访问另一个函数作用域中的变量. 创建一个闭包的常用的方式:在一个函数内部创建另一个函数. 比如: functio ...
- 浅谈JavaScript中的null和undefined
浅谈JavaScript中的null和undefined null null是JavaScript中的关键字,表示一个特殊值,常用来描述"空值". 对null进行typeof类型运 ...
随机推荐
- websocket多线程问题
title: websocket多线程问题 date: 2017-06-28 11:21:24 categories: websocket tags: [websocket] --- 开发框架 spr ...
- mysql清除数据库中字符串空格方法
update `z_lottery_list` set `win_number`=replace(`win_number`,' ','');
- 12.exception对象
excepton对象是一个异常对象,当一个页面在运行过程中发生了异常,就产生了这个对象,如果一个jsp页面要应用此对象,就必须把isErrorPage设置为true,否则无法编译.它实际上是java. ...
- MaintainableCSS 《可维护性 CSS》 --- ID 篇
ID 从语法上讲,当只有一个实例时,我们应该使用一个ID.当有多个时,我们应该使用一个 class. 但是,ID 作用的优先级高于 class ,在我们想覆盖一个样式的时候,这就会导致问题. 为了演示 ...
- 怎样禁止手机app 中页面有时候会把数字当做电话号码,从而自动进行打电话功能
想要禁止这种功能,只需要给头不加一个meta标签就可以了, <meta name="format-detection" content="telephone=no& ...
- python的高级应用
记录一下Python函数式编程,高级的几个BIF,高级官方库方面的用法和心得. 函数式编程 函数式编程是使用一系列函数去解决问题,按照一般编程思维,面对问题时我们的思考方式是"怎么干&quo ...
- editPuls 常用知识
1.创建模板 1).创建模板页(*.html) 2).Tools->Preferences->File->Templates->HTML->file name重新选定模板 ...
- html之结构化标记
1.什么是结构化标记 对布局使用的div 进行升级 , 根据页面的不同区域而提供的不同标签.作用与div几乎一致 专门用于搭建网站结构而用 2.结构标记详解 1.<header>元素 作用 ...
- log 的 debug()、 error()、 info()方法的区别
软件中总免不了要使用诸如 Log4net, Log4j, Tracer 等东东来写日志,不管用什么,这些东东大多是大同小异的,一般都提供了这样5个日志级别: × Debug × Info ...
- Android Studio和eclipse混淆打包总结
最近项目有点闲,考虑到以前的项目没有做过混淆,只是用了加固软件进行加固,为了安全性,准备给项目加上,这里做个总结,都经本人亲自在项目实践,说是为了安全性,这好像说大了,一来项目中没用到什么特别的技术, ...