`
wangemperor
  • 浏览: 39980 次
  • 性别: Icon_minigender_1
  • 来自: 济南
社区版块
存档分类
最新评论

Array.prototype.slice.call

阅读更多

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中的静态属性/方法。总之这个不好说,详细请看这里

 

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)

分享到:
评论

相关推荐

    浅谈javascript的Array.prototype.slice.call

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

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

    `Array.prototype.slice.apply` 是 JavaScript 中一种巧妙的技巧,它允许我们借用 `Array.prototype.slice` 方法来处理非数组对象,尤其是 `arguments` 对象。`arguments` 是一个伪数组对象,它在每个函数内部可用,...

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

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

    javascript Array.prototype.slice使用说明

    JavaScript中的`Array.prototype.slice`方法是一个非常实用的工具,它允许你从数组中提取一部分元素并返回一个新的数组,而不会改变原始数组。这个方法在处理数组或者类似数组对象时尤其有用,因为它能处理那些拥有`...

    javascript Array.prototype.slice的使用示例

    通过`Array.prototype.slice.call(arguments, 0)`,我们可以将`arguments`对象转化为真正的数组,从而可以使用数组的所有方法。 例如: ```javascript var slice = Array.prototype.slice; (function() { var ...

    array.prototype.silce.call 理解分析

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

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

    要将这样的对象转换为数组,一种常见的方法是使用`Array.prototype.slice.call()`。这个方法是基于原型链的特性,尝试将对象视为数组来执行切片操作。然而,这种方法并不总是有效,因为它依赖于对象具有`length`属性...

    Array.prototype 的泛型应用分析

    var args = Array.prototype.slice.call(arguments); ``` 这行代码将 `arguments` 对象转换为真正的数组,以便可以使用数组特有的方法。 总的来说,了解并熟练运用 `Array.prototype` 的泛型应用可以提高代码的...

    Array.prototype.slice 使用扩展

    `Array.prototype.slice` 是 JavaScript 中一个非常重要的方法,它用于从数组中提取一个部分,并返回一个新的数组,同时原始数组保持不变。这个方法的核心在于它的灵活性和在处理类似数组对象(array-like objects)...

    JavaScript学习笔记之ES6数组方法_.docx

    在ES5中,我们通常使用`Array.prototype.slice.call()`来实现这个功能,但在ES6中,我们可以直接使用`Array.from()`。例如,一个拥有`length`属性的对象,如`arguments`对象,可以通过`Array.from()`轻松转换。此外...

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

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

    前端面试题之baseJS-arrayLikeToArr.zip

    - **Array.prototype.slice.call()**:这是最常用的转换方法,通过调用Array.prototype.slice方法并传入类数组对象作为上下文。例如: ```javascript var arrayLike = {0: 'a', 1: 'b', 2: 'c', length: 3}; var...

    js字符串转数组的常用方法.docx

    `Array.prototype.slice()`方法通常用于复制数组的一部分,但当我们用它与`call()`函数结合时,可以将其用于字符串,将字符串视为字符数组: ```javascript const str = "Hello"; const arr = Array.prototype....

    前端面试题之baseJS-isArray.zip

    var args = Array.prototype.slice.call(arguments); // ... } ``` 通过理解和熟练运用以上知识点,前端开发者可以在面试中展示自己扎实的JavaScript基础,特别是对数组操作的理解和应用能力。不断学习和实践,...

    JavaScript HTML DOM.docx

    console.log(Array.prototype.slice.call(y)); ``` 2. **使用 Array.prototype.slice.apply()** - ```javascript console.log(Array.prototype.slice.apply(y)); ``` 3. **使用 Array.prototype.slice.bind()**...

    array.js:使ie8等浏览兼容array最新方法

    在IE8中,可以使用`Array.prototype.slice.call()`转换为可迭代对象,再配合for循环实现。 ```javascript if (!Array.prototype.map) { Array.prototype.map = function(callback, thisArg) { var T, A, k; if ...

Global site tag (gtag.js) - Google Analytics