91超碰碰碰碰久久久久久综合_超碰av人澡人澡人澡人澡人掠_国产黄大片在线观看画质优化_txt小说免费全本

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

JavaScript中怎么實現數組拷貝

發布時間:2021-06-16 17:50:47 來源:億速云 閱讀:124 作者:Leah 欄目:web開發

這期內容當中小編將會給大家帶來有關JavaScript中怎么實現數組拷貝,文章內容豐富且以專業的角度為大家分析和敘述,閱讀完這篇文章希望大家可以有所收獲。

1、擴展運算符(淺拷貝)

自從ES6出現以來,這已經成為最流行的方法。它是一個很簡單的語法,但是當你在使用類似于React和Redux這類庫時,你會發現它是非常非常有用的。

numbers = [1, 2, 3];
numbersCopy = [...numbers];
這個方法不能有效的拷貝多維數組。數組/對象值的拷貝是通過引用而不是值復制。
// numbersCopy.push(4);
console.log(numbers, numbersCopy);
// [1, 2, 3] and [1, 2, 3, 4]
// 只修改了我們希望修改的,原數組不受影響
// nestedNumbers = [[1], [2]];
numbersCopy = [...nestedNumbers];
numbersCopy[0].push(300);
console.log(nestedNumbers, numbersCopy);
// [[1, 300], [2]]
// [[1, 300], [2]]
// 由于公用引用,所以兩個數組都被修改了,這是我們不希望的

2、for()循環(淺拷貝)

考慮到函數式編程變得越來越流行,我認為這種方法可能是最不受歡迎的。

numbers = [1, 2, 3];
numbersCopy = [];
for (i = 0; i < numbers.length; i++) {
 numbersCopy[i] = numbers[i];
}
這個方法不能有效的拷貝多維數組。因為我們使用的是=運算符,它在處理數組/對象值的拷貝時通過引用而不是值復制。
// numbersCopy.push(4);
console.log(numbers, numbersCopy);
// [1, 2, 3] and [1, 2, 3, 4]
// nestedNumbers = [[1], [2]];
numbersCopy = [];
for (i = 0; i < nestedNumbers.length; i++) {
 numbersCopy[i] = nestedNumbers[i];
}
numbersCopy[0].push(300);
console.log(nestedNumbers, numbersCopy);
// [[1, 300], [2]]
// [[1, 300], [2]]
// 由于公用引用,所以兩個數組都被修改了,這是我們不希望的

3、while()循環(淺拷貝)和for() 類似。

numbers = [1, 2, 3];
numbersCopy = [];
i = -1;
while (++i < numbers.length) {
 numbersCopy[i] = numbers[i];
}

4、Array.map(淺拷貝)

上面的for和while都是很“古老”的方式,讓我們繼續回到當前,我們會發現map方法。map源于數學,是將一個集合轉換成另一種集合,同時保留結構的概念。

在英語中,它意味著Array.map 每次返回相同長度的數組。

numbers = [1, 2, 3];
double = (x) => x * 2;
numbers.map(double);

當我們使用map方法時,需要給出一個callback函數用于處理當前的數組,并返回一個新的數組元素。

和拷貝數組有什么關系呢?

當我們想要復制一個數組的時候,只需要在map的callback函數中直接返回原數組的元素即可。

numbers = [1, 2, 3];
numbersCopy = numbers.map((x) => x);

如果你想更數學化一點,(x) => x叫做恒等式。它返回給定的任何參數。

identity = (x) => x;
numbers.map(identity);
// [1, 2, 3]

同樣的,處理對象和數組的時候是引用而不是值復制。

5、Array.filter(淺拷貝)

Array.filter方法同樣會返回一個新數組,但是并不一定是返回同樣長度的,這和我們的過濾條件有關。

[1, 2, 3].filter((x) => x % 2 === 0)
// [2]

當我們的過濾條件總是true時,就可以用來實現拷貝。

numbers = [1, 2, 3];
numbersCopy = numbers.filter(() => true);
// [1, 2, 3]

同樣的,處理對象和數組的時候是引用而不是值復制。

6、Array.reduce(淺拷貝)

其實用reduce來拷貝數組并沒有展示出它的實際功能,但是我們還是要將其能夠拷貝數組的能力說一下的

numbers = [1, 2, 3];
numbersCopy = numbers.reduce((newArray, element) => {
 newArray.push(element);
 return newArray;
}, []);

reduce() 方法對數組中的每個元素執行一個由您提供的reducer函數,將其結果匯總為單個返回值。

上面我們的例子中初始值是一個空數組,我們在遍歷原數組的時候來填充這個空數組。該數組必須要從下一個迭代函數的執行后被返回出來。

同樣的,處理對象和數組的時候是引用而不是值復制。

7、Array.slice(淺拷貝)

slice 方法根據我們指定的start、end的index從原數組中返回一個淺拷貝的數組。

[1, 2, 3, 4, 5].slice(0, 3);
// [1, 2, 3]
// Starts at index 0, stops at index 3
// 當不給定參數時,就返回了原數組的拷貝
numbers = [1, 2, 3, 4, 5];
numbersCopy = numbers.slice();
// [1, 2, 3, 4, 5]

同樣的,處理對象和數組的時候是引用而不是值復制。

8、JSON.parse & JSON.stringify(深拷貝)

JSON.stringify將一個對象轉成字符串;
JSON.parse將轉成的字符串轉回對象。

將它們組合起來可以將對象轉換成字符串,然后反轉這個過程來創建一個全新的數據結構。

nestedNumbers = [[1], [2]];
numbersCopy = JSON.parse(
 JSON.stringify(nestedNumbers)
);
numbersCopy[0].push(300);
console.log(nestedNumbers, numbersCopy);
// [[1], [2]]
// [[1, 300], [2]]
// These two arrays are completely separate!

這個可以安全地拷貝深度嵌套的對象/數組

幾種特殊情況

1、如果obj里面有時間對象,則JSON.stringify后再JSON.parse的結果,時間將只是字符串的形式。而不是時間對象;

var test = {
 name: 'a',
 date: [new Date(1536627600000), new Date(1540047600000)],
};
let b;
b = JSON.parse(JSON.stringify(test))
console.log(b)

2、如果obj里有RegExp、Error對象,則序列化的結果將只得到空對象;

const test = {
 name: 'a',
 date: new RegExp('\\w+'),
};
// debugger
const copyed = JSON.parse(JSON.stringify(test));
test.name = 'test'
console.log('ddd', test, copyed)

3、如果obj里有函數,undefined,則序列化的結果會把函數或 undefined丟失;

const test = {
 name: 'a',
 date: function hehe() {
 console.log('fff')
 },
};
// debugger
const copyed = JSON.parse(JSON.stringify(test));
test.name = 'test'
console.error('ddd', test, copyed)

4、如果obj里有NaN、Infinity和-Infinity,則序列化的結果會變成null

5、JSON.stringify()只能序列化對象的可枚舉的自有屬性,例如 如果obj中的對象是有構造函數生成的, 則使用JSON.parse(JSON.stringify(obj))深拷貝后,會丟棄對象的constructor;

function Person(name) {
 this.name = name;
 console.log(name)
}
const liai = new Person('liai');
const test = {
 name: 'a',
 date: liai,
};
// debugger
const copyed = JSON.parse(JSON.stringify(test));
test.name = 'test'
console.error('ddd', test, copyed)

9、Array.cancat(淺拷貝)

concat將數組與值或其他數組進行組合。

[1, 2, 3].concat(4); // [1, 2, 3, 4]
[1, 2, 3].concat([4, 5]); // [1, 2, 3, 4, 5]

如果我們不指定參數或者提供一個空數組作為參數,就可以進行淺拷貝。

[1, 2, 3].concat(); // [1, 2, 3]
[1, 2, 3].concat([]); // [1, 2, 3]

同樣的,處理對象和數組的時候是引用而不是值復制。

10、Array.from(淺拷貝)

可以將任何可迭代對象轉換為數組。給一個數組返回一個淺拷貝。

console.log(Array.from('foo'))
// ['f', 'o', 'o']
numbers = [1, 2, 3];
numbersCopy = Array.from(numbers)
// [1, 2, 3]

上述就是小編為大家分享的JavaScript中怎么實現數組拷貝了,如果剛好有類似的疑惑,不妨參照上述分析進行理解。如果想知道更多相關知識,歡迎關注億速云行業資訊頻道。

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

阿拉善左旗| 高州市| 杨浦区| 兴海县| 抚顺市| 辉南县| 新河县| 武川县| 田东县| 承德县| 资源县| 莱芜市| 成安县| 铜梁县| 内丘县| 新野县| 山丹县| 九台市| 宁远县| 吉木乃县| 永修县| 青岛市| 金堂县| 威远县| 平顺县| 潞城市| 康平县| 牙克石市| 汉中市| 潞西市| 桑植县| 江门市| 平原县| 隆林| 牟定县| 青岛市| 常山县| 玉溪市| 浏阳市| 台东市| 太仓市|