2-44鍾靜雯_day03

grey77發表於2020-12-29

Day03作業 資料結構
概述 基本型別和引用型別
基本型別:String Boolean Number Null Undefined Symbol Bigint。

引用型別:Object(儲存屬性和屬性值) Function。
在這裡插入圖片描述
區別:

(記憶體儲存)基本型別儲存在棧(Stack)裡面;引用型別在棧上儲存對堆上資料的引用(指標),在堆(Heap)上儲存引用型別本身的資料。
(清理方式)基本型別函式和方法執行完就清理記憶體;引用型別採用垃圾回收機制。
物件 儲存屬性和屬性值
定義物件:

Object構造器
在這裡插入圖片描述
物件字面量
在這裡插入圖片描述
陣列 有序的值的列表
(與其他程式語言相比)區別:

陣列的每個槽位可以儲存任意型別的資料。
動態大小 —— 影響效能。
定義陣列:(宣告)

陣列構造器

在這裡插入圖片描述
陣列字面量
在這裡插入圖片描述
初始化:
在這裡插入圖片描述
解構陣列:將陣列中的元素取出來賦值給變數。
在這裡插入圖片描述
陣列的屬性和方法:

length屬性:陣列的長度。

const avengers = [‘美國隊長’,‘鋼鐵俠’,‘雷神’,‘綠巨人’];
console.log(avengers.length);

// 通過設定length屬性改變陣列元素(不可逆轉的改變,無副本)
avengers.length = 1;
console.log(avengers);// [ ‘美國隊長’ ]
avengers.length = 5;
console.log(avengers);// <1 empty item> Undefined

// 不改變陣列元素:將length設為只讀屬性get。

pop()方法:刪掉陣列中最後一個元素。
// 宣告陣列
const avengers = [‘美國隊長’,‘鋼鐵俠’,‘雷神’,‘綠巨人’];
// 陣列維數縮小
console.log(avengers.pop());
console.log(avengers);

// delete運算子:元素個數沒變,刪掉元素變為Undefined
const avengers = [‘美國隊長’,‘鋼鐵俠’,‘雷神’,‘綠巨人’];
delete avengers[0];
console.log(avengers);
pop()方法和delete運算子的區別:pop陣列元素個數減少,delete運算子元素個數沒變。

push()方法:將新值新增到陣列的末尾。
const avengers = [‘美國隊長’,‘鋼鐵俠’,‘雷神’,‘綠巨人’];
avengers.push(‘蝙蝠俠’);
console.log(avengers);
shift()方法:刪除陣列中的第一個元素。
const avengers = [‘美國隊長’,‘鋼鐵俠’,‘雷神’,‘綠巨人’];
avengers.shift();
console.log(avengers);// [ ‘鋼鐵俠’, ‘雷神’, ‘綠巨人’ ]
console.log(avengers.shift());// 輸出刪除元素 鋼鐵俠
unshift()方法:將新值新增到陣列的開頭。
const avengers = [‘美國隊長’,‘鋼鐵俠’,‘雷神’,‘綠巨人’];
avengers.unshift(‘小超人’);
console.log(avengers);
console.log(avengers.unshift());
concat()方法:陣列合並。
const avengers = [‘美國隊長’,‘鋼鐵俠’,‘雷神’,‘綠巨人’];
const heroes = [‘蝙蝠俠’,‘神奇女俠’,‘閃電俠’,‘水行俠’];
const oArray = avengers.concat(heroes);// 賦值給變數,變數是新生成的陣列。
console.log(avengers);
console.log(oArray);// 新建陣列,進行合併。

// 擴充套件運算子:ES6新增。
const avengers = [‘美國隊長’,‘鋼鐵俠’,‘雷神’,‘綠巨人’];
const heroes = [‘蝙蝠俠’,‘神奇女俠’,‘閃電俠’,‘水行俠’];
const oArray = […avengers,…heroes];// 元素扁平化
console.log(oArray);
join()方法:陣列變成組合了陣列所有元素的字串。
const avengers = [‘美國隊長’,‘鋼鐵俠’,‘雷神’,‘綠巨人’];
const a = avengers.join(&);// 變數
console.log(a);
slice()方法:從原始陣列中切掉一片,從而建立一個子陣列。
const avengers = [‘美國隊長’,‘鋼鐵俠’,‘雷神’,‘綠巨人’];
const b = avengers.slice(2,3); // 從第二個元素開始到第三個元素結束(不包含)
console.log(b);// [ ‘雷神’ ]
console.log(avengers);
reverse()方法:反轉陣列中元素的次序(永久性改變)。
const d = [‘a’,‘b’,‘c’,‘d’];
const e = d.reverse();// 賦值給變數
console.log(e,d);// [ ‘d’, ‘c’, ‘b’, ‘a’ ] [ ‘d’, ‘c’, ‘b’, ‘a’ ]
indexOf():檢測陣列中是否包含一個特定值,如果找到了,就返回該值在陣列中第一次出現的索引號,否則,就返回-1。
const avengers = [‘美國隊長’,‘鋼鐵俠’,‘雷神’,‘綠巨人’];
const a1 = avengers.indexOf(‘美國隊長1’);
console.log(a1);// 0
includes():檢測陣列中是否包含特定值,如果找到了,就返回true,否則就返回false。
const avengers = [‘美國隊長’,‘鋼鐵俠’,‘雷神’,‘綠巨人’];
const a2 = avengers.includes(‘美國隊長2’);
console.log(a2);// false
多維陣列:

作用:座標系統(二維陣列)以及複雜演算法。

舉例:

const ma = [[1,2],[3,4]];
console.log(ma[0][0]);// 訪問元素

const summer = [‘Jun’,‘Jul’,‘Aug’];
const winter = [‘Dec’,‘Jan’,‘Feb’];
const nested = [summer,winter];
console.log(nested);// [ [ ‘Jun’, ‘Jul’, ‘Aug’ ], [ ‘Dec’, ‘Jan’, ‘Feb’ ] ]
// 擴充套件運算子扁平化為字串
const summer = [‘Jun’,‘Jul’,‘Aug’];
const winter = [‘Dec’,‘Jan’,‘Feb’];
const flat = […summer,…winter];
console.log(flat);// [ ‘Jun’, ‘Jul’, ‘Aug’, ‘Dec’, ‘Jan’, ‘Feb’ ]
1
2
3
4
5
6
7
8
9
10
11
12
陣列去重:(Set和陣列的轉換)

const a = [1,2,12,1,2,3,4,5];// 迴圈讀取一個一個判斷
const b = new Set(a);
console.log(b);// Set { 1, 2, 12, 3, 4, 5 }
const c = […b];// 集合變陣列
console.log©;
1
2
3
4
5
集合 唯一值的集合
定義集合:

建構函式,無字面量。
// 數字
const list = new Set();
list.add(1);
list.add(2).add(3).add(4).add(5);// 鏈式儲存
list.add(5);// 不能有重複值,直接忽略。
console.log(list);

// 初始化時用陣列
const list = new Set([1,2,3,4,5]);
console.log(list);

// 字元
const c = new Set(‘Hello’);
console.log©;

// 鏈式操作,返回的一定是建立的本身
const list4 = new Set().add(‘the’).add(‘quick’).add(‘brown’).add(‘fox’);
console.log(list4);
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
屬性和方法:

size屬性:獲取集合中值的數目。(只讀屬性)
const list4 = new Set().add(‘the’).add(‘quick’).add(‘brown’).add(‘fox’);
console.log(list4.size);

const list4 = new Set().add(‘the’).add(‘quick’).add(‘brown’).add(‘fox’);
list4.size = 3;
console.log(list4);
1
2
3
4
5
6
has()方法:用於檢測一個值是否在集合中,返回true或者false。
const list4 = new Set().add(‘the’).add(‘quick’).add(‘brown’).add(‘fox’);
console.log(list4.has(‘brown’));
1
2
delete()方法:從集合中刪除一個值。
const list4 = new Set().add(‘the’).add(‘quick’).add(‘brown’).add(‘fox’);
list4.delete(‘the’);
console.log(list4);
1
2
3
clear()方法:刪掉集合中的所有值。
const list4 = new Set().add(‘the’).add(‘quick’).add(‘brown’).add(‘fox’);
list4.clear();
console.log(list4);
1
2
3
Set和陣列的轉換:陣列去重也用到了。擴充套件運算子 Array.from() 方法
const list4 = new Set().add(‘the’).add(‘quick’).add(‘brown’).add(‘fox’);
const oArray = […list4]; // 集合轉陣列
console.log(oArray);

// 陣列方法
const list4 = new Set().add(‘the’).add(‘quick’).add(‘brown’).add(‘fox’);
const oArray = Array.from(list4);
console.log(oArray);
1
2
3
4
5
6
7
8
集合 唯一值的集合
當物件新增到Set中時,只要Set存在,它們就會一直儲存在Set中,即使對物件的原始引用被刪除了依然如此。用技術術語來說,就是物件阻止被垃圾回收,而這會導致記憶體洩漏。
WeakSet 通過垃圾回收任何引用原始引用已經被刪掉的“死物件”,從而可以避免這種情況。
WeakSet 只能新增非基本型別資料,否則會丟擲一個型別錯誤(TypeError)。
// Set強集合 記憶體洩漏
let array1 = [1, 2, 3];
let array2 = [3, 4, 5];
const strong = new Set().add(array1).add(array2); // 建集合,新增陣列。
console.log(strong.has(array1));
array1 = null; // 刪除對原始物件的引用
array2 = null; // 原來陣列設定為空
array3 = […strong][0]; // 1
array4 = […strong][1];
console.log(array3);
console.log(array4);// 陣列還在

// WeakSet 避免記憶體洩漏
let array1 = [1,2,3];
let array2 = [3,4,5];
const weak = new WeakSet().add(array1).add(array2);// 扁平化
console.log(weak);
array1 = null; // 垃圾回收
array2 = null;
const array3 = […weak][0];
const array4 = […weak][1];
// 丟擲異常
console.log(array3);
console.log(array4);// 型別錯誤,物件消失,不能引用
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
Map 儲存鍵值對列表
建立Map:

const romanNumerals = new Map();
romanNumerals.set(1,‘I’);
romanNumerals.set(2,‘II’).set(3,‘III’).set(4,‘IV’).set(5,‘V’);
console.log(romanNumerals);// Map { 1 => ‘I’, 2 => ‘II’, 3 => ‘III’, 4 => ‘IV’, 5 => ‘V’ }
1
2
3
4
方法和屬性:

size屬性:獲取鍵和值的數量。(只讀屬性)
const romanNumerals = new Map();
romanNumerals.set(1,‘I’);
romanNumerals.set(2,‘II’).set(3,‘III’).set(4,‘IV’).set(5,‘V’);
console.log(romanNumerals.size);// 5
1
2
3
4
get(key):通過鍵獲取值。
const romanNumerals = new Map();
romanNumerals.set(1,‘I’);
romanNumerals.set(2,‘II’).set(3,‘III’).set(4,‘IV’).set(5,‘V’);
console.log(romanNumerals.get(3));// III
1
2
3
4
has(key):檢測一個特定鍵是否在對映中。
const romanNumerals = new Map();
romanNumerals.set(1,‘I’);
romanNumerals.set(2,‘II’).set(3,‘III’).set(4,‘IV’).set(5,‘V’);
console.log(romanNumerals.has(5));// true
1
2
3
4
delete(key):從對映中刪除一個鍵值對。
const romanNumerals = new Map();
romanNumerals.set(1,‘I’);
romanNumerals.set(2,‘II’).set(3,‘III’).set(4,‘IV’).set(5,‘V’);
romanNumerals.delete(5);
console.log(romanNumerals);// Map { 1 => ‘I’, 2 => ‘II’, 3 => ‘III’, 4 => ‘IV’ }
1
2
3
4
5
clear():從對映中刪除所有鍵值對。
const romanNumerals = new Map();
romanNumerals.set(1,‘I’);
romanNumerals.set(2,‘II’).set(3,‘III’).set(4,‘IV’).set(5,‘V’);
romanNumerals.clear();
console.log(romanNumerals);
1
2
3
4
5
Map轉換為陣列:

擴充套件運算子
Array.from() 方法
//map to array
const romanNumerals = new Map();
romanNumerals.set(1,‘I’).set(2,‘II’).set(3,‘III’).set(4,‘IV’).set(5,‘V’);// 鏈式
const oArray1 = […romanNumerals];
const oArray2 = Array.from(romanNumerals);
console.log(oArray1);
console.log(oArray2);
// [ [ 1, ‘I’ ], [ 2, ‘II’ ], [ 3, ‘III’ ], [ 4, ‘IV’ ], [ 5, ‘V’ ] ]
// [ [ 1, ‘I’ ], [ 2, ‘II’ ], [ 3, ‘III’ ], [ 4, ‘IV’ ], [ 5, ‘V’ ] ]
1
2
3
4
5
6
7
8
9
WeakMap
鍵不能是基本資料型別的值,並且在對原始物件的引用被刪除時,垃圾回收會自動刪除所有死條目。

// 記憶體洩漏
let array5 = [1, ‘I’];
let array6 = [2, ‘II’];
strong1 = new Map().set(array5).set(array6); // 建立對映,新增陣列。
console.log(strong1.has(array5));
array5 = null;
array6 = null;
array7 = […strong1][0];
array8 = […strong1][1];
console.log(array7);// [ [ 1, ‘I’ ], undefined ]
console.log(array8);// [ [ 2, ‘II’ ], undefined ]

let array9 = [1, ‘I’];
let array10 = [2, ‘II’];
weak1 = new WeakMap().set(array9).set(array10); // 建立對映,新增陣列。
console.log(weak1.has(array9));
array9 = null;
array10 = null;
array11 = […Weak1][0];
array12 = […Weak1][1];
console.log(array11);
console.log(array12);
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
總結
資料型別
基礎型別:String Number Boolean Symbol undefined null。

引用型別:Object/Function。

物件
建立物件的兩種方式
構造器

let oStudent = new Object();
1
物件字面量

let oStudent = {
name: ‘xaaaa’,
age: 21
};
oStudent.name // 引用屬性
1
2
3
4
5
Array
1.建立陣列的兩種方式
構造器

const oArray = new Array();
1
陣列字面量

let person1 = {};
1
2.初始化
逐個賦值

const heroes = [];
heroes[0] = ‘蝙蝠俠’;
heroes[1] = ‘神奇女俠’;
1
2
3
陣列字面量

const avengers = [‘美國隊長’,‘鋼鐵俠’,‘雷神’,‘綠巨人’];
1
3.刪除陣列元素
delete avengers[0];
1
4.解構陣列
const [a,b,c] = [1,2,3];
console.log(a=${a},b=${b},c=${c});
1
2
5.陣列的屬性和方法
length屬性:陣列的長度。

console.log(avengers.length);
1
pop()方法:刪掉陣列中最後一個元素。

console.log(avengers.pop());
1
push()方法:將新值新增到陣列的末尾。

avengers.push(‘蝙蝠俠’);
1
shift()方法:刪除陣列中的第一個元素。

avengers.shift();
1
unshift()方法:將新值新增到陣列的開頭。

avengers.unshift(‘小超人’);
1
concat()方法:陣列合並。

const oArray = avengers.concat(heroes);
// 擴充套件運算子
const oArray = […avengers,…heroes];
1
2
3
join()方法:陣列變成組合了陣列所有元素的字串。

const a = avengers.join(&);
1
slice()方法:從原始陣列中切掉一片,從而建立一個子陣列。

const b = avengers.slice(2,3);
1
splice()方法:從一個陣列中刪除元素,然後將新元素插入在被刪除的元素的位置上。

const cc = avengers.splice(2,2,‘liwanling’,‘li’);
1
reverse()方法:反轉陣列中元素的次序(永久性改變)。

const e = d.reverse();
1
sort()方法:對陣列中的元素按字母順序進行排序(永久性改變)。

const g = f.sort();
1
indexOf():檢測陣列中是否包含一個特定值,如果找到了,就返回該值在陣列中第一次出現的索引號,否則,就返回-1。

const avengers = [‘美國隊長’,‘鋼鐵俠’,‘雷神’,‘綠巨人’];
const a1 = avengers.indexOf(‘美國隊長1’);
console.log(a1);// 0
1
2
3
includes():檢測陣列中是否包含特定值,如果找到了,就返回true,否則就返回false。

const a2 = avengers.includes(‘美國隊長2’);
1
Set:沒有重複值
1.建立Set
構造器

let oSet = new Set();
1
2.新增元素
oSet.add(1).add(2)
1
3.Set的屬性和方法
size屬性:獲取集合中值的數目。

console.log(list4.size);
1
has()方法:用於檢測一個值是否在集合中,該方法會返回true或者false。

console.log(list4.has(‘brown’));
1
delete()方法:從集合中刪除一個值。

list4.delete(‘the’);
1
clear():刪掉集合中的所有值。

list4.clear();
1
4.Set和陣列的轉換:擴充套件運算子 Array.from()方法
const oArray = […list4];

const oArray = Array.from(list4);
1
2
3
let oSet = new Set([1,2,3]); // 陣列 迭代物件
1
5.WeakSet
const weak = new WeakSet().add(array1).add(array2);
console.log(weak);
array1 = null;
array2 = null;
const array3 = […weak][0];
const array4 = […weak][1];
1
2
3
4
5
6
Map
1.建立Map
const romanNumerals = new Map();
1
2.方法和屬性
size屬性:獲取鍵和值的數量。

console.log(romanNumerals.size);
1
get(key):通過鍵獲取值。

console.log(romanNumerals.get(3));
1
has(key):檢測一個特定鍵是否在對映中。

console.log(romanNumerals.has(5));
1
delete(key):從對映中刪除一個鍵值對。

romanNumerals.delete(5);
1
clear():從對映中刪除所有鍵值對。
console.log(romanNumerals);
1
3.Map轉換為陣列:擴充套件運算子 Array.from() 方法
const oArray1 = […romanNumerals];
const oArray2 = Array.from(romanNumerals);
1
2
4.WeakMap
// 記憶體洩漏
strong1 = new Map().set(array5).set(array6); // 建立對映,新增陣列。
weak1 = new WeakMap().set(array9).set(array10); // 建立對映,新增陣列。

相關文章