zoukankan      html  css  js  c++  java
  • 5分钟深刻理解伪数组

     
    我们常见的伪数组都有哪些?arguments、通过document.getElements..获取到的内容;
     
    这些伪数组有什么特点呢?它具有length属性,也是一个一个的元素组成的,但是构造器不是Array,不能使用数组的方法。
     
    我们来思考一个问题:为什么伪数组就不能使用数组方法,为什么数组就能使用push等方法了
      var a = []  //这是js的语法糖;
      正规的用法:var a = new Array()。
      一个数组都是由它的构造器实例化出来的,
      因为Array是一个构造函数,每一个构造函数都有原型,且构造函数构造出来的实例可以使用原型上的方法,也就是说因为Array的原型上有一些方法,所以每一个数组都可以使用这些push等等的方法
      那么重点来啦!!!
      因为伪数组的构造器不是Array,当然不能使用Array原型上的push等方法
     
    那么伪数组如何转化为真正的数组呢?
        方法一:通过遍历将伪数组里元素放入到一个新的数组里
      let arg = arguments//这就是一个典型的伪数组
       let arr = []
       for (var i = 0; i < arg.length; i++) {
          arr.push(arg[i])
        }
        console.log(arr)
     方法二:
      let arr = [].slice.call(arg) //Array.prototype.slice.call(arg)

     

       方法二中一行代码就能实现,但是实现的原理是什么呢?关键在sclice和call
       数组有一个方法slice,这个方法每次都会返回一个新数组,如果不传参数的话,返回的新数组的元素和原数组的元素是一模一样的,如果伪数组也能执行这个slice方法的话,那么是不是就会返回一个新的真正的数组呢?但是此时不能直接执行,所以我们使用偷梁换柱的方法,让一个真正的数据,或者直接从Array.prototype上执行slice方法,但是在执行的时候通过call来将里面的this换成咱们的伪数组,改变数组slice方法里的this指向,这样的话,就会返回一个元素和伪数组元素一样的真正数组了
     

     

  • 相关阅读:
    C# 类型的创建
    C# 中4个访问符和8个修饰符详解
    C#命名空间详解namespace
    ContextMenuStrip 添加在窗体。点击右键不能显示问题解答
    C# 学习笔记 C#基础
    React-Navigation web前端架构
    Css animation 与 float 、flex 布局问题
    javaScript 工作必知(十一) 数组常用方法实现
    Vue 父子组件传值 props
    kafka 参数配置 1
  • 原文地址:https://www.cnblogs.com/keyanjyl/p/7975656.html
Copyright © 2011-2022 走看看