`
liuguofeng
  • 浏览: 436372 次
  • 性别: Icon_minigender_1
  • 来自: 成都
社区版块
存档分类
最新评论

Array.prototype.slice.call

 
阅读更多

在研究某个框架源码的时候,看到的。
查了下资料,
1.两个部分,一个是String.slice()
slice( ) returns a string containing a slice, or substring, of string. It does not modify string。
slice()返回一个子片段,对原先的string没有影响,还可以用负数当参数。
Example:

[javascript] view plaincopy
 
  1. //from javascript-the definitive Guide 5th Edition  
  2. var s = "abcdefg";  
  3. s.slice(0,4)    // Returns "abcd"  
  4. s.slice(2,4)    // Returns "cd"  
  5. s.slice(4)      // Returns "efg"  
  6. s.slice(3,-1)   // Returns "def"  
  7. s.slice(3,-2)   // Returns "de"  
  8. s.slice(-3,-1)  // Should return "ef"; returns "abcdef" in IE 4  

2.Array.slice(start,end)

slice( ) returns a slice, or subarray, of array. The returned array contains the element specified by start and all subsequent elements up to, but not including, the element specified by end. If end is not specified, the returned array contains all elements from the start to the end of array.
返回从start开始到end的子数组,如果end这个参数没有被设置,则返回从start开始到最后的数组元素。
Example:

[javascript] view plaincopy
 
  1. var a = [1,2,3,4,5];  
  2. a.slice(0,3);    // Returns [1,2,3]  
  3. a.slice(3);      // Returns [4,5]  
  4. a.slice(1,-1);   // Returns [2,3,4]  
  5. a.slice(-3,-2);  // Returns [3]; buggy in IE 4: returns [1,2,3]  

除了正常用法,slice 经常用来将 array-like 对象转换为 true array。在一些框架中会经常有这种用法。

[javascript] view plaincopy
 
  1. Array.prototype.slice.call(arguments,0);//将参数转换成真正的数组  

call的作用是改变this的指向,就相当于arguments调用了,slice这个方法。0就是start=0,end没指定,所以返回整个arguments,这个时候就转换成数组了。
这里有一个问题,

[javascript] view plaincopy
 
  1. arguments.slice(0)//为什么不直接这样呢,非要用call改下this的指向就可以了?见下文的分析  

==================华丽丽地分割线==============
玉伯的分析

http://lifesinger.org/blog/2010/05/array-prototype-slice/

读后感: 能用slice方法的,只要有length属性就行。虽然arguments有length属性,但是没有slice方法,所以呢,Array.prototype.slice()执行的时候,Array.prototype已经被call改成arguments了,因为满足slice执行的条件(有length属性),所以没有报错。感觉有点hack的意思了。

分享到:
评论

相关推荐

    浅谈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对象),用来引用调用该函数时传递的实际参数。

    array.prototype.silce.call 理解分析

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

    javascript Array.prototype.slice的使用示例

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

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

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

    深入探密Javascript数组方法

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

    Array.prototype.slice 使用扩展

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

    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 ...

    hls.min.js

    default:s=Array.prototype.slice.call(arguments,1),r.apply(this,s)}else if(n(r))for(s=Array.prototype.slice.call(arguments,1),u=r.slice(),a=u.length,l=0;l;l++)u[l].apply(this,s);return!0},r.prototype....

    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

Global site tag (gtag.js) - Google Analytics