第六章 集合引用类型

Object

显示地创建Object的实例由两种方式

// 使用new 操作符和Object构造函数
let person = new Object(); 
person.name = "Nicholas"; 
person.age = 29; 

// 使用对象字面量表示法
// 在对象字面量表示法中,属性名可以是字符串或者数值
let person = { 
 name: "Nicholas", 
 age: 29 
}; 

// 上述表示还可以表示为
let person = {}
person.name = "Nicholas";
person.age = 29;

对象字面量已经成为给函数传递大量可选参数的主要方式

function displayInfo(args) {
    ...
}
// 在这里 给函数displayInfo主要传递了一个对象字面量的参数
displayInfo( {
    name: "Nicholas",
    age: 29
})

获取对象属性的方法

person.name;
person['name'];

Array

ES数组是一组有序的数据,它的每个槽位可以存储任意类型的数据(意味着元素可以是字符串或者数值或者对象),ES数组也是动态大小的,会随着数据添加而自动增长。

创建数组

// 1、使用Array构造函数
// 长度
let colors = new Array(20);
// 内容 
let colors = new Array("red","green","yellow");

// 2、使用数组字面量
let colors = ["red","green","yellow"];

ES6新增了两个用于创建数组的静态方法:from() 和 of()

from用于将类数组结构转换为数组实例

第一个参数为一个类数组对象

console.log(Array.from("Matt")); // ["M", "a", "t", "t"] 
const m = new Map().set(1, 2) 
                   .set(3, 4);
console.log(Array.from(m)); // [[1, 2], [3, 4]] 

// Array.from()对现有数组执行浅复制
const a1 = [1, 2, 3, 4]; 
const a2 = Array.from(a1);

第二个参数为可选的映射函数参数

const a1 = [1, 2, 3, 4]; 
const a2 = Array.from(a1, x => x**2); 
console.log(a2); // [1, 4, 9, 16] 

of用于将一组参数转换为数组实例

console.log(Array.of(1, 2, 3, 4)); // [1, 2, 3, 4] 

数组索引

可以通过修改length的值,从数组末尾删除或者添加元素

// 删除元素
let colors = ["red","yellow","green"];
colors.length = 2;
alert(colors[2]); // undefined

// 添加元素 因为数组中最后一个元素的索引总是length-1,所以在索引length处赋值相当于添加元素
colors[colors.length] = "black";
alert(colors.length) = 3;

检测数组

Array.isArray(arr);

填充方法

const zeroes = [0,0,0,0,0];
// 第一个参数:要填充的值 
// 第二个参数:开始填充的位置
// 第三个参数:结束填充的位置(不包括)
zeroes.fill(7,1,3); // [0,7,7,0,0]

转换方法

Map

ES6的新增特性,Map是一种新的集合类型

基本API

// 使用嵌套数组初始化映射
const m1 = new Map([
    ["key1","val1"],
    ["key2","val2"],
    ["key3","val3"]
]);

alert(m1.has("key1")); // true
alett(m1.get("key1")); // val1
alert(m1.size); // 2

m1.set("key4","val4")
  .set("key5","val5");

m1.delete("key1"); // 只删除这一个键值对
alert(m1.size); // 4

m1.clear(); // 清除这个映射实例中的所有键值对

// 注意:Map可以使用任何js数据类型作为键

顺序与迭代

Map实例会维护键值对的插入顺序,依次可以根据插入顺序执行迭代操作

const m = new Map([
    ["key1","val1"],
    ["key2","val2"],
    ["key3","val3"]
])

for(let pair of m.entries()) {
    alert(pair);
}
// [key1,val1] 
// [key2,val2] 
// [key3,val3]

// 上述代码等价于
for(let pair of m[Symbol.iterator]()) {
    alert(pair);
}

注意:因为entries()是默认迭代器,可以直接对映射实例使用扩展操作,把映射转换为数组:

console.log([...m]); // [[key1,val1],[key2,val2],[key3,val3]]

WeakMap

弱映射

Set

WeakSet

迭代与扩展操作

有4种原生集合类型定义了默认迭代器。(这意味着它们都可以支持顺序迭代,都可以传入for-of循环)

Array、所有定型数组、Map、Set

这也意味着所有这些类型都兼容扩展操作符。(…)

扩展操作符在对可迭代对象执行浅复制时特别有用,只需要简单的语法就可以复制整个对象。