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该如何使用!
JavaScript,通过分析Array.prototype.push重新认识Array的更多相关文章
- 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 ...
- js中Array.prototype.push.call的用法
var arr = [] Array.prototype.push.call(arr,"a","b","c") <==> []. ...
- JavaScript的Array.prototype.filter()详解
摘抄与:https://developer.mozilla.org/zh-CN/docs/Web/JavaScript/Reference/Global_Objects/Array/filter 概述 ...
- Array.prototype
Array.prototype 属性表示 Array 构造函数的原型,并允许您向所有Array对象添加新的属性和方法. /* 如果JavaScript本身不提供 first() 方法, 添加一个返回 ...
- Array.prototype鲜为人知的事实
// constructor 属性是每个具有原型的对象的原型成员. // 这包括除 Global 和 Math 对象之外的所有内部 JavaScript 对象. // constructor 属性包含 ...
- js Array.prototype.reduce()
例子: , , , ]; const reducer = (accumulator, currentValue) => accumulator + currentValue; // 1 + 2 ...
- 【02】[].slice和Array.prototype.slice
[02][].slice和Array.prototype.slice 01,Array是一个构造函数.浏览器内置的特殊对象. 02,Array没有slice方法. 03,Array.prototy ...
- js中的arguments、Array.prototype.slice.call()
类数组对象:arguments js把传入到这个函数的全部参数存储在arguments里面,其实arguments也是个对象,而且是一个特殊的对象,它的属性名是按照传入参数的序列来的,第1个参数的属性 ...
- [基础] Array.prototype.indexOf()查询方式
背景 最近在看Redux源码,createStore用于注册一个全局store,其内部维护一个Listeren数组,存放state变化时所有的响应函数. 其中store.subscribe(liste ...
随机推荐
- UDP protocol
Characteristics of the UDP protocol The UDP protocol (User Datagram Protocol) is a connectionless or ...
- 从Uboot到Linux技术内幕
1. 引言 在专用的嵌入式板子运行 GNU/Linux 系统已经变得越来越流行.一个嵌入式 Linux 系统从软件的角度看通常可以分为四个层次: 1. 引导加载程序.包括固化在固件(firmware) ...
- Android手机拍照
参考的这个视频教程:http://v.youku.com/v_show/id_XNjI5MzkzMjQ4.html和官方API档file:///D:/Android/androidstudio/sdk ...
- JUnit4概述
JUnit4是JUnit框架有史以来的最大改进,其主要目标便是利用Java5的Annotation特性简化测试用例的编写. 先简单解释一下什么是Annotation,这个单词一般是翻译成元数据.元数据 ...
- 函数buf_LRU_old_adjust_len
调整LUR_old位置,放到八分之五位置,是新的,后八分之三是旧的 512个页全变成新的,然后从后往前数,数到8分之3,设置为旧的 /********************************* ...
- 使用截图方式将Excel导出为PNG图片的不可行性
博主前面一篇文章使用了JAVA的Robot机制 模拟打开Excel然后Robot移动到指定区域,截图并生成PNG格式图片 试图使用这种方式将复杂的Excel报表转化成无差别的PNG图片 但是这种方式遇 ...
- JAVA使用apache http组件发送POST请求
在上一篇文章中,使用了JDK中原始的HttpURLConnection向指定URL发送POST请求 可以看到编码量有些大,并且使用了输入输出流 传递的参数还是用“name=XXX”这种硬编的字符串进行 ...
- UVa 1328 (KMP求字符串周期) Period
当初学KMP的时候也做过这道题,现在看来还是刘汝佳的代码要精简一些,毕竟代码越短越好记,越不容易出错. 而且KMP的递推失配函数的代码风格和后面的Aho-Corasick自动机求失配函数的代码风格也是 ...
- ti processor sdk linux am335x evm setup.sh hacking
#!/bin/sh # # ti processor sdk linux am335x evm setup.sh hacking # 说明: # 本文主要对TI的sdk中的setup.sh脚本进行解读 ...
- 06day1
Rabbit Number 枚举 [问题描述] 设 S(N)表示 N 的各位数字之和,如 S(484)=4+8+4=16,S(22)=2+2=4.如果一个正整数 x满足 S(x*x)=S(x)*S(x ...