`
阅读更多

【前言】

    本文简单介绍下JS基础数组与伪数组

 

【主体】

    

1.基本用法

  • window.Array是全局函数(也是函数)
  • Array()new Array()是一样的效果
    在JS中基础类型与复杂类型不同
     
var a = Array(3)
var a = new Array(3) //长度为3,3个undefined 

var a = Array(3, 3)// a = [3, 3]
 

JS在Array上的不一致性

 

 
不一致性

2. JS中数组的本质

人类理解:就是数据的有序集合
JS理解:数组就是原型链中有Array.prototype的对象,且length动态变化。

 
数组

 

2.1 伪数组

  1. 有0,1,2,3 ... n length 这些key的对象
  2. 原型链中没有Array.prototype

目前知道的数组有

  • arguments对象
  • document.querSelectAll('div') 返回的对象
  • 字符串

3.数组的API

  • Array.prototype.forEach
    这是一个接受函数的API,该函数可有一、两个参数,最多可有三个参数
a = [1,2,3]
a.forEach(function(value, key) {})
forEach(array, function(value, key) {}))

forEach的原理和实现方法

var obj  = ['a', 'b']
obj.forEach = function(x) { // x为函数名
  for(let i = 0, i<this.length, i++) {// this指向obj 
    x(obj[i], i)
  }
}
obj.forEach(function(value, key) {
  console.log(value, key)
})
a 0
b 1
 
函数三个参数时
  • a.sort()
a.sort( fucntion(x, y) {
  return a[x] - a[y] // 小于零从小到大,大于零从大到小
})
  • a.join()
a = [1, 2, 3]
a.join('东东')
''1东东2得到3东东''

a.join(',') = a,join() = a+ ' '
''1, 2, 3''
  • a.concat()
var c = a.concat(b)
//复制一个数组
var b = a.concat([])
a === b //false 不同数组
  • a.map()
     
    map
 
forEach和map的区别
  • a.filter()
a = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10 ]

a.filter(function(value, key) {
  return value % 2 === 0 
}).map(fucntion(value) {
  return value * value
}) // (5) [4, 16, 36, 64, 100]
 
  • a.reduce()
    map可以用reduce表示
    filter可以用reduce表示
a = [1, 2, 3]
a.reduce(function(sum,n) {
     return sum + n  
}, 0)

// map用reduce表示
a.reduce(function(arr, n) {
  arr.push(n*2)
  return arr
}, [])
// (3) [2, 4, 6]

//filter用reduce表示
a.reduce(fucntion(arr,n) {
  if (n % 2 === 0) {
      arr.push(n)
  }
  return arr
}, [])

 

关于js伪数组

  • 具有length属性;
  • 按索引方式存储数据;
  • 不具有数组的push()、pop()等方法;

 

你可能知道怎么把伪数组转换为数组,但是你知道这里边的原理吗?

假如页面有一组li元素

<ul>
    <li>1111</li>
    <li>1111</li>
    <li>1111</li>
</ul>

获取集合,控制台打印

这就是一个伪数组,长得很像数组,但是没有数组splice,concat,join,pop等方法

通过如下方法转换为数组

Array.prototype.slice.call(oUL);

可以看到变成了数组,并且拥有了Array的所有方法

那么问题来了,这是怎么实现的呢?

接下来重点来了

复制代码
var obj = {//构造一个伪数组
    "0": "aaa",
    "1": 12,
    "length": 2,
    "push": Array.prototype.push,
    "splice": Array.prototype.splice
}

Array.prototype.push = function(arr) {//动态改变length,并且添加新元素到数组末尾this[this.length] = arr;
this.length++; } console.log(obj); obj.push(
"newVal"); console.log(obj)
复制代码

可以看到,现在我们的伪数组已经和之前有一样的结构和功能,既可以存储对象数据,又可以有数组的方法。

如果你看懂了以上教程,我出道题来考考你,说明你真的懂了

复制代码
var obj = {
    "0": "a",
    "1": "b",
    "3": "c",
    "length": 3,
    "push": Array.prototype.push,
}

obj.push("d");

console.log(obj);
console.log(obj.length);
复制代码

欢迎留言回答,评论,说说你的答案

.

分享到:
评论

相关推荐

    JavaScript伪数组用法实例分析

    主要介绍了JavaScript伪数组用法,结合实例形式分析了伪数组的概念、功能、定义及简单使用方法,需要的朋友可以参考下

    javascript 伪数组实现方法

    这篇文章来回答javascript通用循环遍历方法forEach中最后提到的关于伪数组的问题。 什么是伪数组 能通过Array.prototype.slice转换为真正的数组的带有length属性的对象。 这种对象有很多,比较特别的是arguments对象...

    【JavaScript源代码】javascript类数组的深入理解.docx

     js数组,相比大家都很熟悉,因为走到哪都要用,但它有个“双胞胎弟弟” ,叫类数组(也叫伪数组),可能有的人了解,有的人不了解,今天我们来看一看。 顾名思义,这玩意儿肯定是个长得像数组,但又不算数组的...

    JS Array.from()将伪数组转换成数组的方法示例

    1、类似数组的对象,可以理解为“伪数组” 2、可遍历对象(比如字符串) 什么是伪数组? 伪数组都有一个基本的特点:必须有 length 属性。 let arrayLike = { "0": "a", "1": "b", "2": "c", "length": 3 } ...

    js中将HTMLCollection NodeList 伪数组转换成数组的代码.docx

    js中将HTMLCollection NodeList 伪数组转换成数组的代码.docx

    js中将HTMLCollection/NodeList/伪数组转换成数组的代码

    js中将HTMLCollection/NodeList/伪数组转换成数组的代码,需要的朋友可以参考下。

    Javascript之高级数组API的使用实例

    例一:伪数组,不能修改长短的数组(所以没办法清零),可以修改元素,代码实现如下: [removed] fn(1,2); fn(1,2,3,4,5,6); fn(1,2,4,5,7,9,4); function fn(a,b){ arguments[0]=0; console.log(arguments); ...

    JavaScript基础和实例代码

    1.4.3 通过JavaScript伪URL引入 1.4.4 通过HTML文档事件处理程序引入 1.5 嵌入JavaScript脚本代码的位置 1.5.1 在与标记对之间放置 1.5.2 在与标记对之间放置 1.5.3 在两个标记对之间混合放置 1.6 选择合适的浏览器 ...

    移动端web某马机构前端内部面试题,es,js

    真数组和伪数组的区别?数组如何进行降维(扁平化)?怎么理解mvvm这种设计模式?v-if和v-show的区别,使用场景区别、组件中的data为什么是函数,new Vue 实例里,data 可以直接是一个对象computed和watch的区别是...

    javascript forEach通用循环遍历方法

    //数组与伪数组的遍历 var _Array_forEach = function (array, block, context) { if (array == null) return; //对String进行特殊处理 if(typeof array == 'string'){ array = array.split('');

    jsrand:用于JavaScript的种子式伪随机数生成器

    用于JavaScript的种子式伪随机数生成器。 它可以用作普通脚本或。 数字是使用单种形式的生成的。 尽管此方法对于大多数应用程序来说都是可行的,但在密码学上却不强。 jsrand支持在数组上保存和恢复生成器状态...

    05-大事件和node阶段某马机构前端内部面试题.md

    真数组和伪数组的区别?数组如何进行降维(扁平化)?怎么理解mvvm这种设计模式?v-if和v-show的区别,使用场景区别、组件中的data为什么是函数,new Vue 实例里,data 可以直接是一个对象computed和watch的区别是...

    【JavaScript源代码】JavaScript实现换肤效果(换背景).docx

    2、获取一组图片元素对象(得到伪数组) 3、for循环给图片绑定点击事件- - -onclick,事件处理程序中设置body元素对象的背景图片为- - -当前被点击的图片的路径 4、注意:body元素对象的获取为- - -document.body,...

    tastebile:日常代码归类整理总结学习

    fixed 的问题Javascript整理学习js知识,夯实基础 JavaScript编码规范 字符串的基本操作方法 JS获取URL中参数值(QueryString)的方法 对字符串中进行转义的 escapehtml 的函数 js基础之数组操作 数组的检测方法 ECM...

    JavaScript常用脚本汇总(二)

    把JavaScript中的伪数组转换为真数组 在 JavaScript 中, 函数中的隐藏变量 arguments 和用 getElementsByTagName 获得的元素集合(NodeList)都不是真正的数组,不能使用 push 等方法,在有这种需要的时候只能先...

    源文件程序天下JAVASCRIPT实例自学手册

    1.4.3 通过JavaScript伪URL引入 1.4.4 通过HTML文档事件处理程序引入 1.5 嵌入JavaScript脚本代码的位置 1.5.1 在&lt;head&gt;与&lt;/head&gt;标记对之间放置 1.5.2 在&lt;body&gt;与&lt;/body&gt;标记对之间放置 ...

Global site tag (gtag.js) - Google Analytics