摘要:首先,有兩個用法,一個是一個是,第一個返回的是字符串,第二個返回的是數(shù)組,這里我們看第個。最后,附個轉(zhuǎn)成數(shù)組的通用函數(shù)據(jù)說這樣比快
Array.prototype.slice.call(arguments)
根據(jù)call的使用方法,我們可以猜測以下可能相等:
[].slice.call(arguments) => arguments.slice()
我?guī)е孟裆倭艘粋€必需參數(shù)的疑問去查資料后得知:
Array.prototype.slice.call(arguments)能將具有length屬性的對象轉(zhuǎn)成數(shù)組,除了IE下的節(jié)點集合(因為ie下的dom對象是以com對象的形式實現(xiàn)的,js對象與com對象不能進行轉(zhuǎn)換)
如:
var a={length:2,0:"first",1:"second"}; Array.prototype.slice.call(a);// ["first", "second"] var a={length:2}; Array.prototype.slice.call(a);// [undefined, undefined]
可能剛開始學(xué)習(xí)js的童鞋并不是很能理解這句為什么能實現(xiàn)這樣的功能。比如我就是一個,所以,來探究一下。
首先,slice有兩個用法,一個是String.slice,一個是Array.slice,第一個返回的是字符串,第二個返回的是數(shù)組,這里我們看第2個。
Array.prototype.slice.call(arguments)能夠?qū)?b>arguments轉(zhuǎn)成數(shù)組,那么就是arguments.toArray().slice();到這里,是不是就可以說Array.prototype.slice.call(arguments)的過程就是先將傳入進來的第一個參數(shù)轉(zhuǎn)為數(shù)組,再調(diào)用slice?
再看call的用法,如下例子
var a = function(){ console.log(this); // "littledu" console.log(typeof this); // Object console.log(this instanceof String); // true } a.call("littledu");
可以看出,call了后,就把當(dāng)前函數(shù)推入所傳參數(shù)的作用域中去了,不知道這樣說對不對,但反正this就指向了所傳進去的對象就肯定的了。
到這里,基本就差不多了,我們可以大膽猜一下slice的內(nèi)部實現(xiàn),如下
1 Array.prototype.slice = function(start,end){ 2 var result = new Array(); 3 start = start || 0; 4 end = end || this.length; //this指向調(diào)用的對象,當(dāng)用了call后,能夠改變this的指向,也就是指向傳進來的對象,這是關(guān)鍵 5 for(var i = start; i < end; i++){ 6 result.push(this[i]); 7 } 8 return result; 9 }
大概就是這樣吧,理解就行,不深究。
最后,附個轉(zhuǎn)成數(shù)組的通用函數(shù)
var toArray = function(s){ 2 try{ 3 return Array.prototype.slice.call(s); 4 } catch(e){ 5 var arr = []; 6 for(var i = 0,len = s.length; i < len; i++){ 7 //arr.push(s[i]); arr[i] = s[i]; //據(jù)說這樣比push快 8 } 9 return arr; 10 } 11 }
文章版權(quán)歸作者所有,未經(jīng)允許請勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請注明本文地址:http://www.ezyhdfw.cn/yun/95959.html
摘要:的區(qū)別接收數(shù)組一連串參數(shù)返回一個函數(shù)的使用場景將類數(shù)組含有屬性的對象轉(zhuǎn)化為數(shù)組類數(shù)組例如通過獲取的元素含有屬性的對象具有屬性,并且可以通過下標來訪問其中的元素,但是沒有中的等方法。 call,apply,bind的區(qū)別 apply接收數(shù)組 func.apply(obj, [arus]) call一連串參數(shù) func.call(obj, param1, param2....) bind...
摘要:此模式調(diào)用函數(shù)的時候,被綁定到全局對象。構(gòu)造器調(diào)用模式如果在一個函數(shù)前面帶上來調(diào)用,那么背地里將會創(chuàng)建一個連接到該函數(shù)的成員的新對象,同時會被綁定到新對象上。 前言 今天閑著無聊隨便逛了逛MDN,忽而看到一個方法Function.prototype.bind(),突然發(fā)現(xiàn)除了使用這個方法之外都沒有仔細琢磨過這個方法。于是乎,找到了kill time的事情-寫博客。 基礎(chǔ)知識簡介 ...
摘要:也就是說,為一些常規(guī)對象增加一些屬性可以使其變成類數(shù)組對象。實際上,類數(shù)組的定義只有一條,具有屬性。在中,所有的數(shù)組方法都是通用的。 什么是類數(shù)組 javascript中一些看起來像卻不是數(shù)組的對象,叫做類數(shù)組。也就是說,為一些常規(guī)對象增加一些屬性可以使其變成類數(shù)組對象。 類數(shù)組的特征: 有索引(數(shù)字)屬性和length屬性的對象 不具有數(shù)組的方法。間接調(diào)用數(shù)組的一些方法,比如pus...
摘要:如重排序方法它的原理是先調(diào)用數(shù)組的方法,之后再進行字符串的比較。長度為的數(shù)組。返回的是被刪除的項,如果沒刪除則返回空數(shù)組,而且之前的數(shù)組也被改變位置方法可以檢測變量,它的兩個參數(shù)是第一個是要查找的值或變量,第二個是從哪開始找。 length屬性方法 數(shù)組的length屬性不單單是只讀的,還可以寫入var color = [‘red’,’blue’,’black’];Color.leng...
摘要:安全防范機制未聲明變量聲明未初始化變量使用來做安全防范機制可以預(yù)防報錯數(shù)組數(shù)組可以容納任何類型的值。因此與進行操作即可截取中的位數(shù)位。 安全防范機制 未聲明變量undeclared、聲明未初始化變量undefined var a b typeof a //undefined typeof b //undefined 使用typeof來做安全防范機制可以預(yù)防報錯 if(typeof...
閱讀 2609·2023-04-25 14:54
閱讀 680·2021-11-24 09:39
閱讀 1884·2021-10-26 09:51
閱讀 4018·2021-08-21 14:10
閱讀 3563·2021-08-19 11:13
閱讀 2755·2019-08-30 14:23
閱讀 1884·2019-08-29 16:28
閱讀 3419·2019-08-23 13:45