加入收藏 | 设为首页 | 会员中心 | 我要投稿 张家口站长网 (https://www.0313zz.com.cn/)- 办公协同、操作系统、混合云网络、数据湖、视觉智能!
当前位置: 首页 > 综合聚焦 > 编程要点 > 语言 > 正文

javascript伪数组是什么意思?和数据有啥不同?

发布时间:2022-03-02 12:58:58 所属栏目:语言 来源:互联网
导读:javascript伪数组是什么意思?很多新手可能对于伪数组和数的组区别不是很了解,这篇文章主就要介绍javascript伪数组和数组,感兴趣的朋友可以参考下,希望大家阅读完这篇文章能有所收获,接下来小编带着大家一起了解看看。 伪数组和数组 在JavaScript中,除
      javascript伪数组是什么意思?很多新手可能对于伪数组和数的组区别不是很了解,这篇文章主就要介绍javascript伪数组和数组,感兴趣的朋友可以参考下,希望大家阅读完这篇文章能有所收获,接下来小编带着大家一起了解看看。
 
     伪数组和数组
 
     在JavaScript中,除了5种原始数据类型之外,其他所有的都是对象,包括函数(Function)。
 
    对象与数组的关系
    在说区别之前,需要先提到另外一个知识,就是 JavaScript 的原型继承。所有 JavaScript 的内置构造函数都是继承自 Object.prototype 。
 
    在这个前提下,可以理解为使用 new Array() 或 [] 创建出来的数组对象,都会拥有 Object.prototype 的属性值。
 
var obj = {};// 拥有 Object.prototype 的属性值
var arr = [];
//使用数组直接量创建的数组,由于 Array.prototype 的属性继承自 Object.prototype,
//那么,它将同时拥有 Array.prototype 和 Object.prototype 的属性值
    可以得到对象和数组的第一个区别:对象没有数组 Array.prototype 的属性值。
 
    什么是数组
    数组具有一个最基本特征:索引,这是对象所没有的,下面来看一段代码:
 
var obj = {};
var arr = [];
 
obj[2] = 'a';
arr[2] = 'a';
 
console.log(obj[2]); // => a
console.log(arr[2]); // => a
console.log(obj.length); // => undefined
console.log(arr.length); // => 3
obj[2]输出'a',是因为对象就是普通的键值对存取数据
而arr[2]输出'a' 则不同,数组是通过索引来存取数据,arr[2]之所以输出'a',是因为数组arr索引2的位置已经存储了数据
obj.length并不具有数组的特性,并且obj没有保存属性length,那么自然就会输出undefined
而对于数组来说,length是数组的一个内置属性,数组会根据索引长度来更改length的值
为什么arr.length输出3,而不是1
在给数组添加元素时,并没有按照连续的索引添加,所以导致数组的索引不连续,那么就导致索引长度大于元素个数
    什么是伪数组
拥有 length 属性,其它属性(索引)为非负整数(对象中的索引会被当做字符串来处理,这里你可以当做是个非负整数串来理解)
不具有数组所具有的方法
    伪数组,就是像数组一样有 length 属性,也有 0、1、2、3 等属性的对象,看起来就像数组一样,但不是数组,比如:
 
var fakeArray = {
  "0": "first",
  "1": "second",
  "2": "third",
  length: 3
};
 
for (var i = 0; i < fakeArray.length; i++) {
  console.log(fakeArray[i]);
}
 
Array.prototype.join.call(fakeArray,'+');
    常见的伪数组有:
 
函数内部的 arguments
DOM 对象列表(比如通过 document.getElementsByTags 得到的列表)
jQuery 对象(比如 $("div") )
    伪数组是一个 Object,而真实的数组是一个 Array。
 
    伪数组存在的意义,是可以让普通的对象也能正常使用数组的很多方法,比如:
 
var arr = Array.prototype.slice.call(arguments);
 
Array.prototype.forEach.call(arguments, function(v) {
  // 循环arguments对象
});
 
// push
// some
// every
// filter
// map
// ...
    以上在借用数组的原型方法的时候都可以通过数组直接量来简化使用:
 
var obj = {
  0: 'a',
  1: 'b',
  2: 'c',
  length: 3
}
 
;[].push.call(obj, 'd')
 
console.log([].slice.call(obj))
 
;[].forEach.call(obj, function (num, index) {
  console.log(num)
})
    二者区别
    1.长度:
 
真数组的长度是可变的
伪数组的长度不可变
    2.方法的使用:
 
真数组可以使用数组中的方法
伪数组不可以使用数组中的方法
    小结
 
    对象没有数组 Array.prototype 的属性值,类型是 Object ,而数组类型是 Array;数组是基于索引的实现, length 会自动更新,而对象是键值对;使用对象可以创建伪数组,伪数组可以正常使用数组的大部分方法。



(编辑:张家口站长网)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    热点阅读