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

  

  

时间: 2024-09-30 09:42:48

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

Array.prototype.push.apply

Array.prototype.push.apply(a,b) || a.push.apply(a,b);var a=[1,2,3],b=[4,5,6];Array.prototype.push.apply(a,b) a===[1, 2, 3, 4, 5, 6]b===[4, 5, 6] http://blog.csdn.net/maoguiyou/article/details/51433551

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, b); console.log(a) //[1,2,3,4,5,6] 其实这样的写法等价于: var a = [1,2,3]; var b = [4,5,6]; Array.prototype.push.apply(a, b); console.log(a) //[1,2,3,4,5,6] 这样

【js】一些小技巧(1),关于Array.prototype.push,Array.prototype.slice的用法

阅读源码的时候会看到这样操作: 1.Array.prototype.push的介绍 var push = Array.prototype.push; push.apply(args, arguments); 为什么会用push.apply,而不是直接push呢? //push.apply var a = [1,2,3] , b = [4,5,6],push = Array.prototype.push; push.apply(a,b) ; console.log(a)  // [1, 2, 3,

将函数的实际参数转换成数组的方法,习惯用Array.prototype.slice.call(arguments)

实际参数在函数中我们可以使用 arguments 对象获得 (注:形参可通过 arguments.callee 获得),虽然 arguments 对象与数组形似,但仍不是真正意义上的数组. 我们可以通过数组的 slice 方法将 arguments 对象转换成真正的数组. 方法一:通过Array.prototype属性调用slice方法 var args = Array.prototype.slice.call(arguments); Array 本身是没有 slice 方法,它的方法在 Arr

对数组的操作Array.prototype.sort 方法--alert( [1, 3, 9, 2].sort() )

1.   数组的 sort 方法 远远没有被充分利用,而且可能比开发者们想像的更加强大.很多开发者可能觉得 sort 方法可以用来做这种事情: [1, 3, 9, 2].sort(); // 返回 [1, 2, 3, 9] alert( [1, 3, 9, 2].sort() ) ……这没错,但它还有更强大的用法,比如这样: [ { name: "Robin Van PurseStrings", age: 30 }, { name: "Theo Walcott",

JavaScript 中 Array.prototype.slice.call(arr, 2) 这样的写法用意是什么?

看了很多 JavaScript 的源代码,发现很多类似这样的写法 Array.prototype.slice.call(arr, 2) 比较不解的是,既然 arr 是数组,为什么不直接这样写呢 arr.slice(2) 为什么实例对象本身已经有这个方法,为什么不直接调用,而采用这样的写法?有什么特殊用意吗 主要原因是为了防止有些对象没有slice方法. 举个例子: 在javascript里有一种array-like的对象,就是和Array很像,比如拥有push,slice等方法,拥有length

Javascript中Array.prototype.map()详解

map 方法会给原数组中的每个元素都按顺序调用一次 callback 函数.callback 每次执行后的返回值组合起来形成一个新数组. callback 函数只会在有值的索引上被调用:那些从来没被赋过值或者使用 delete 删除的索引则不会被调用. 在我们日常开发中,操作和转换数组是一件很常见的操作,下面我们来看一个实例: 复制代码代码如下: var desColors = [],    srcColors = [        {r: 255, g: 255, b: 255 }, // W

javascript:Array.prototype.slice.call(arguments)

我们知道,Array.prototype.slice.call(arguments)能将具有length属性的对象转成数组,除了IE下的节点集合(因为ie下的dom对象是以com对象的形式实现的,js对象与com对象不能进行转换) 如: 1 var a={length:2,0:'first',1:'second'}; 2 Array.prototype.slice.call(a);// ["first", "second"] 3 4 var a={length:2}

javascript中 Array.prototype.slice的用法.

首先看到 www.w3school.cn上的解释:http://www.w3school.com.cn/jsref/jsref_slice_array.asp 定义和用法 slice() 方法可从已有的数组中返回选定的元素. 语法 arrayObject.slice(start,end) 参数 描述 start 必需.规定从何处开始选取.如果是负数,那么它规定从数组尾部开始算起的位置.也就是说,-1 指最后一个元素,-2 指倒数第二个元素,以此类推. end 可选.规定从何处结束选取.该参数是数