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