zoukankan      html  css  js  c++  java
  • JavaScript,通过分析Array.prototype.push重新认识Array

      在阅读ECMAScript的文档的时候,有注意到它说,数组的push方法其实不仅限于在数组中使用,专门留作通用方法。难道是说,在一些类数组的地方也可以使用?而哪些是和数组非常相像的呢,大家或许一下子就可以想到就是Object对象。因为Array就是继承自Object的,可以用 [] instanceof Object,会发现返回的是true。当然大家都知道,这也不是什么新鲜事。那我们可以大胆尝试一下,如果我们将数组的push方法应用在对象上,会一个怎么样的表现呢?

      

      我们通过call,将this的值指向了obj,然后进行push。可以发现,obj对象里多了一个 '0': 'zero'和数组的'length'属性!我们都知道,一般对象是没有length属性的,所以当我们要知道Object有多少个属性时,一般都要用for in来进行对象迭代。那可以知道,这个length属性则是由Array.prototype.push这个方法,内部传进去的。为了接近我们的想法,我们可以继续实验。

      

      这一次我们自己传入了一个length值,我们可以看得出,push方法是根据length的值来为key命名的,大致思路应该如下。  

      

      其实JavaScript数组的数据结构就是栈,遵循着“后进先出”,当然这个length-1也就充当着top这个角色啦!当然如果我们要使用push进去的属性,我们就要使用方括号的形式[],因为点符号是不能直接接上数字的。所以就成了 obj[0] == 'zero'。这乍一看!尼玛,这不就是数组么,哟,只是长得像而已~~毕竟Array.prototype里的方法可丰富多啦。特别是ECMAScript新增的各种数组迭代方法,forEach, map,some,reduce之类的,简直好用到不行,特别是最近发掘的reduce,可以配合之前刚刚探讨过的递归算法使用,简直开发利器。有时间我会专门说一下reduce该如何使用!

      

      

  • 相关阅读:
    《WF in 24 Hours》读书笔记
    《WF in 24 Hours》读书笔记
    《Sams Teach Yourself Windows® Workflow Foundation in 24 Hours》读书笔记目录
    Oops, 'Microsoft.ACE.OLEDB.12.0' provider is not registered on the local machine error
    RemoteViews嵌入ListView复杂布局
    Mysql访问 for橙子小海
    Android中AppWidget的分析与应用:AppWidgetProvider .
    Android 常用网站
    linux下vi命令大全
    最优秀的5个Linux文本编辑器
  • 原文地址:https://www.cnblogs.com/YikaJ/p/4278255.html
Copyright © 2011-2022 走看看