最全 JavaScript Array 方法 詳解

大家好,我是若川。最近組織了源碼共讀活動,感興趣的可以點此加我微信 ruochuan12?參與,每周大家一起學習200行左右的源碼,共同進步。同時極力推薦訂閱我寫的《學習源碼整體架構系列》?包含20余篇源碼文章。

? ? 我們在日常開發中,與接口打交道最多了,前端通過訪問后端接口,然后將接口數據二次處理渲染到頁面當中。
? ? 二次處理的過程是 考驗 ?CoderArray 是否熟練 以及 在 何種 場景下使用哪種方法處理最優 。
? ? 小編,在最近開發中就遇到了 Array 問題, 在處理復雜的業務需求時,沒想到Array 有類似的方法,然后將方法 組合起來解決當下問題。

文章用下班時間肝了一周才寫完。

a8026ae3609b1ed6c8c874dff36ccf7f.png


數組使用指南

遍歷數組方法

不會改變原數組的遍歷方法

forEach()

forEach() 方法按照升序為數組中每一項執行一次給定的函數。

「語法」

arr.forEach(callback(currentValue?,?index?,?array)?,thisArg)
  • currentValue : ?數組當前項值

  • index : ?數組當前項索引

  • arr : 數組對象本身

  • thisArg : 可選參數。當執行回調函數 callback 時,用作 this 的值。

「注意」

  • 如果使用 「箭頭函數表達式」來傳入函數參數, thisArg 參數會被忽略,因為箭頭函數在詞法上綁定了 this 值。

  • forEach 不會直接改變調用它的對象,但是那個對象可能會被 callback 函數改變。

  • every 不會改變原數組。

//防盜貼:微信公眾號:?前端自學社區const?arr?=?[2,3,4,1,44]arr.forEach(val?=>{console.log(`值為${val*2}`)})
console.log(`原數組為${arr}`);
//?值為4
//?值為6
//?值為8
//?值為2
//?值為88
//?原數組為2,3,4,1,44

reduce()

reduce()數組元素累計器,返回一個合并的結果值。

「語法」

arr.reduce(callback(accumulator,?currentValue,?index,?array),?initialValue)
  • accumulator : ?累計器,默認為數組元素第一個值

  • currentValue : ?當前值

  • index : 當前元素索引 可選

  • array : 數組 可選

  • initialValue : 初始值 ?可選

reduce 有兩個參數,一個是回調函數,一個是初始值。

它有兩種取值情況:

  1. 當提供了 initialValue 初始值時, 那么accumulator 的值為 initialValue , currentValue 的值為 數組第一個值

  1. 當沒有提供 initialValue 初始值時, 那么 accumulator 的值 為 數組第一個值, currentValue 為第二個值。

「注意」

  • 如果數組為空,且沒有提供initialValue 初始值時,會拋出 TypeError .

  • 如果數組有一個元素,且沒有提供initialValue 或者 ?提供了initialValue ,數組為空,那么唯一值被返回不會執行 callback 回調函數。

「求和」

//防盜貼:微信公眾號:?前端自學社區/
const?arr?=?[1,?2,?3,?4]const?sum?=?arr.reduce((accumulator,?currentValue)?=>?accumulator?+?currentValue,?10)console.log(sum)?//20?
//?accumulator??累計器
//?currentValue??當前值
//?initialValue??累計?初始值?為10?//10?+?1?+?2?+?3?+?4##?注意
//?回調函數第一次執行時,accumulator 和currentValue的取值有兩種情況:
//?如果調用reduce()時提供了initialValue,accumulator取值為initialValue,currentValue取數組中的第一個值;
//?如果沒有提供 initialValue,那么accumulator取數組中的第一個值,currentValue取數組中的第二個值。

「計算對象中的值」

要累加對象數組中包含的值,必須提供初始值,以便各個item正確通過你的函數。

/**?@Description:?*?@Author:?微信公眾號:?前端自學社區*?@Date:?2021-08-07?00:53:51*?@LastEditTime:?2021-08-07?00:53:51*?@LastEditors:?Do?not?edit*/
const?data?=?[{date:?'2021-8-1',income:?200},{date:?'2021-8-2',income:?400},{date:?'2021-8-3',income:?300},
]console.log(`總收入:?${data.reduce(?(pre,currentValue)?=>?pre?+?currentValue.income,0)}`);
//總收入:900

「二維數組轉一位數組」

const?array?=?[[1,2],[3,4]]console.log(array.reduce((a,b)?=>?a.concat(b)));
//[?1,?2,?3,?4?]

find()

find() 返回滿足特定條件的元素對象或者元素值, 不滿足返回 undefined

「語法」

arr.find((element,index,array),?thisArg)
  • element :當前元素

  • index : ? 當前元素索引 可選

  • array : ?數組本身 可選

  • thisArg : 執行回調時用作this 的對象。可選

//?從數據中找出第一個滿足特定條件的對象const?data?=?[{name:'張三',article:?3},{name:'老王',article:?9},{name:'老李',article:?10}
]console.log(data.find(item?=>?item.article?>?9?));//?{?name:?'老李',?article:?10?}

findIndex()

findIndex() 返回數組中符合條件的第一個元素的索引,沒有,則返回 ?-1

「語法」

arr.findIndex((element,index,array),?thisArg)
  • element :當前元素

  • index : ? 當前元素索引 可選

  • array : ?數組本身 可選

  • thisArg : 執行回調時用作this 的對象。可選

const?arr?=?[22,33,44,55]
console.log(arr.findIndex(val?=>?val?>?33));????//2
console.log(arr.findIndex(val?=>?val?>?99));????//-1

key()

key() 返回一個新的「Array Iterator」對象,該對象包含數組中每個索引的鍵。

「語法」

keys()

「注意」

  • 如果數組中有空原元素,在獲取key 時, 也會加入遍歷的隊列中。

const?inputModal?=?[{name:''},{age:''},{hobby:''}
]
for(const?key?of?inputModal.keys()){console.log(key)
}
//?0
//?1
//?2const?arr?=?[1,2,,3]
for(const?key?of?arr.keys()){console.log(key);
}
//?0
//?1
//?2
//?3//Object.keys()?方法會返回一個由一個給定對象的自身可枚舉屬性組成的數組
//?所以?Object.keys(arr)?=?[?'0',?'1',?'3'?]
for(const?key?of?Object.keys(arr)){console.log(key);
}
//?0
//?1
//?3

values()

values()方法返回一個新的 「Array Iterator」 對象,該對象包含數組每個索引的值。

「語法」

arr.values()
const?Color?=?['red','yelloe','orange']for(val?of?Color.values()){console.log(val);
}
//?red
//?yelloe
//?orange

返回 布爾值

every()

every 用來判斷數組內所有元素是否符合某個條件,返回 「布爾值」

「語法」

arr.every(callback(currentValue?,?index?,?array)?,thisArg)
  • currentValue : ?數組當前項值 ? 必須

  • index : ?數組當前項索引 ? 可選

  • arr : 數組對象本身可選

  • thisArg : 可選參數。當執行回調函數 callback 時,用作 this 的值。可選

「注意」

  • 當所有的元素都符合條件才會返回true

  • every 不會改變原數組。

  • 若傳入一個空數組,無論如何都會返回 true

//防盜貼:微信公眾號:?前端自學社區const?arr?=?[2,3,4,1,44]console.log(arr.every(val?=>??val?>?0?));???//trueconsole.log(arr.every(val?=>?{?val?>?2?}))?//false

some()

some() 用來判斷數組元素是否符合某個條件,只要有一個元素符合,那么返回 true.

「語法」

arr.some(callback(currentValue?,?index?,?array)?,thisArg)
  • currentValue : ?數組當前項值 ? 必須

  • index : ?數組當前項索引 ? 可選

  • arr : 數組對象本身可選

  • thisArg : 可選參數。當執行回調函數 callback 時,用作 this 的值。可選

「注意」

  • some() 被調用時不會改變數組。

  • 如果用一個空數組進行測試,在任何情況下它返回的都是false

  • some() 在遍歷時,元素范圍已經確定,在遍歷過程中添加的元素,不會加入到遍歷的序列中。

const?arr?=?[2,3,4,1,44]console.log(arr.some(val?=>?val?>?2))??//true
console.log([].some(val?=>?val?>?2?));?//falseconst?newList?=?[11,22,33,44]
console.log(newList.some(val?=>?{newList.push(55)newList.push(66)val?>?55
}));???//false

不改變原有數組,形成新的數組

filter()

filter() 用來遍歷原數組,過濾拿到符合條件的數組元素,形成新的數組元素。

「語法」

arr.some(callback(currentValue?,?index?,?array)?,thisArg)
  • currentValue : ?數組當前項值 ? 必須

  • index : ?數組當前項索引 ? 可選

  • arr : 數組對象本身可選

  • thisArg : 可選參數。當執行回調函數 callback 時,用作 this 的值。可選

「注意」

  • filter 不會改變原數組,它返回過濾后的新數組。

  • filter() 在遍歷時,元素范圍已經確定,在遍歷過程中添加的元素,不會加入到遍歷的序列中。

const?arr?=?[11,22,33,44,55,66]console.log(arr.filter(val?=>?val?>?44?))
console.log(`原數組為${arr}`);//?[?55,?66?]
//?原數組為11,22,33,44,55,66

map()

map() 創建一個新的數組,其結果是該數組中的每個元素都調用一個提供的函數后返回的結果。

「語法」

arr.map(callback(currentValue?,?index?,?array)?,thisArg)
  • currentValue : ?數組當前項值 ? 必須

  • index : ?數組當前項索引 ? 可選

  • arr : 數組對象本身可選

  • thisArg : 可選參數。當執行回調函數 callback 時,用作 this 的值。可選

「注意」

  • map不修改調用它的原數組本身

  • map() 在遍歷時,元素范圍已經確定,在遍歷過程中添加的元素,不會加入到遍歷的序列中。

const?arr?=?[1,2,3,4]console.log(arr.map(val?=>?val*3?))??//?[?3,?6,?9,?12?]
console.log(arr)??//?[?1,?2,?3,?4?]

數組 CRUD

改變原數組方法

reverse()

reverse() 方法將數組中元素的位置顛倒,并返回該數組。數組的第一個元素會變成最后一個,數組的最后一個元素變成第一個。該方法會改變原數組。

const?arr?=?[1,2,3]console.log(arr.reverse(11,22,33))??//[?3,?2,?1?]

sort()

sort() 方法采用 「原地算法」進行排序并返回數組。默認排序順序是在「將元素轉換為字符串」,然后「比較它們的UTF-16代碼單元值序列」

「原地算法」是一個使用輔助的數據結構對輸入進行轉換的算法。但是,它允許有少量額外的存儲空間來儲存輔助變量。當算法運行時,輸入通常會被輸出覆蓋。原地算法僅通過替換或交換元素來更新輸入序列。

const?arr?=?[23,11,33,44,1]console.log(arr.sort())??//[?1,?11,?23,?33,?44?]const?arr?=?[23,11,33,44,1000000000]console.log(arr.sort())??
//?[?1000000000,?11,?23,?33,?44?]

刪除元素

shift()

shift() 方法從數組中刪除「第一個」元素,并返回該元素的值。此方法更改數組的長度。

「語法」

arr.shift()

「注意」

  • 從數組中刪除的元素; 如果數組為空則返回undefined

const?data?=?[{id:1,name:'前端'},{id:2,name:'后端'},{id:3,name:'移動端'},{id:4,name:'嵌入式開發'},
]const?deleObj?=?data.shift()console.log('==============刪除后的元素======================');
console.log(data);
console.log('=================刪除后的元素===================');console.log('===============被刪除的元素=====================');
console.log(deleObj);
console.log('================被刪除的元素====================');//??==============刪除后的元素======================
//?[
//?????{?id:?2,?name:?'后端'?},
//?????{?id:?3,?name:?'移動端'?},
//?????{?id:?4,?name:?'嵌入式開發'?}
//???]
//???=================刪除后的元素===================//???===============被刪除的元素=====================
//???{?id:?1,?name:?'前端'?}
//???================被刪除的元素====================

pop()

pop()方法從數組中刪除最后一個元素,并返回該元素的值。此方法更改數組的長度。

用法和 shift 類似。

「語法」

arr.pop()

「注意」

  • 從數組中刪除的元素; 如果數組為空則返回undefined

const?data?=?[{id:1,name:'前端'},{id:2,name:'后端'},{id:3,name:'移動端'},{id:4,name:'嵌入式開發'},
]const?deleObj?=?data.pop()console.log(data);
//?[
//?????{?id:?1,?name:?'前端'?},
//?????{?id:?2,?name:?'后端'?},
//?????{?id:?3,?name:?'移動端'?}
//?]
console.log(deleObj);
//?{?id:?4,?name:?'嵌入式開發'?}

splice()

splice() 方法通過「刪除」「替換」現有元素或者原地添加新的元素來修改數組,并以數組形式返回被修改的內容。此方法會改變原數組。

「語法」

array.splice(start,deleteCount,?[item1,item2....])
  • start : 開始的索引

  • deleteCount : 刪除的個數 ?可選

  • [item1,item2 .....] ;從開始的索引進行 添加的增加和替換的元素, 可選

「注意」

  • 由被刪除的元素組成的一個數組。如果只刪除了一個元素,則返回只包含一個元素的數組。如果沒有刪除元素,則返回空數組。

  • 如果只傳遞了開始的索引位置,則會刪除索引后的所有元素對象

    const?data?=?[{id:1,name:'前端'},{id:2,name:'后端'},{id:3,name:'移動端'},{id:4,name:'嵌入式開發'},
    ]
    data.splice(1)
    console.log(data)
    //?[?{?id:?1,?name:?'前端'?}?]

「從索引為 2 開始, 刪除 1 個數組元素對象,添加兩個數組元素對象」

const?data?=?[{id:1,name:'前端'},{id:2,name:'后端'},{id:3,name:'移動端'},{id:4,name:'嵌入式開發'},
]data.splice(2,1,...[{id:5,name:'人工智能'},{id:6,name:'大數據開發'}])console.log(data);
//?[
//?????{?id:?1,?name:?'前端'?},
//?????{?id:?2,?name:?'后端'?},
//?????{?id:?5,?name:?'人工智能'?},
//?????{?id:?6,?name:?'大數據開發'?},
//?????{?id:?4,?name:?'嵌入式開發'?}
//?]

增加元素

splice()

上面已經有介紹

push()

push() 方法將一個或多個元素添加到數組的「末尾」,并返回該數組的新長度。

「語法」

arr.push(element1,?...,?elementN)
const?data?=?[{id:1,name:'前端'},{id:2,name:'后端'},
]console.log(data.push({id:3,name:'移動端'}))??//3

「合并數組」

const?data?=?[{id:1,name:'前端'},{id:2,name:'后端'},
]var?obj?=?[{id:4,name:'嵌入式開發'},
]//?相當于?data.push({id:4,name:'嵌入式開發'});
Array.prototype.push.apply(data,?obj);console.log(data);[{?id:?1,?name:?'前端'?},{?id:?2,?name:?'后端'?},{?id:?4,?name:?'嵌入式開發'?}
]

unshift()

unshift() 方法將一個或多個元素添加到數組的「開頭」,并返回該數組的「新長度」

const?arr?=?[1,2,3]console.log(arr.unshift(11,22,33))??//6?
console.log(arr)??//[?11,?22,?33,?1,?2,?3?]

不改變原數組元素方法

indexOf()

indexOf()方法返回可以在數組中找到給定元素的第一個索引,如果不存在,則返回 -1。

「語法」

indexOf(searchElement)
indexOf(searchElement,?fromIndex)
  • searchElement : ? 要查找的元素

  • fromIndex :?按指定的索引進行查找出現的指定元素的第一個索引。?可選

    ??
    • 如果索引大于或等于數組的長度,則返回-1

    • 如果提供的索引值為負數,則將其視為距數組末尾的偏移量

    • 如果提供的索引為負數,仍然從前到后搜索數組

    • 如果提供的索引為 0,則將搜索整個數組。

    • 默認值:0(搜索整個數組)。

const?arr?=?[1,1,2,3,4,5,4,4,6]console.log(arr.indexOf(3));??//3
console.log(arr.indexOf(9));??//-1console.log(arr.indexOf(3,4));?//-1
//從索引為?4?的元素進行查找?3,?顯然后面沒有3?,?返回?-1

「數組去重」

創建一個新的空數組,通過indexOf 來判斷空數組是否第一次存在某個元素,

  • 不存在則返回 [ ?< 0 ? ] ,push 到空數組中.

const?newArr?=?[]
arr.forEach(val?=>?{if(newArr.indexOf(val)?<?0){newArr.push(val)}
})
console.log(newArr);
//?[?1,?2,?3,?4,?5,?6?]

lastIndexOf()

lastIndexOf() 查找數組中元素最后一次出現的索引,如未找到返回-1。

如果不存在則返回 -1。從數組的后面向前查找,從 fromIndex 處開始。

「語法」

arr.lastIndexOf(searchElement,?fromIndex)
  • searchElement : ? 要查找的元素

  • fromIndex :?按指定的索引進行查找出現的指定元素的第一個索引。?可選

    ??
    • 從指定的索引位置 「逆向」 查找

    • 默認為數組的長度減 1(arr.length - 1),即整個數組都被查找。

    • 如果該值大于或等于數組的長度,則整個數組會被查找。

    • 如果為負值,數組仍然會被從后向前查找。

    • 如果該值為負時,其絕對值大于數組長度,則方法返回 -1,即數組不會被查找。

「注意」

  • lastIndexOf 使用的是 「嚴格相等」 ? === ?比較 ?searchElement 和數組中的元素。

const?arr?=?[1,1,2,3,4,5,4,4,6]console.log(arr.lastIndexOf(4));?//7console.log(arr.lastIndexOf(4,11));??
//7????指定的查找的索引?大于?數組的長度,?會進行整個數組查找console.log(arr.lastIndexOf(4,-33));
//?-1???指定的索引為負數,且絕對值大于數組長度,?則返回?-1console.log(arr.lastIndexOf(4,-5));
//4????指定的索引為負數,且絕對值小于數組長度,?則會?從向前進行查找

inCludes()

includes() 方法用來判斷一個數組是否包含一個指定的值,根據情況,如果包含則返回 true,否則返回false。

「語法」

arr.includes(searchElement,?fromIndex)
  • searchElement : ? 要查找的元素

    ?

    查找時,區分大小寫

    ?
  • fromIndex :?按指定的索引進行查找出現的指定元素的第一個索引。?可選

    ??
    • 從指定的索引進行查找

    • 如果為負值,則按升序從 array.length + fromIndex 的索引開始搜

    • 如果 fromIndex 大于等于數組的長度,則會返回 false,且該數組不會被搜索。

    • 默認為0

const?arr?=?[1,1,2,3,4,5,4,4,6]console.log(arr.includes(4));?//trueconsole.log(arr.includes(4,66));?//falseconsole.log(arr.includes(1,-1));?//false

concat()

concat() 方法用于合并兩個或多個數組。

「語法」

var?new_array?=?old_array.concat([arr1][arr2])

「注意」

  • concat方法不會改變this或任何作為參數提供的數組,而是返回一個「淺拷貝」,它包含與原始數組相結合的相同元素的副本

    ??
    • 對象引用(而不是實際對象):concat將對象引用復制到新數組中。原始數組和新數組都引用相同的對象。也就是說,如果引用的對象被修改,則更改對于新數組和原始數組都是可見的。這包括也是數組的數組參數的元素。

    • 數據類型如字符串,數字和布爾(不是StringNumberBoolean) 對象):concat將字符串和數字的值復制到新數組中。

let?arr1?=?[1,2,3]
let?arr2?=?[4,5,6]
let?arr3?=?[[1,2],[3,4]]
console.log(arr1.concat(arr2));
//[?1,?2,?3,?4,?5,?6?]//?嵌套合并
console.log(arr1.concat(arr2).concat(arr3));
//?[?1,?2,?3,?4,?5,?6,?[?1,?2?],?[?3,?4?]?]let?obj1?=?[{a:1},{b:2}]
let?obj2?=?[{c:3},{d:4}]
let?obj3?=?obj1.concat(obj2)??
console.log(obj3);?
//[?{?a:?1?},?{?b:?2?},?{?c:?3?},?{?d:?4?}?]obj1[0].a?=?4??//改變obj[0]對象值,會直接影響合并后的數組,因為是淺拷貝
console.log(obj3);?
//[?{?a:?4?},?{?b:?2?},?{?c:?3?},?{?d:?4?}?]

toString()

toString() 返回一個字符串,表示指定的數組及其元素。

「當一個數組被作為文本值或者進行字符串連接操作時,將會自動調用其 toString 方法。」

對于數組對象,toString 方法連接數組并返回一個字符串,其中包含用逗號分隔的每個數組元素。

「語法」

arr.toString()
const?arr?=?[1,2,3]console.log(arr.toString());??//1,2,3

join()

join()方法通過連接數組元素用逗號或指定的分隔符字符串分隔,返回一個字符串。

如果數組只有一項,則將在不使用分隔符的情況下返回該項。

「語法」

join()
join(separator)
  • separator : ?指定的分割的 字符 ?可選

const?arr?=?['2021','08','08']console.log(arr.join());?????//2021,08,08
console.log(arr.join('-'));??//2021-08-08
console.log(arr.join('/'));??//2021/08/08

slice()

slice() 方法返回一個新的數組對象,這一對象是一個由 beginend 決定的原數組的「淺拷貝」(包括 begin,不包括end)。原始數組不會被改變。

「語法」

arr.slice(begin,?end)
  • begin : 指定截取的「開始」索引 ?可選

    ??
    • 默認從0 開始

    • 如果begin 為負數,則以數組末尾開始 的 絕對值開始截取 ?slice(-2) ?末尾第2個元素

    • 如果 begin 超出原數組的索引范圍,則會返回空數組。

  • end : 指定截取的「結束」索引 ? ?可選

    ??
    • 如果 end 被省略,則 slice 會一直提取到原數組末尾。

    • 如果 end 大于數組的長度,slice 也會一直提取到原數組末尾。

    • 如果 end 為負數, 則它表示在原數組中的倒數第幾個元素結束抽取。

const?arr?=?[11,22,33,44,55,66,77,88]console.log(arr.slice(1,4));
//?應該返回?索引?1?-?3?的數組元素
//?[?22,?33,?44?]console.log(arr.slice(-4,2))??//[]console.log(arr.slice(-4));???//[?55,?66,?77,?88?]console.log(arr.slice(0,-1));
//?[
//?????11,?22,?33,?44,
//?????55,?66,?77
//???]

參考文獻

Array - JavaScript | MDN


e1569c9fc6766cf3cf25ff34e288d5a9.gif

·················?若川簡介?·················

你好,我是若川,畢業于江西高校。現在是一名前端開發“工程師”。寫有《學習源碼整體架構系列》20余篇,在知乎、掘金收獲超百萬閱讀。
從2014年起,每年都會寫一篇年度總結,已經寫了7篇,點擊查看年度總結。
同時,最近組織了源碼共讀活動,幫助3000+前端人學會看源碼。公眾號愿景:幫助5年內前端人走向前列。

eb124faff9268add65751797dcd69286.png

識別方二維碼加我微信、拉你進源碼共讀

今日話題

略。分享、收藏、點贊、在看我的文章就是對我最大的支持~

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/275074.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/275074.shtml
英文地址,請注明出處:http://en.pswp.cn/news/275074.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

[譯] React Hooks: 沒有魔法,只是數組

[譯] React Hooks: 沒有魔法&#xff0c;只是數組 原文鏈接&#xff1a; medium.com/ryardley/r… 我是 React 新特性 Hooks 的粉絲。但是&#xff0c;在你使用 React Hooks的過程中&#xff0c;有一些看上去 很奇怪的限制 。在本文里&#xff0c;對于那些還在為了理解這些限制…

管理溝通中移情的應用_移情在設計中的重要性

管理溝通中移情的應用One of the most important aspects of any great design is the empathetic understanding of and connection to the user. If a design is ‘selfish’, as in when a product designed with the designer in mind and not the user, it will ultimatel…

網易前端進階特訓營,邀你免費入營!一舉解決面試晉升難題!

網易等大廠的前端崗位一直緊缺&#xff0c;特別是資深級。最近一位小哥面進網易&#xff0c;定級P4&#xff08;資深&#xff09;&#xff0c;總包60W&#xff0c;給大家帶來真實面經要點分享。網易的要求有&#xff1a;1.對性能優化有較好理解&#xff0c;熟悉常用調試工具2.熟…

Feign的構建過程及自定義擴展功能

spring-cloud-openfeign-core-2.1.1.RELEASE.jar 中 HystrixFeign 的詳細構建過程&#xff1a; EnableFeignClients -> FeignClientsRegistrar 掃描 Feign注解的類 -> FeignClientFactoryBean通過Targeter生產FeignClient -> Targeter通過Feign.Builder構建Feign ->…

angelica類似_親愛的當歸(Angelica)是第一個讓我哭泣的VR體驗

angelica類似It was a night just like any other night. I finished work for the day and closed my laptop. I had dinner and after an hour, I put on my Oculus Quest headset in order to begin my VR workout.就像其他任何夜晚一樣&#xff0c; 這 是一個夜晚。 我完成…

面試官:請手寫一個帶取消功能的延遲函數,axios 取消功能的原理是什么

大家好&#xff0c;我是若川。最近組織了源碼共讀活動&#xff0c;感興趣的可以點此加我微信 ruochuan12 參與&#xff0c;每周大家一起學習200行左右的源碼&#xff0c;共同進步。同時極力推薦訂閱我寫的《學習源碼整體架構系列》 包含20余篇源碼文章。本文倉庫 https://githu…

關于base64編碼的原理及實現

我們的圖片大部分都是可以轉換成base64編碼的data&#xff1a;image。 這個在將canvas保存為img的時候尤其有用。雖然除ie外&#xff0c;大部分現代瀏覽器都已經支持原生的基于base64的encode和decode&#xff0c;例如btoa和atob。&#xff08;將canvas畫布保存成img并強制改變…

Django web開發系列(五)模板

一 前言在上一節了解到視圖函數處理后&#xff0c;會將結果渲染到創建的html頁面&#xff0c;但html如何接收并顯示視圖函數返回的動態數據呢&#xff1f;最常用的做法就是使用模板(Template)&#xff0c;本節將簡單介紹一下模板的作用和用法。 可以這樣簡單的理解模板的概念&a…

facebook 面試_如何為您的Facebook產品設計面試做準備

facebook 面試重點 (Top highlight)Last month, I joined Facebook to work on Instagram DMs and as a way to pay it forward, I 上個月&#xff0c;我加入了Facebook&#xff0c;從事Instagram DM的工作&#xff0c;作為一種支付方式&#xff0c;我 offered to help anyone…

8年了,開始寫點東西了

大家好&#xff0c;我是若川。最近組織了源碼共讀活動&#xff0c;感興趣的可以點此加我微信 ruochuan12 參與&#xff0c;每周大家一起學習200行左右的源碼&#xff0c;共同進步。同時極力推薦訂閱我寫的《學習源碼整體架構系列》 包含20余篇源碼文章。今天分享一位大佬的文章…

荒徑 弗羅斯特_弗羅斯特龐克,顛覆性城市建設者

荒徑 弗羅斯特Most gamers are familiar with Will Wright’s famous SimCity series. It created the city building genre and there have been many attempts over the years to ape it. But few developers have been bold enough to completely deconstruct the formula; …

2012年1月份第2周51Aspx源碼發布詳情

WP7手指畫圖應用源碼 2012-01-14 [VS2010] 游戲介紹&#xff1a;Windows Phone 7手指畫圖應用 – FingerPaint&#xff0c;您通過此游戲可以隨心畫一些感興趣的東西&#xff0c;陶冶情操。操作簡單&#xff0c;頁面簡潔。適合新手學習參考。 WP7 Car Bloke(交通工具開銷記錄)源…

Gitee 如何自動部署博客 Pages?推薦用這個GitHub Actions!

大家好&#xff0c;我是若川。最近組織了源碼共讀活動&#xff0c;感興趣的可以點此加我微信 ruochuan12 參與&#xff0c;每周大家一起學習200行左右的源碼&#xff0c;共同進步。同時極力推薦訂閱我寫的《學習源碼整體架構系列》 包含20余篇源碼文章。前段時間我把自己的博客…

Java io流學習總結(三)

轉載于&#xff1a;https://www.cnblogs.com/ll409546297/p/7197911.html java.io幾種讀寫文件的方式 一、Java把這些不同來源和目標的數據都統一抽象為數據流。 Java語言的輸入輸出功能是十分強大而靈活的。 在Java類庫中&#xff0c;IO部分的內容是很龐大的&#xff0c;因為它…

現在流行的畫原型圖工具_原型資源圖:8種流行原型工具的綜合指南

現在流行的畫原型圖工具Although tools are not the most important things to learn as a UX designer, inevitably you need to use it in order to achieve your more important goals, to solve user’s problems. This article covers today’s 8 popular UX prototyping …

持續5個月,200+筆記,3千多人參與,邀請你來學源碼~

注意&#xff1a;本文點擊文末閱讀原文可查看文中所有鏈接。我正在參加掘金年度人氣作者投票活動&#xff0c;大家有空可以加微信群幫忙投票&#xff0c;感謝大家&#xff01;想起今天還沒發文&#xff0c;就開放下微信群二維碼&#xff0c;大家掃碼進群讀源碼和幫忙投票吧。群…

自己動手開發調試器 01

背景: 在做XXX編譯器檢證時經常需要區分是代碼端錯誤&#xff0c;還是編譯器端錯誤&#xff0c;因此對代碼進行調試是必不可少的。但是狗日的甲方并沒有提供對應的調試器XXXDB&#xff0c;而用GDB調試XXX生成的可執行程序很不穩定&#xff0c;經常出現異常&#xff0c;干脆…

02如何抓住重點,系統高效地學習數據結構與算法?

以下內容總結自極客時間王爭大佬的《數據結構與算法之美》課程&#xff0c;本文章僅供個人學習總結。 什么是數據結構?什么是算法? 從廣義上講&#xff0c;數據結構就是指一組數據的存儲結構。算法就是操作數據的一組方法。 類比圖書館的書籍&#xff0c;我們如果想找一本書可…

第2年,倒數第3天,1.5萬票,感動!

1源碼共讀大家好&#xff0c;我是若川。眾所周知。從8月份開始&#xff0c;我組織了源碼共讀活動&#xff0c;至今已經有5個月了&#xff0c;每周一期&#xff0c;進行到了第18期。每周堅持寫源碼解讀文章&#xff0c;每天堅持答疑解惑&#xff0c;幫助了很多人學會看源碼&…

啟發式搜索給神經網絡_神經科學如何支持UX啟發式

啟發式搜索給神經網絡重點 (Top highlight)Interaction and UX designers have long known and used heuristics to guide the creation of a user-friendly interface. We know empirically that these principles work, and they make “common sense”. These heuristics th…