1-JavaScript-ECMAScript核心-内建对象

before

本篇主要介绍js的内建的对象,学习其具体的属性和方法。

这里提前说一个概念,那就是:

  • 破坏性方法,即对原数据进行操作,比如原地排序、反转数组。
  • 非破坏性方法,不会影响原数据,而是经过一番如此这般之后,返回新的结果,比如两个字符串通过拼接方法进行拼接,会得到一个新的字符串,而不影响原来的两个字符串。

Array

https://developer.mozilla.org/zh-CN/docs/Web/JavaScript/Reference/Global_Objects/Array

你可以把JavaScript中的数组(Array)当成Python中的列表。

什么是序列?

所谓序列,指的是一块可存放多个值的连续内存空间,这些值按一定顺序排列,可通过每个值所在位置的编号(称为索引)访问它们。

为了更形象的认识序列,可以将它看做是一家旅店,那么店中的每个房间就如同序列存储数据的一个个内存空间,每个房间所特有的房间号就相当于索引值。也就是说,通过房间号(索引)我们可以找到这家旅店(序列)中的每个房间(内存空间)。

序列中的每个元素都有一个序号,即元素的位置,也叫做索引、索引下标、下标索引,序列中的第一个元素索引为0,第二个索引为1,依此类推。
注意:JavaScript中序列编号机制是从0开始的,其他大部分的语言都是如此设计。另外,这里的序列如无特指,一律为有序序列。

Array也属于序列类型,它具有以上序列的特点。且,Array中可以存储JavaScript中的任意数据类型;如果数组中嵌套的还是数组,可以称为二维数组,如果嵌套更多层,可以称为多维数组,不过处理起来麻烦了,通常不这么干。

另外,虽然数组能存任意类型,但建议存储为同一类型的数据,便于处理。

最后,数组的长度没有限制。

基础操作

创建数组

// 通过new来声明一个空的数组
// let a = new Array();

// 也可以省略new,如下面两种简写方式,跟new Array()效果一样
// let a = Array();
let a = [];
// let a = ['a', 'b', 'c']; // 也可以有初始的元素

console.log(a, typeof a); // [] object
console.log(a instanceof Array); // true

添加/更新

let a = [];

// 通过索引添加或者更新元素
a[0] = 10; // 此时数组的0索引对应的位置没有数据,所以这个操作是添加元素
a[0] = 20; // 0索引在上一步已经赋值了,所以这里是更新

console.log(a[0]); // 通过索引取值
console.log(a[10]); // 数组中没有下标为10的索引,所以返回undefined
console.log(a.length); // 返回数组的元素的个数,即返回数组的长度

非连续性数组

let a = [];

a[0] = 10;
a[1] = 20;
a[2] = 30;
a[7] = 50;
a[5] = 70;

console.log(a); // [ 10, 20, 30, <2 empty items>, 70, <1 empty item>, 50 ]
console.log(a.length); // 8

// 借助length的特点,我们可以为数组追加元素
a[a.length] = 80;
console.log(a); // [ 10, 20, 30, <2 empty items>, 70, <1 empty item>, 50, 80 ]

// length的值可以修改
// length值改小
a.length = 2; // 从右到左进行删除,保留两个元素
console.log(a); // [ 10, 20 ]

// length值改大
a.length = 10; // 会将后续的下标值置为空
console.log(a); // [ 10, 20, <8 empty items> ]

如上例,如果不看打印结果,我们自数数的话,这个数组中元素的个书应该是5个,但a.length结果确是8个?????

什么情况?这就要说一点,length的返回值取决于数组中索引下标最大的值加1,上例中最大的索引是7,加1后的结果是8,然后返回了...

那么这种情况和这样的数组都是不合理的,也不符合逻辑的。所以这种数组被称为非连续性数组,数组中非连续部分默认填充一个empty,表示这个索引位置的元素是空的。

在开发中,我们应该避免使用非连续性数组。

遍历数组

let a = ['a', 'b', 'c'];

// for循环遍历数组,正序
for (let i = 0; i < a.length; i++) {
    console.log(i, a[i]);
}
// 倒叙遍历
for (let i = a.length - 1; i >= 0; i--) {
    console.log(i, a[i]);
}

// for in 遍历,只能正序遍历
for (let i in a) {
    console.log(i, a[i]);
}

// 新语法,拿到的直接就是元素,但兼容性有待加强
for (let i of a) {
    console.log(i);
}

// 使用array的forEach,函数中的第一个参数是元素,第二个参数是索引,第三个参数就是被遍历的数组,用的不多
a.forEach(function (item, index, arr) {
    console.log(index, item, arr);
});

最常用的就是最开始的for循环或forEach方法去遍历数组,比较灵活。

常用方法

添加和删除:push/pop/unshift/shift

let a = ['a', 'b', 'c'];

// 追加一个或多个元素,push再追加后,还会返回数组新的长度
// let res = a.push('d');
// a.push('x', 'y');
// console.log(a, res); // [ 'a', 'b', 'c', 'd', 'x', 'y' ] 4

// 从数组尾部删除元素,没有参数,一次只能删除一个元素,且将删除的元素返回
// let res = a.pop();
// console.log(a, res); // [ 'a', 'b' ] c


// 从数组头部插入一个或多个元素,并将数组的新的长度返回
// a.unshift('d');
// let res = a.unshift('x', 'y');
// console.log(a, res); // [ 'x', 'y', 'd', 'a', 'b', 'c' ] 6

// 删除数组头部元素,并将其返回
// let res = a.shift();
// console.log(a, res); // [ 'b', 'c' ] a

练习:

function Person(name, age) {
    this.name = name;
    this.age = age;
}

let p1 = new Person('沙和尚', 28);
let p2 = new Person('红孩儿', 10);
let p3 = new Person('猪八戒', 30);
let p4 = new Person('孙悟空', 16);

arr = [p1, p2, p3, p4];

// 请定义一个函数,并将成年人和未成年人分别存储(数组、对象都可以)
function func(arr) {
    let res = {"未成年": [], "成年人": []};
    for (let i = 0; i < arr.length; i++) {
        if (arr[i].age >= 18) {
            a['成年人'].push(arr[i]);
        } else {
            a['未成年'].push(arr[i]);
        }
    }
    return res;
}

res = func(arr);
console.log(res);

判断数组元素是否存在:indexOf/includes

首先,判断指定元素是否存在,不能用in,因为js中,用in判断数组是判断索引位置是否存在的:

let a = ['a', 'b', 'c'];
console.log('a' in a); // false
// 索引1~2都是合法的,不在这范围之内都返回false
console.log(1 in a); // true
console.log(2 in a); // true
console.log(3 in a); // false
console.log(30 in a); // false

indexOf/lastIndexOf

// 判断指定元素在不在数组中
let a = ['a', 'b', 'c'];
// indexOf,从左到右找元素
// 第一个参数:要查找的元素
// 第二个参数: 不传参,即默认从0索引开始往右找,找到第一个返回其索引下标;你也可以指定从哪个索引开始找
// 找不到的话,返回 -1
console.log(a.indexOf('a')); // 0
// 从索引1开始往右找 "w"
console.log(a.indexOf('w', 1)); // -1


/*
lastIndexOf,从右到左找元素
第一个参数:要查找的元素
第二个参数: 不传参,即默认从最后索引开始往左找,找到第一个返回其索引下标
	如果传值,即表示从指定索引开始往左找,找到第一个返回其索引下标
找不到的话,返回 -1
*/
let arr = ['a', 'b', 'a', 'b', 'e', 'e', 'b'];
// 从右开始往左找第一个,返回索引下标
console.log(arr.lastIndexOf('b')); // 6
// 从索引2开始往左找第一个出现的元素,返回其索引下标
console.log(arr.lastIndexOf('b', 2)); // 1

includes

let a = ['a', 'b', 'c'];
// includes如果在,返回true,否则返回false
console.log(a.includes('a'));
console.log(a.includes('w'));

拼接数组:join

join以指定符号将数组的元素拼接为字符串:

let arr = ['a', 'b', 'a', 'b', 'e', 'e', 'b'];
// 默认以逗号分割
console.log(arr.join()); // a,b,a,b,e,e,b
// 可以指定连接符号
console.log(arr.join('.')); // a.b.a.b.e.e.b
console.log(arr.join('-')); // a-b-a-b-e-e-b
console.log(arr.join('')); // ababeeb

反转:reverse

破坏性方法!reverse方法在原地对数组进行反转:

let arr = ['a', 'b', 'c', 'd'];
arr.reverse();
console.log(arr); // [ 'd', 'c', 'b', 'a' ]

数组排序:sort

破坏性方法!sort对数组进行排序:

let arr = ['c', 'd', 'a', 'b'];
// 默认升序排序
arr.sort(); // [ 'a', 'b', 'c', 'd' ]
// 想要降序排序的话,还是使用reverse吧
// arr.reverse();

使用sort对数组内的元素全是字符进行排序没有问题,因为它比较的字符在ASCII码表上的位置进行比较的,但要命的是,对于数字它也是按照这个规则来的:

let arr = [5, 3, 1, 2, 10, 18, 60];
// arr.sort(); // [ 1, 10, 18, 2, 3,  5, 60 ]
// 将数字转为字符串,然后按照ASCII码表进行排序,很明显不符合我们的需要
// 所以我们要自定义排序规则,而且规则非常简单固定
arr.sort(function (a, b) {
    // 想要升序就a - b
    // return a - b; // [ 1,  2,  3, 5, 10, 18, 60 ]
    // 想要降序就b - a
    return b - a; // [ 60, 18, 10, 5, 3,  2,  1 ]
});
console.log(arr);

对于数字类型的排序算法,内部使用的是什么算法,不同的浏览器有不同的实现。

切片和替换:slice/splice

slice用来对数组进行切片(截取),参数:

  1. 截取的起始位置(包含起始位置)。
  2. 截取的结束位置索引(不包含结束位置),如果截取结束位置不传参,表示从起始位置截取到数组的最后。

slice切片时,不会影响到原数组,而是将截取的结果以新的数组返回,所以该方法可以称为非破坏性方法。

let a = ['a', 'b', 'c', 'd'];
console.log(a.slice(1, 3)); // [ 'b', 'c' ]
console.log(a.slice(1)); // [ 'b', 'c', 'd' ]

// 索引可以传负值,-1表示数组倒数第一个元素下标;-2表示倒数第二个......
console.log(a.slice(1, -2)); // [ 'b' ]

splice可以用来删除、替换、添加数组中的元素,它是个破坏性方法,即它影响到原数组。

let a = ['a', 'b', 'c', 'd', 'e', 'f', 'g'];
/*
* 删除指定范围的元素
*   第一个参数:删除的起始位置(包含)
*   第二个参数:从删除元素的起始位置开始,向右删几个
* */
// let res;
// res= a.splice(2, 3); // 删除的元素:  [ 'c', 'd' ]  原数组:  [ 'a', 'b', 'e', 'f', 'g' ]
// console.log('删除的元素: ', res, ' 原数组: ',  a);


/*
* 替换指定范围内的元素
*   第一个参数:起始位置(包含)
*   第二个参数:从起始位置,向右替换几个
*   第三或更个多参数:一个或多个元素将被替换到数组中去
* */
// let res;
// // res= a.splice(0, 2, '沙和尚'); // 删除的元素:  [ 'a', 'b' ]  原数组:  [ '沙和尚', 'c', 'd', 'e', 'f', 'g' ]
// res= a.splice(0, 2, '沙和尚', '白骨精', '蜘蛛精'); // 删除的元素:  [ 'a', 'b' ]  原数组:  [ '沙和尚', '白骨精', '蜘蛛精', 'c', 'd', 'e', 'f', 'g']
// console.log('删除的元素: ', res, ' 原数组: ',  a);


/*
*  向指定位置插入元素
*   第一个参数:在该索引前面插入,值必须大于等于0
*   第二个参数:必须是0,否则就是替换了
*   第三或更个多参数:一个或多个元素将被插入到指定索引下标之前去
* */
// let res;
// // res = a.splice(0, 0, '沙和尚'); // 删除的元素:  [ ]  原数组:  ["沙和尚", "a", "b", "c", "d", "e", "f", "g"]
// res = a.splice(2, 0, '沙和尚', '白骨精', '蜘蛛精'); // 删除的元素:  [ ]  原数组:  ["a", "b", "沙和尚", "白骨精", "蜘蛛精", "c", "d", "e", "f", "g"]
// console.log('删除的元素: ', res, ' 原数组: ', a);

连接数组concat

concat用于连接多个数组,并不会影响原有数组,而是返回新的数组:

let arr1 = ['a', 'b'];
let arr2 = ['c', 'd'];
let arr3;
arr3 = arr1.concat(arr2); // [ 'a', 'b', 'c', 'd' ]
// 能多次自己连接自己
arr3 = arr1.concat(arr1, arr1, arr1); // [ 'a', 'b', 'a', 'b', 'a', 'b' ]
// 还能拼接单个值
arr3 = arr1.concat(arr1, 'x', 'y'); // [ 'a', 'b', 'a', 'b', 'x', 'y' ]
console.log(arr3);

数组去重

let arr = ['a', 'b', 'a', 'b', 'e', 'e', 'b'];

// 法1 利用临时数组和includes
function func1(arr) {
    let tmpArr = [];
    for (let i of arr) {
        if (!tmpArr.includes(i)) {  // 使用 ! 取反
            tmpArr.push(i)
        }
    }
    return tmpArr;
}

console.log(func1(arr)); // [ 'a', 'b', 'e' ]

// 法2,利用临时数组和indexOf
function func2(arr) {
    let tmpArr = [];
    for (let i of arr) {
        if (tmpArr.indexOf(i) === -1) {  // 使用 ! 取反
            tmpArr.push(i)
        }
    }
    return tmpArr;
}

console.log(func2(arr)); // [ 'a', 'b', 'e' ]

// 法3,原地删除,循环数组,拿到当前的元素和它后面的元素比较,如果一样,就删除后面的数字
function func3(arr) {
    for(let i = 0; i < arr.length; i++) {
        for (let j = i + 1; j < arr.length; j++) {
            if (arr[i] === arr[j]) {
                arr.splice(j, 1);
                // 当删除一个元素后,后面的元素索引都会自动向左移动,可能会导致遗漏的元素
                // 所以 j-- 一下,让当前索引再次比较一下
                j--;
            } 
        }
    }
    return arr
}
console.log(func3(arr)); // [ 'a', 'b', 'e' ]

String

在js的基础部分我们说了字符串的基本定义语句,这里我们集中来说说字符串的常用方法。

因为字符串是不可变类型,所以,它的方法都是非破坏性方法。

连接字符串:concat

对多个字符串进行拼接,并且返回新的字符串。

let s1 = 'hello';
let s2 = 'world';
let res;
res = s1.concat(s2); // helloworld
res = s1.concat(s2, 'hahaha', 'heiheihei'); // helloworldhahahaheiheihei
console.log(res);

根据索引获取字符charAt

根据索引下标返回对应的字符,跟str[0]这种类似。

let s1 = 'hello';
let res;
res = s1.charAt(0); // h
res = s1.charAt(4); // o
res = s1.charAt(-1); // 没有索引为-1,所以返回空
res = s1.charAt(10); // 超出索引范围,所以返回空
console.log(res);

根据索引下标返回字符在字符编码表的编码位置:charCodeAt

根据索引下标,返回对应字符在字符编(不仅限于ASCII)码表上的编码位置:

let s1 = 'hello';
let res;
// res = s1.charCodeAt(0); //  h --> 104
// res = s1.charCodeAt(4); // o --> 111
// res = s1.charCodeAt(-1); // 没有索引为-1,所以返回 NaN
res = s1.charCodeAt(10); // 超出索引范围,所以返回 NaN
console.log(res);

既然能根据字符返回编码位置,反过来也能根据编码位置对应的字符:

console.log(String.fromCharCode(104)); // h
console.log(String.fromCharCode(111)); // o
console.log(String.fromCharCode(38169)); // 错

判断字符串中是否含有指定子串:indexOf/lastIndexOf

let s1 = 'hello world';
let res;
// 默认从左到右找到第一个符合条件的字符的索引下标,找不到就返回 -1
res = s1.indexOf('o'); // 4
res = s1.indexOf('z'); // -1

// 也可以指定从左到右的起始位置
res = s1.indexOf('o', 6); // 7    从索引下标为6开始往右找

// 也可以找子串在字符串第一次出现的位置
res =s1.indexOf('llo'); // 2

// 从右往左找到一个符合条件的字符的索引下标,找不到就返回 -1
// 其它用法跟indexOf用法一样,这里不在演示
res = s1.lastIndexOf('l'); // 9
console.log(res);

字符串截取:slice

从字符串中截取指定范围的子串,并返回截取结果,并不影响原字符串。

let s1 = 'hello world';
let res;
// 指定截取开始位置和结束位置,注意,尾部截取不到,即不包含尾部
res = s1.slice(0, 2); // he
console.log(res);

以指定字符分割字符串:split

以指定字符分割字符串,并以数组的形式返回分割结果。

let s1 = 'hello world';
let res;
res = s1.split(" "); // [ 'hello', 'world' ]
console.log(res);

let s2 = 'a,b,c,d,e,f';
res = s2.split(","); // [ 'a', 'b', 'c', 'd', 'e', 'f' ]
console.log(res);

返回字符串小写/大写:toLowerCase/toUpperCase

let s1 = 'Hello1W2o3rld';
let res;
// 返回字符串的大写字母小写结果
res = s1.toLowerCase(); // hello1w2o3rld

// 返回字符串的小写字母大写结果
res = s1.toUpperCase(); // HELLO1W2O3RLD
console.log(res);

去除字符串两边的空格:trim

去空格的方法是新出的,所以兼容性不太好,这点需要注意。

let s1 = ' Hello1 W2o3rld\n';
let res;
// 默认去除字符串两边的空格和\n
res = s1.trim(); // Hello1 W2o3rld

// 仅去除字符串一边的空格或者\n
res = s1.trimEnd();
res = s1.trimStart();
console.log(res);

判断字符以什么开头结尾:startsWith/endsWitch

let s1 = 'Hello1 W2o3rld';
let res;
// 判断字符串是否以指定字符开头
res = s1.startsWith('H'); // true

// 判断字符串是否以指定字符结尾
res = s1.endsWith('d'); // true
console.log(res);

Object

在JavaScript中,对象object类似于Python中的字典。

对象的更新

// 这里主要介绍几种更新形式
// 第一种,就是用一个对象覆盖当前对象
let obj1 = { k1: "v1", k2: "", }
let obj2 = { k2: "v22", k3: "v3", }
// obj2覆盖obj1中的所有键值对
obj1 = {...obj2}
console.log('obj1', obj1)  // {k2: 'v22', k3: 'v3'}
console.log('obj2', obj2)  // {k2: 'v22', k3: 'v3'}

// 第二种,就是用一个对象更新当前对象,如果key存在,就覆盖其value,如果key不存在,就添加上该键值对
let obj1 = { k1: "v1", k2: "v2", }
let obj2 = { k2: "v22", k3: "v3", k4: {k44: 'v44'}}
// obj2更新obj1
Object.assign(obj1, obj2)
// 缺点是浅拷贝,也就是有嵌套对象时,只会拷贝其内存地址,如果嵌套对象有被修改,则会影响所有的相关对象
obj2.k4.k44 = 'v444'
console.log('obj1', obj1)  // {k1: 'v1', k2: 'v22', k3: 'v3', k4: {k44: 'v444'}}
console.log('obj2', obj2)  // {k2: 'v22', k3: 'v3', k4: {k44: 'v444'}}

// 第三种,解决上面浅拷贝的问题,那就是深拷贝
<!-- 深拷贝可以用lodash这个三方库来做,用之前先引入 -->
<script src="https://cdn.bootcdn.net/ajax/libs/lodash.js/4.17.21/lodash.js"></script>
<script>
    let obj1 = {k1: "v1", k2: "v2",}
    let obj2 = {k2: "v22", k3: "v3", k4: {k44: 'v44'}}
    // obj2更新obj1
    // lodash用的时候,就是_.cloneDeep(obj2)
    obj1 = _.cloneDeep(obj2)
    // 缺点是浅拷贝,也就是有嵌套对象时,只会拷贝其内存地址,如果嵌套对象有被修改,则会影响所有的相关对象
    obj2.k4.k44 = 'v444'
    console.log('obj1', obj1)  // {k1: 'v1', k2: 'v22', k3: 'v3', k4: {k44: 'v44'}}
    console.log('obj2', obj2)  // {k2: 'v22', k3: 'v3', k4: {k44: 'v444'}}
</script>

Math

https://developer.mozilla.org/zh-CN/docs/Web/JavaScript/Reference/Global_Objects/Math

Math 是一个内置对象,它拥有一些数学常数属性和数学函数方法。Math 不是一个函数对象。我们可以当成工具类来使用。

这里只介绍常用的一些属性和方法,更多的参考上面的连接。

// 圆周率
// console.log(Math.PI); // 3.141592653589793

// 绝对值
// console.log(Math.abs(-10)); // 10

// 向上取整
// console.log(Math.ceil(3.6)); // 4

// 向下取整
// console.log(Math.floor(3.6)); // 3

// 四舍五入
// console.log(Math.round(3.6)); // 4
// console.log(Math.round(3.4)); // 3

// 多个值中求最大
// console.log(Math.max(1, 4, 3)); // 4

// 多个值中求最小
// console.log(Math.min(1, 4, 3)); // 1

// x的y次方
// console.log(Math.pow(2, 3)); // 8

// 平方根
// console.log(Math.sqrt(2)); // 1.4142135623730951

random

// 生成0~1之间的随机数,测试结果来看,不包含0和1
let r;
r = Math.random();

// 生成0~n之间的随机数,包含0和n
// r = Math.round(Math.random() * 5);

// 生成 n~m之间的随机数,包含n和m
function ran(n, m) {
    // 下面的式子是推算出来的
    return Math.round(Math.random() * (m - n)) + n;
}
// console.log(ran(3, 8));

// 通过随机数进行打乱有序数组
let arr = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10];
arr.sort(function (a, b) {
    return Math.random() - Math.random();
});
console.log(arr); // [ 1,  6, 2, 3, 7, 4, 10, 8, 9, 5 ]

Date

https://developer.mozilla.org/zh-CN/docs/Web/JavaScript/Reference/Global_Objects/Date

创建一个 JavaScript Date 实例,该实例呈现时间中的某个时刻。Date 对象则基于 Unix Time Stamp,即自1970年1月1日(UTC)起经过的毫秒数。

日期时间

// 当前时间
// let d = new Date(); // Fri Aug 13 2021 20:37:26 GMT+0800 (中国标准时间)

// 指定的日期和时间, 日期字符串格式 ‘月/日/年(4位的年) 时:分:秒’
// let d = new Date('2021-8-8'); // Sun Aug 08 2021 00:00:00 GMT+0800 (中国标准时间)
// let d = new Date('2021/8/8'); // Sun Aug 08 2021 00:00:00 GMT+0800 (中国标准时间)
// let d = new Date('8/8/2021'); // Sun Aug 08 2021 00:00:00 GMT+0800 (中国标准时间)
// let d = new Date('8/8/2021 8:8:8'); // Sun Aug 08 2021 08:08:08 GMT+0800 (中国标准时间)
// console.log(d);

// 获取日期对象的周几,返回0~6,周日~周六
// let d1 = new Date(); // 最新的日期对象
// console.log(d1.getDay());  // 5  周五
// let d2 = new Date('8/8/2018');
// console.log(d2.getDay());  // 3  2018年8月8号是周三
// 返回个数字肯定不太好,比如页面要显示周几或者星期几之类的,就可以巧用数组和索引来处理
// let weekName = ['周日', '周一', '周二', '周三', '周四', '周五', '周六'];
// console.log(weekName[d1.getDay()]); // 周五


// 获取当前的日期
// let d = new Date();
// console.log(d.getDate()); // 13
// 获取当前的月份,返回值有点特殊
// 返回值是 0~11,1月~12月
// console.log(d.getMonth()); // 7
// console.log(d.getMonth() + 1); // 8 当前月份可以手动加一
// 获取四位的年份
// console.log(d.getFullYear()); // 2021
// 获取时/分/秒
// console.log(d.getHours()); // 20  晚上8点
// console.log(d.getMinutes()); // 54  分
// console.log(d.getSeconds()); // 31  秒

let d = new Date();
// 从1970/1/1 00:00:00 到现在经历的秒数
console.log(d.getTime()); // 1628859658254
// 获取当前的时间戳
console.log(Date.now()); // 1628860267198

解构赋值

新语法,将数组或者对象中的元素和变量一一对应:

// 基础用法
// let [a, b, c] = [1, 2, 3];
// console.log(a, b, c); // 1 2 3

// 其他用法
let [a, b, ...c] = [1, 2, 3, 4, 5, 6, 7];
console.log(a, b, c); // 1 2 [ 3, 4, 5, 6, 7 ]

// 交换位置
let arr = ['a', 'b', 'c'];
[arr[0], arr[1]] = [arr[1], arr[0]];
console.log(arr); // [ 'b', 'a', 'c' ]

// 打散数组,解构赋值
function sum(a, b, c) {
    return a + b + c;
}
let arr2 = [1, 2, 3];
console.log(sum(...arr2)); // 6

// 解构赋值在对象中的用法
let obj = {name: '孙悟空', age: 18, gender: "male"};
let {name, age, gender} = obj;
console.log(name, age, gender); // 孙悟空 18 male
posted @ 2022-02-15 11:41  听雨危楼  阅读(74)  评论(0编辑  收藏  举报