`

Array.prototype.slice.call自解

阅读更多

为了研究Currying in Javascript,翻阅了很多外文网站,为的是找一个比较好的Currying方案,找到的比较详细的有如下(文章内部链接可能包含更多的相关文章):

  1. Currying JavaScript Functions
  2. JavaScript Currying Redux
  3. JavaScript currying
  4. functional.js 介绍及源码分析

发现大多人都用了Array.prototype.slice.call(argments,0),一直不明白这句是干什么的。而昨天温习了slice()方法,再参考Function.call(thisArg[, arg1[, arg2[, ...]]]),还是不得而知(我脑筋转得慢:|)。上网查,第一时间查老外的Google.com in English也没解释,真到查找“Array.prototype.slice 用法”时,才得到数篇。虽然我很鄙视搞收集的人,搞得互联网文章像是天下一大抄似的,但现在却恨少,只得三篇(一模一样的三篇,责任编辑为admin或者超级管理员,作者是佚名。)

下面就我的理解,对Array.prototype.slice.call进行解说,菜鸟留下,大虾吐口水:
Update: 下面写的可能有点难懂,怕刚接触Javascript的人可能会看不懂,请大家看完后留个言,谢谢!

Array.prototype.slice.call(thisArg[, arg1[, arg2[, ...]]])

成员介绍:

Array [object]

Array对象(即数组对象)

prototype [property]

Javascript的原型,此prototype非Prototype.js,可以暂且理解为Java中的静态属性/方法。总之这个不好说,详细请看JavaScript中的prototype(原型)属性研究

slice [Function]

数组切分方法,很有用的一个方法,具体请看这里,或那里

call [Function]

神奇的方法,该方法是所有Function对象里的方法,所以slice就有这样一个方法。用于把Function对象里的this替换为目标对象。看这里

串起来就是:

用人类的语言说,就是Array有个prototype,slice是prototype的儿子,call是slice的妻子(很多砖头飞过来。)请继续往下看。

作用效果:
Array.prototype.slice.call == [].slice

虽然运行结果是一个样的,但经过试验(别人做的试验,不是我),前者的运行效率比后者大大提高,所以就这样应用。

机理:
这里的slice方法就是一个Function对象。通常情况下,程序员通过如下方法调用Function,实质是普通的函数调用方法:

Array.slice(begin,end)

至于call()方法,METHOD: Function::call告诉我们,可以通过

Function.call(thisArg[, arg1[, arg2[, ...]]])

的形式调用一个Function对象,把当中的this对象替换为thisArg,即可以得到下面的代码:

Array.prototype.slice.call(obj,begin,end)

用伪代码模拟过程:

好,我们用伪代码的方法来模拟整个过程:

var mySlice=Array.prototype.slice;
 
alert(mySlice); //alert: function(begin[,end]){...},这是个“函数”
 
var array_empty=mySlice(begin,end); //create a new,empty array
 
set array_empty=obj; //此时,把obj赋给这个空的数组,使数组有了种子,
                              //这就是call()所做的事,“人工受精”
 
alert(array_empty); //这是个未定型的数组对象,由Javascript内部掌控着,
                           //这样看可能没什么结果,但有结果的话,就一定与obj有关
 
//下面是关键的一行:
var array_last=array_empty.slice(begin,end);
/**
*虽然之前说未定型,
*但返回的已经是一个数组了,我们对数组进行切割,但拿什么进行切?
*没错,就拿用obj制造出来的数组进行切割,
*一个新的数组对象产生了!
*/

同样,Array.prototype.slice.apply(obj)及类似的代码也可以这样理解,只要不被prototype干扰到就行了。看到这里还不明白的人请重温Array.slice(begin,end)

相关阅读:

[1]Array.prototype.slice.apply 使用技巧

[2]Array-like Objects in JavaScript

分享到:
评论

相关推荐

    浅谈javascript的Array.prototype.slice.call

    发现大多人都用了Array.prototype.slice.call(argments,0),一直不明白这句是干什么的。而昨天温习了slice()方法,再参考Function.call(thisArg[, arg1[, arg2[, ...]]]),还是不得而知(我脑筋转得慢:|)。

    arguments:永远不要写“Array.prototype.slice.call(arguments);” 以后再!

    永远不要写Array.prototype.slice.call(arguments); 以后再! 这是基于但使用Object.defineProperty(arguments.constructor.prototype, [functionName], {enumerable: false, configurable: true, value: [function...

    Array.prototype.slice.apply的使用方法

    arguments在JavaScript语法中是函数特有的一个对象属性(Arguments对象),用来引用调用该函数时传递的实际参数。

    javascript Array.prototype.slice的使用示例

    经常的,可以看到Array.prototype.slice(arguments, 0); 这个写法可以用于function() {} 内,这样可以将函数的参数列表转换成一个真正的数组。请看一个例子: 代码如下:var slice = Array.prototype.slice;var ...

    array.prototype.silce.call 理解分析

    Array.prototype.slice.call(thisArg[, arg1[, arg2[, …]]])成员介绍: Array 数组对象 prototype [property]是javascript中对象的属性,用来返回对象的原型引用,可以动态的给此添加方法和属性,对象如array,...

    Array.prototype.slice 使用扩展

    slice 可以用来获取数组片段,它返回新数组,不会修改原数组。

    js中将具有数字属性名的对象转换为数组

    虽然不太常用,但我们的确可以给对象添加以数字为属性名的属性: 代码如下...Array.prototype.slice.call(obj)); 上面这段代码在IE下直接报错,在Firefox下虽然没有报错,输出内容却是空。也就说,转换失败了。这种

    深入探密Javascript数组方法

    在JavaScript中,数组可以使用Array构造函数来创建,或使用[]快速创建,这也是首选的方法。数组是继承自Object的原型,... var nodesArr = Array.prototype.slice.call(document.forms);  var argsArr = Array.pro

    js利用prototype调用Array的slice方法示例

    代码如下: [removed] function fn(name){ if(typeof name === “string”){ var args = Array.prototype.slice.call( arguments, 1 ); for(var i=0;i<args.length;i++){ alert(args[i]);//结果: 111 222 ...

    fast-js:编写快速JavaScript

    快速js :smiling_face_with_heart-eyes: 编写快速JavaScript ...Array.prototype.slice.call x 23,349,580 ops/sec ±1.42% (88 runs sampled) lodash.toArray x 11,654,756 ops/sec ±1.33% (88 run

    javascript 伪数组实现方法

    这篇文章来回答javascript通用循环遍历方法forEach中最后提到的关于伪数组的... 我们可以通过Array.prototype.slice.call(fakeArray)将伪数组转变为真正的Array对象。 来看个示例: 代码如下: var fakeArray01 = {0:’a

    JS实现滑动插件

    本文实例为大家分享了JS实现滑动插件的具体代码,供大家参考,具体内容如下 基本思路是封装一个Slider类, 拥有默认初始配置参数。 Slider.prototype(原型链上)拥有实现... var args = Array.prototype.slice.call(ar

    arbitrait:JavaScript的特质

    每个人都知道我们不应该修改Array.prototype 。 但是,如果我们真的想拥有array.first()怎么办? 我们可以以特质整齐且无害地隔离一些接近的东西! npm install arbitrait const trait = require ( "arbitrait" ...

    程序员考试刷题-20-days-of-restudying-[removed]重新学习javascript20天

    Array.prototype.slice()中: slice()方法将数组的一部分的浅拷贝返回到从开始到结束(不包括结束)选择的新数组对象中。 不会修改原始数组。 问: slice适用于对象吗? 一种: 。 所以你可以这样做: const info = ...

    Advanced-JavaScript:基于John Resig网站上有关Advanced JavaScript的文档

    高级JavaScript 本文档基于John Resig的高级JavaScript网站。 如果这些概念对您而言似乎很复杂,那么我建议您使用,同时也强烈... var fn = this , args = Array . prototype . slice . call ( arguments ) , object =

    JavaScript对象链式操作代码(jquery)

    虽然现在慢慢减少了对jQuery的使用(项目上还是用,效率高点。平时基本不用了),希望从而减少对jQuery的依赖度。 但是这链式操作的方式实在吸引人(貌似现在... //var args = Array.prototype.slice.call(arguments,0

    JavaScript 对象链式操作测试代码

    虽然现在慢慢减少了对jQuery的使用(项目上还是用,效率高点。平时基本不用了),希望从而减少对jQuery的依赖度。 但是这链式操作的方式实在吸引人(貌似现在... //var args = Array.prototype.slice.call(arguments,0

    利用javascript中的call实现继承

    昨天阿丹传了一个javascript中的重载例子给我,感觉不错.... window.setTimeout = function(fRef, mDelay) { if(typeof fRef == ‘function’){ var argu = Array.prototype.slice.call(arguments,2); va

    js prototype深入理解及应用实例分析

    本文实例讲述了js prototype深入理解及应用。分享给大家供大家参考,具体... var args = Array.prototype.slice.call(arguments, 1); return args; } 咦???看着上面这行代码,你是不是对prototype只是属于函数产生

Global site tag (gtag.js) - Google Analytics