在阅读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该如何使用!

  

  

JavaScript,通过分析Array.prototype.push重新认识Array的更多相关文章

  1. Array.prototype.push.apply(a,b)和Array.prototype.slice.call(arguments)

    Array.prototype.push.apply(a,b) 时常看到在操作数组的时候有这样的写法: var a = [1,2,3]; var b = [4,5,6]; a.push.apply(a ...

  2. js中Array.prototype.push.call的用法

    var arr = [] Array.prototype.push.call(arr,"a","b","c") <==> []. ...

  3. JavaScript的Array.prototype.filter()详解

    摘抄与:https://developer.mozilla.org/zh-CN/docs/Web/JavaScript/Reference/Global_Objects/Array/filter 概述 ...

  4. Array.prototype

    Array.prototype  属性表示 Array 构造函数的原型,并允许您向所有Array对象添加新的属性和方法. /* 如果JavaScript本身不提供 first() 方法, 添加一个返回 ...

  5. Array.prototype鲜为人知的事实

    // constructor 属性是每个具有原型的对象的原型成员. // 这包括除 Global 和 Math 对象之外的所有内部 JavaScript 对象. // constructor 属性包含 ...

  6. js Array​.prototype​.reduce()

    例子: , , , ]; const reducer = (accumulator, currentValue) => accumulator + currentValue; // 1 + 2 ...

  7. 【02】[].slice和Array.prototype.slice

    [02][].slice和Array.prototype.slice 01,Array是一个构造函数.浏览器内置的特殊对象.   02,Array没有slice方法. 03,Array.prototy ...

  8. js中的arguments、Array.prototype.slice.call()

    类数组对象:arguments js把传入到这个函数的全部参数存储在arguments里面,其实arguments也是个对象,而且是一个特殊的对象,它的属性名是按照传入参数的序列来的,第1个参数的属性 ...

  9. [基础] Array.prototype.indexOf()查询方式

    背景 最近在看Redux源码,createStore用于注册一个全局store,其内部维护一个Listeren数组,存放state变化时所有的响应函数. 其中store.subscribe(liste ...

随机推荐

  1. 【POJ】3523 The Morning after Halloween

    1. 题目描述$m \times n$的迷宫(最大为$16 \times 16$)包含最多3个点,这些点可以同时向相邻方向移动或保持停止,使用小写字母表示起始位置,使用大写字母表示中止位置.求最少经过 ...

  2. oracle视图总结(转)

    视图简介: 视图是基于一个表或多个表或视图的逻辑表,本身不包含数据,通过它可以对表里面的数据进行查询和修改.视图基于的表称为基表.视图是存储在数据字典里的一条select语句. 通过创建视图可以提取数 ...

  3. hdu 4941 Magical Forest ( 双重map )

    题目链接 题意: 有一个n*m的田地,里边有k棵树,每棵树的位置为(xi,yi),含有能量值ci.之后又q个询问,分三种; 1)1 a b,将a行和b行交换 2)2 a b,将a列和b列交换 3)3 ...

  4. Android开发性能优化大总结

    1.  采用硬件加速,在androidmanifest.xml中application添加android:hardwareAccelerated="true".不过这个需要在and ...

  5. LA 3485 (积分 辛普森自适应法) Bridge

    桥的间隔数为n = ceil(B/D),每段绳子的长度为L / n,相邻两塔之间的距离为 B / n 主要问题还是在于已知抛物线的开口宽度w 和 抛物线的高度h 求抛物线的长度 弧长积分公式为: 设抛 ...

  6. UVa 11542 (高斯消元 异或方程组) Square

    书上分析的太清楚,我都懒得写题解了.=_=|| #include <cstdio> #include <cstring> #include <cmath> #inc ...

  7. UVa 10054 The Necklace【欧拉回路】

    题意:给出n个珠子,珠子颜色分为两半,分别用1到50之间的数字表示, 现在给出n个珠子分别的颜色,问是否能够串成一个环.即为首尾相连,成为一个回路 判断是否构成一个环,即判断是否为欧拉回路,只需要判断 ...

  8. MetadataType的使用,MVC的Model层数据验证

    MetadataType的使用,MVC的Model层数据验证 指定要与数据模型类关联的元数据类   using System.ComponentModel.DataAnnotations; //指定要 ...

  9. JAVA安卓和C# 3DES加密解密的兼容性问题(2013年8月修改版)

    近 一个项目.net 要调用JAVA的WEB SERVICE,数据采用3DES加密,涉及到两种语言3DES一致性的问题, 下面分享一下, 这里的KEY采用Base64编码,便用分发,因为Java的By ...

  10. Mysql,SqlServer,Oracle主键自动增长的设置

    1.把主键定义为自动增长标识符类型 MySql 在mysql中,如果把表的主键设为auto_increment类型,数据库就会自动为主键赋值.例如: )); insert into customers ...