javascript ES6 新特性之 扩展运算符 三个点 ...

对于 ES6 新特性中的 ... 可以简单的理解为下面一句话就可以了:

对象中的扩展运算符(...)用于取出参数对象中的所有可遍历属性,拷贝到当前对象之中。

作用类似于 Object.assign() 方法,我们先来看一下 Object.assign() 方法:

Object.assign() 方法用于将所有可枚举属性的值从一个或多个源对象复制到目标对象。它将返回目标对象。如下:

const target = { a: 1, b: 2 };
const source = { b: 4, c: 5 };
const returnedTarget = Object.assign(target, source);

console.log(target); // { a: 1, b: 4, c: 5 }
console.log(returnedTarget); // { a: 1, b: 4, c: 5 }

语法

Object.assign(target, ...sources)

参数: target(目标对象), sources(源对象)

返回值: 目标对象。

Object.assign() 方法中如果有相同的对象属性前面的会被后面的替换掉。

接下来我们看一个最简单的例子:

let bar = { a: 1, b: 2 };let baz = { ...bar };console.log(baz); // { a: 1, b: 2 }

从上面可以看出 ... 扩展运算符就是将一个参数对象整体遍历再拷贝到当前对象中,再看下面的例子:

let bar = {a: 1, b: 2};let baz = {...bar, ...{a: 2, b: 4}};console.log(bar); // { a: 1, b: 2 }console.log(baz); // { a: 2, b: 4 }

... 扩展运算符如果有想用的对象属性,那么后者会将前者覆盖掉。同时我们也可以看出这是一个浅拷贝,并不会将源对象更改掉。

但是如果是如下代码:

let obj1 = { a: 1, b: {name: ‘aaa‘}};let obj2 = { ...obj1};obj2.a = 2;obj2.b.name = ‘bbb‘;console.log(obj1); // {a: 1, b: {name: ‘bbb‘}}console.log(obj2); // {a: 2, b: {name: ‘bbb‘}}

从上面我们班可以看出,当 obj2 的 a 属性改变时,obj1 内的 a 属性不会跟着改变,但是当 obj2 的 b 属性改变时,obj1 内的 b 属性会跟着改变,这是由于 obj1 的 b 属性是引用数据类型,拷贝的时候拷贝的是对象的引用,但是基础数据类型会完整的复制出一份来。

扩展运算符也可以对数组进行运算,因为数组也属于对象的一种,如下:

var foo = function(a, b, c) {
    console.log(a);
    console.log(b);
    console.log(c);
}

var arr = [1, 2, 3];

//传统写法
foo(arr[0], arr[1], arr[2]);

//使用扩展运算符
foo(...arr);
//1
//2
//3

从上面的代码可以看出 ... 扩展运算符可以简化我们的代码。

我们再来看下面的代码:

let arr1 = [1, 2];
let arr2 = arr1;
arr2[0] = 2;
console.log(arr1); // [2, 2]

上面我们已经解释过了,arr2 其实是 arr1 的引用,如果改变 arr2 那么 arr1 也会跟着改变,但是我们不想让 arr1 跟着改变怎么办呢?用 ... 扩展运算符就不会了:

let arr1 = [1, 2];
let arr2 = [...arr1];
arr2[0] = 2;
console.log(arr1);  // [1, 2]

上面我们已经说过了,基础数据类型会重新完整的拷贝除一份来,这就完美的解决了上面的问题。

扩展运算符还可以将字符串转为数组,如下:

let str = "hello";
let arr = [...str];
console.log(arr); // [ ‘h‘, ‘e‘, ‘l‘, ‘l‘, ‘o‘ ]

注意:

如果将扩展运算符用于数组赋值,只能放在参数的最后一位,否则会报错。

如下:

let [first, ...rest] = [1, 2, 3, 4, 5];
console.log(first); // 1
console.log(rest);  // [2, 3, 4, 5]
let [...first, last] = [1, 2, 3, 4, 5];
console.log(first); // 报错 Rest element must be last element
console.log(last);
let [first, ...rest, last] = [1, 2, 3, 4, 5];
console.log(first); // 报错 Rest element must be last element
console.log(rest);
console.log(last);

原文地址:https://www.cnblogs.com/weijiutao/p/10636084.html

时间: 2024-12-16 05:20:07

javascript ES6 新特性之 扩展运算符 三个点 ...的相关文章

ES6新特性使用小结(三)

九.数据类型 Symbol /* * Symbol 数据类型 概念: Symbol 提供一个独一无二的值 * */ { let a1 = Symbol(); let a2 = Symbol(); console.log(a1===a2,a1,a2); //false let a3 = Symbol.for('a3'); //*Symbol.for 会检查window下是否存在 'a3' let a4 = Symbol.for('a3'); console.log(a3===a4); //true

javascript ES6 新特性之 let

let的作用是声明变量,和var差不多. let是ES6提出的,在了解let之前,最好先熟悉var的原理. JavaScript有一个机制叫“预解析”,也可以叫“提升(Hoisting)机制”.很多刚接触JavaScript的人都会被这个机制弄混.比如: // var 的情况 console.log(a); // 输出undefined var a = 2; 在预编译阶段,JavaScript引擎会将上面的a函数修改成下面的写法: var a; //声明且初始化为undefined consol

javascript ES6 新特性之 解构

解构的作用是可以快速取得数组或对象当中的元素或属性,而无需使用arr[x]或者obj[key]等传统方式进行赋值 var arr = [1, 2, 3]; //传统方式 var a = arr[0], b = arr[1], c = arr[2]; console.log(a, b, c); // 1 2 3 //解构方式 var [a, b, c] = arr; console.log(a, b, c); // 1 2 3 从上面的例子我们可以看出,要想获取一个数组中的值,我们可以利用传统的索

JavaScript学习--Item24 ES6新特性概览

ES6新特性概览 本文基于lukehoban/es6features ,同时参考了大量博客资料,具体见文末引用. ES6(ECMAScript 6)是即将到来的新版本JavaScript语言的标准,代号harmony(和谐之意,显然没有跟上我国的步伐,我们已经进入中国梦版本了).上一次标准的制订还是2009年出台的ES5.目前ES6的标准化工作正在进行中,预计会在14年12月份放出正式敲定的版本.但大部分标准已经就绪,且各浏览器对ES6的支持也正在实现中.要查看ES6的支持情况请点此. 目前想要

ES6新特性三: Generator(生成器)函数详解

本文实例讲述了ES6新特性三: Generator(生成器)函数.分享给大家供大家参考,具体如下: 1. 简介 ① 理解:可以把它理解成一个函数的内部状态的遍历器,每调用一次,函数的内部状态发生一次改变. ② 写法: function* f() {} ③ 作用:就是可以完全控制函数的内部状态的变化,依次遍历这些状态. ④ 运行过程:当调用Generator函数的时候,该函数并不执行,而是返回一个遍历器(可以理解成暂停执行).通过调用next()开始执行,遇到yield停止执行,返回一个value

34.JS 开发者必须知道的十个 ES6 新特性

JS 开发者必须知道的十个 ES6 新特性 这是为忙碌的开发者准备的ES6中最棒的十个特性(无特定顺序): 默认参数 模版表达式 多行字符串 拆包表达式 改进的对象表达式 箭头函数 =&> Promise 块级作用域的let和const 类 模块化 注意:这个列表十分主观并且带有偏见,其他未上榜的特性并不是因为没有作用,我这么做只是单纯的希望将这份列表中的项目保持在十个. 首先,一个简单的JavaScript时间线,不了解历史的人也无法创造历史. 1995年:JavaScript以LiveS

前端入门21-JavaScript的ES6新特性

声明 本篇内容全部摘自阮一峰的:ECMAScript 6 入门 阮一峰的这本书,我个人觉得写得挺好的,不管是描述方面,还是例子,都讲得挺通俗易懂,每个新特性基本都还会跟 ES5 旧标准做比较,说明为什么会有这个新特性,这更于理解. 所以,后续不会再写个关于 ES6 系列的文章了,就在这篇里大概的列举一下,大体清楚都有哪些新特性就好了,以后需要用时再去翻一翻阮一峰的书. 正文-ES6新特性 ES6 新标准规范相比于 ES5 旧标准规范中,无非就三个方面的改动:新增.更新.废弃. 由于更新和废弃需要

ES6新特性

ES6新特性概览 箭头操作符 如果你会C#或者Java,你肯定知道lambda表达式,ES6中新增的箭头操作符=>便有异曲同工之妙.它简化了函数的书写.操作符左边为输入的参数,而右边则是进行的操作以及返回的值Inputs=>outputs. 我们知道在JS中回调是经常的事,而一般回调又以匿名函数的形式出现,每次都需要写一个function,甚是繁琐.当引入箭头操作符后可以方便地写回调了.请看下面的例子. var array = [1, 2, 3]; //传统写法 array.forEach(f

iOS 8新特性之扩展(Extension)

本文由海水的味道收集整理,欢迎转载 当前版本 0.0.1  iOS 8新特性之扩展 一.扩展概述 扩展(Extension)是iOS 8中引入的一个非常重要的新特性.扩展让app之间的数据交互成为可能.用户可以在app中使用其他应用提供的功能,而无需离开当前的应用. 在iOS 8系统之前,每一个app在物理上都是彼此独立的,app之间不能互访彼此的私有数据. 而在引入扩展之后,其他app可以与扩展进行数据交换.基于安全和性能的考虑,每一个扩展运行在一个单独的进程中,它拥有自己的bundle, b