摘要:什么是偽數組偽數組是一個含有屬性的對象例如常見的偽數組對象偽數據如何轉成標準數組使用源碼解析行取數據開始值轉結束值直接取的參數有則使用開始值為負數,重新計算值,從尾部往前推算負數的絕對值超過長度,開始值賦值為開始值超過長度開始值賦值為結束值
什么是偽數組
偽數組是一個含有length屬性的json對象
例如:
{ 0: 1, 1: 2, length: 2 }常見的偽數組
arguments、NodeList、HTMLCollection、Jquery對象...
偽數據如何轉成標準數組使用Array.slice
function toArray() { console.log(arguments instanceof Array) // false arguments = Array.prototype.slice.call(arguments) console.log(arguments instanceof Array) // true return arguments } toArray(1,2,3) // [1, 2, 3]Array.slice源碼解析(587行)
function ArraySlice(start, end) { CHECK_OBJECT_COERCIBLE(this, "Array.prototype.slice"); var array = TO_OBJECT(this); var len = TO_LENGTH(array.length); // 取數據length var start_i = TO_INTEGER(start); // 開始值轉Number var end_i = len; // 結束值直接取array的length if (!IS_UNDEFINED(end)) end_i = TO_INTEGER(end); // 參數有end則使用end if (start_i < 0) { // 開始值為負數,重新計算值,從尾部往前推算 start_i += len; if (start_i < 0) start_i = 0; // 負數的絕對值超過長度,開始值賦值為0 } else { if (start_i > len) start_i = len; // 開始值超過長度, 開始值賦值為len } if (end_i < 0) { // 結束值為負數,重新計算值,從尾部往前推算 end_i += len; if (end_i < 0) end_i = 0; // 負數的絕對值超過長度,結束值賦值為0 } else { if (end_i > len) end_i = len; // 開始值超過長度, 結束值賦值為len } var result = ArraySpeciesCreate(array, MaxSimple(end_i - start_i, 0)); // 創建一個數組 if (end_i < start_i) return result; // 結束值小于開始值,那么直接返回空數組 if (UseSparseVariant(array, len, IS_ARRAY(array), end_i - start_i)) { // array是數組 %NormalizeElements(array); if (IS_ARRAY(result)) %NormalizeElements(result); SparseSlice(array, start_i, end_i - start_i, len, result); } else { // array不是數組 SimpleSlice(array, start_i, end_i - start_i, len, result); } result.length = end_i - start_i; // 數組長度賦值 return result; } /* * array 具體操作的數組 * start_i 開始位置 * del_count 需要處理的長度 * len 數組長度 * deleted_elements 利用淺拷貝,返回結果,對于slice來說,是選擇的那部分數組,對于splice來說,是刪除的那些數組 */ function SparseSlice(array, start_i, del_count, len, deleted_elements) { // Move deleted elements to a new array (the return value from splice). var indices = %GetArrayKeys(array, start_i + del_count); if (IS_NUMBER(indices)) { var limit = indices; for (var i = start_i; i < limit; ++i) { var current = array[i]; if (!IS_UNDEFINED(current) || i in array) { %CreateDataProperty(deleted_elements, i - start_i, current); } } } else { var length = indices.length; for (var k = 0; k < length; ++k) { var key = indices[k]; if (key >= start_i) { var current = array[key]; if (!IS_UNDEFINED(current) || key in array) { %CreateDataProperty(deleted_elements, key - start_i, current); } } } } } /* * array 具體操作的數組 * start_i 開始位置 * del_count 需要處理的長度 * len 數組長度 * deleted_elements 利用淺拷貝,返回結果,對于slice來說,是選擇的那部分數組,對于splice來說,是刪除的那些數組 */ function SimpleSlice(array, start_i, del_count, len, deleted_elements) { for (var i = 0; i < del_count; i++) { var index = start_i + i; if (index in array) { var current = array[index]; %CreateDataProperty(deleted_elements, i, current); } } }
文章版權歸作者所有,未經允許請勿轉載,若此文章存在違規行為,您可以聯系管理員刪除。
轉載請注明本文地址:http://specialneedsforspecialkids.com/yun/98018.html
摘要:數組是數據的有序列表,與其他語言不同的是,數組的每一項可以保存任何類型的數據。如下的代碼創建的就是一個密集數組稀疏數組與密集數組相反,并不強制要求數組元素是緊密相連的,即允許間隙的存在。 數組是數據的有序列表,與其他語言不同的是,ECMAScript 數組的每一項可以保存任何類型的數據。也就是說,可以用數組的第一個位置來保存字符串,用第二位置來保存數值,用第三個位置來保存對象, 以此類...
摘要:偽數組的偽數組理解什么是偽數組定義但是有屬性以下是常見偽數組對象偽數組轉為真數組自定義偽數組類數組從對象構建偽數組的兩個條件具有具有中任意一個并調用最終結果就是生成這個屬性具有名為的方法類數組當作數組使用的原理相當于的鍵名上述也可以用來寫特 偽數組 javascript的偽數組理解 什么是偽數組? 定義:obj instanceof Array === false 但是有length...
摘要:什么是數組數組是值的有序集合。這個位置用數字表示叫索引數組用字符串表示叫關聯數組。 什么是數組 數組是值的有序集合。數組中的每個值叫一個元素,每個元素在數組中都有一個唯一的位置。這個位置用數字表示叫索引數組;用字符串表示叫關聯數組。數組的元素可以是不同的類型可以動態的向數組差人新元素,或者刪除指定元素 一維數組 定義數組 定義數組的方式有三種 /*數組字面量方式定義數組*/ var a...
摘要:引用自可迭代對象和迭代器不以規矩,不成方圓為了使某個對象成為可迭代對象象,它必須實現方法,也就是說,它得有一個是的屬性。的遍歷,絕對應該用。 pseudo 英 [sju:d??] 美 [su:do?]adj.假的,虛偽的n.[口]假冒的人,偽君子 pseudo-array 英 [sju:d???re?] 美 [sju:d???re?][計] 偽數組 jQuery 對象是偽數組 兩個...
摘要:偽數組偽數組的定義和特性偽數組,又稱類數組。利用數組的方法推薦或者使用返回一個新的數組用或把他的作用環境指向偽數組。注意這個返回的數組中,不會保留索引值以外的其他額外屬性。 偽數組(ArrayLike) 偽數組的定義和特性 偽數組 (ArrayLike) ,又稱類數組。是一個類似數組的對象,但是有如下幾個特征。 按索引方式儲存數據 0: xxx, 1: xxx, 2: xxx......
閱讀 1849·2021-09-29 09:35
閱讀 2711·2021-09-22 15:25
閱讀 1972·2021-08-23 09:43
閱讀 2049·2019-08-30 15:54
閱讀 3349·2019-08-30 15:53
閱讀 2387·2019-08-30 13:50
閱讀 2399·2019-08-30 11:24
閱讀 2269·2019-08-29 15:37