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 ...
随机推荐
- Entity Framework学习 - 2.增删改查
1.增加数据 PirateBayEntities db = new PirateBayEntities(); T_Tests test = new T_Tests(); test.Name = &qu ...
- i386 和amd64 的意思
首先可以简化一个概念,i386=Intel 80386.其实i386通常被用来作为对Intel(英特尔)32位微处理器的统称. Windows NT类系统的安装盘上,通常i386是其根上的一个文件夹, ...
- hive学习笔记——表的基本的操作
1.hive的数据加载方式 1.1.load data 这中方式一般用于初始化的时候 load data [local] inpath '...' [overwrite] into table t1 ...
- Windows下tuxedo配置
setenv.cmd rem (c) 2003 BEA Systems, Inc. All Rights Reserved. rem Copyright (c) 2000 BEA Systems, I ...
- 1287. Mars Canals(DP)
1287 水DP #include <iostream> #include<cstdio> #include<cstring> #include<algori ...
- fil_system_struct
/** The tablespace memory cache */ typedef struct fil_system_struct fil_system_t; /** The tablespace ...
- 函数xdes_get_offset
/********************************************************************//** Returns page offset of the ...
- 用net匹配并替换iOS标准的emoji表情符号
using System; using System.Collections.Generic; using System.Linq; using System.Text; namespaceCommo ...
- UVa 548 Tree【二叉树的递归遍历】
题意:给出一颗点带权的二叉树的中序和后序遍历,找一个叶子使得它到根的路径上的权和最小. 学习的紫书:先将这一棵二叉树建立出来,然后搜索一次找出这样的叶子结点 虽然紫书的思路很清晰= =可是理解起来好困 ...
- highcharts 饼图显示数据比例如何保留二位小数
var NewPerCent=parseFloat(NewPerCent.toString()).toFixed(2);return '<b>'+ this.point.name +'&l ...