摘要:好久沒(méi)上,昨天上來(lái)看到一個(gè)問(wèn)題,引起了我的興趣。請(qǐng)看上面的例子可能很多前端童鞋都很知道可以用于將類(lèi)數(shù)組對(duì)象轉(zhuǎn)為數(shù)組,和的用法和作用網(wǎng)上一搜一大堆。在這里主要是為了讓借用構(gòu)造函數(shù)原型上的方法,并且改變方法里的的指向。
好久沒(méi)上SF,昨天上來(lái)看到一個(gè)問(wèn)題,引起了我的興趣。一番探索和研究后,有了此篇文章,也算是對(duì)該問(wèn)題的解答。
let pretendArr = {0:0,1:1,2:2,length:3}; [].slice.call(pretendArr); //[0,1,2]
請(qǐng)看上面的例子
可能很多前端童鞋都很知道 Array.prototype.slice.call 可以用于將類(lèi)數(shù)組對(duì)象轉(zhuǎn)為數(shù)組,call 和 apply 的用法和作用網(wǎng)上一搜一大堆。
在這里主要是為了讓 pretendArr 借用Array構(gòu)造函數(shù)原型上的 slice 方法,并且改變 slice 方法里的 this 的指向。
所以這個(gè)問(wèn)題其實(shí)不在于 call 或者 apply,關(guān)鍵在于 Array.prototype.slice 這個(gè)方法上。
slice這個(gè)方法是js原生方法,自然而然,我會(huì)想到去找找 es 的規(guī)范,看看這個(gè)方法是怎樣定義,以及如何實(shí)現(xiàn)的。
以下是es對(duì)該方法定義的截圖,圖片看不清楚的童鞋可以看看鏈接
嫌英文字母太多的可以直接看以下我寫(xiě)的slice方法的偽代碼:
Array.prototype.slice = (start, end) => { let O = ToObject(this) let A = new Array() let lenVal = O.length let len = ToUnit32(lenVal) let relativeStart = ToInteger(start) let k, final, relativeEnd if (relativeStart < 0) { k = max(len + relativeStart, 0) } else { k = min(relativeStart, len) } if (end === undefined) { relativeEnd = len } else { relativeEnd = ToInteger(end) } if (relativeEnd < 0) { final = max(len + relativeEnd, 0) } else { final = min(relativeEnd, len) } let n = 0 while (k < final) { let Pk = ToString(k) let kPresent = O.hasOwnProperty(Pk) if (kPresent) { let kValue = O[Pk] Object.defineProperty(A, ToString(n), { value: kValue, writable: true, enumerable: true, configurable: true }) } k++ n++ } return A }
ToObject、ToUnit32、ToInteger、ToString
slice 方法不要求 this 必須是數(shù)組,因此類(lèi)數(shù)組對(duì)象也可以調(diào)用該方法,在本例中入?yún)?start 和 end 均為 undefined,實(shí)際上是根據(jù) 類(lèi)數(shù)組對(duì)象 的 length 屬性,從0到length-1去把類(lèi)數(shù)組對(duì)象對(duì)應(yīng)的值取出來(lái),放到前面聲明的數(shù)組 A 里,最終再return A
因此,類(lèi)數(shù)組對(duì)象的 length 屬性很重要,并且該對(duì)象里的數(shù)序也很重要,都會(huì)影響到轉(zhuǎn)換為數(shù)組的結(jié)果。如以下例子:
let pretendArrA = {0:0, 1:1, 2:2, length:2}; [].slice.call(pretendArrA); //[0,1] let pretendArrB = {0:0, 2:2, length:3}; [].slice.call(pretendArrB); //[0, undefined, 2]
第一次寫(xiě)文章,想到哪寫(xiě)到哪,寫(xiě)得有點(diǎn)亂,各位看官勿怪,如果對(duì)你有用,還請(qǐng)點(diǎn)個(gè)贊~
文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請(qǐng)注明本文地址:http://systransis.cn/yun/99805.html
摘要:偽數(shù)組及其轉(zhuǎn)換為真數(shù)組原理什么是偽數(shù)組定義擁有屬性和數(shù)值下標(biāo)屬性。不具有數(shù)組所具有的方法。偽數(shù)組是一個(gè),而真實(shí)的數(shù)組是一個(gè)常見(jiàn)的偽數(shù)組參數(shù)數(shù)組對(duì)象列表比如通過(guò)得到的列表對(duì)象比如舉例通過(guò)得到的對(duì)象列表是一個(gè)偽數(shù)組。 偽數(shù)組及其轉(zhuǎn)換為真數(shù)組原理 什么是偽數(shù)組 定義: 擁有l(wèi)ength屬性和數(shù)值下標(biāo)屬性。 不具有數(shù)組所具有的方法。 偽數(shù)組是一個(gè)Object,而真實(shí)的數(shù)組是一個(gè)Array ...
摘要:深入淺出的理解問(wèn)題的由來(lái)寫(xiě)法一寫(xiě)法二雖然和指向同一個(gè)函數(shù),但是執(zhí)行結(jié)果可能不一樣。該變量由運(yùn)行環(huán)境提供。所以,就出現(xiàn)了,它的設(shè)計(jì)目的就是在函數(shù)體內(nèi)部,指代函數(shù)當(dāng)前的運(yùn)行環(huán)境。 深入淺出this的理解 問(wèn)題的由來(lái) var obj = { foo: function(){} } var foo = obj.foo; // 寫(xiě)法一 obj.foo(); // 寫(xiě)法二 foo...
摘要:第一個(gè)借用數(shù)組的方法請(qǐng)輸入代碼第二個(gè)新增的一個(gè)方法第三個(gè)原型將對(duì)象轉(zhuǎn)換為數(shù)組 第一個(gè)借用數(shù)組的slice方法 var a ={ 0:t, 1:a, 2:r, length:3 } let b=Array.prototype.slice.call(a); console.log(b) 請(qǐng)輸入代碼 第二...
摘要:之前文章詳細(xì)介紹了的使用,不了解的查看進(jìn)階期。不同的引擎有不同的限制,核心限制在,有些引擎會(huì)拋出異常,有些不拋出異常但丟失多余參數(shù)。存儲(chǔ)的對(duì)象能動(dòng)態(tài)增多和減少,并且可以存儲(chǔ)任何值。這邊采用方法來(lái)實(shí)現(xiàn),拼成一個(gè)函數(shù)。 之前文章詳細(xì)介紹了 this 的使用,不了解的查看【進(jìn)階3-1期】。 call() 和 apply() call() 方法調(diào)用一個(gè)函數(shù), 其具有一個(gè)指定的 this 值和分...
摘要:從這段描述可以得到以下對(duì)象小芒和小賢一樣,原來(lái)也是一條可愛(ài)的小狗,可是突然有一天瘋了,一看到人就會(huì)每隔半秒叫一聲地不停叫喚。將一個(gè)函數(shù)的對(duì)象上下文從初始的上下文改變?yōu)橛芍付ǖ男聦?duì)象。 1、JavaScript數(shù)據(jù)類(lèi)型有哪些? 基本數(shù)據(jù)類(lèi)型:Number、String、Boolean、Null、Undefined 引用數(shù)據(jù)類(lèi)型:Object(Array、Date、RegExp、Funct...
閱讀 973·2021-11-24 10:42
閱讀 3522·2021-11-19 11:34
閱讀 2657·2021-09-29 09:35
閱讀 2542·2021-09-09 09:33
閱讀 688·2021-07-26 23:38
閱讀 2531·2019-08-30 10:48
閱讀 1398·2019-08-28 18:07
閱讀 433·2019-08-26 13:44