理解spread运算符与rest参数

spread运算符与rest参数 是ES6的新语法。
它们的作用是什么?能做什么事情?

1. rest运算符用于获取函数调用时传入的参数。

function testFunc(...args) {
console.log(args); // ['aa', 'bb', 'cc']
console.log(args.length); //
}
// 调用函数
testFunc('aa', 'bb', 'cc');

2. spread运算符用于数组的构造,析构,以及在函数调用时使用数组填充参数列表。

let arrs1 = ['aa', 'bb'];
let arrs2 = ['cc', 'dd']; // 合并数组
let arrs = [...arrs1, ...arrs2];
console.log(arrs); // ['aa', 'bb', 'cc', 'dd'] // 析构数组
let param1, param2;
[param1, ...param2] = arrs1; console.log(param1); // aa
console.log(param2); // ['bb']

3. 类数组的对象转变成数组。

比如我们常见的是arguments对象,它是类数组,它有长度属性,但是没有数组的方法,比如如下代码:

function testFunc() {
console.log(arguments); // ['a', 'b']
console.log(typeof arguments); // object
console.log(arguments.length); //
console.log(arguments.push('aa')); // 报错 arguments.push is not a function
};
// 函数调用
testFunc('a', 'b');

把类数组对象转换成数组,代码如下:

function testFunc() {
// 转换成数组
var toArray = [...arguments];
console.log(toArray); // ['a', 'b']
toArray.push('11'); // ['a', 'b', '11']
console.log(toArray);
};
// 函数调用
testFunc('a', 'b');

4. 数组的深度拷贝
浅拷贝如下demo:

var arr1 = [1, 2];
var arr2 = arr1;
arr1.push(3);
console.log(arr1); // [1, 2, 3]
console.log(arr2); // [1, 2, 3]

如上代码,arr1是一个数组有2个值 [1, 2], 然后把 arr1 赋值个 arr2, 接着往arr1中添加一个元素3,然后就会影响arr2中的数组。
因为我们知道浅拷贝是:拷贝的是该对象的引用,所以引用值改变,其他值也会跟着改变。
所以引用值也跟着改变。

深度拷贝对象如下代码:

var arr1 = [1, 2];
var arr2 = [...arr1];
arr1.push(3);
console.log(arr1); // [1, 2, 3]
console.log(arr2); // [1, 2]

5. 字符串转数组
如下代码:

var str = 'kongzhi';
var arr = [...str];
console.log(arr); // ["k", "o", "n", "g", "z", "h", "i"]

如果一个函数最后一个形参以 ...为前缀的,则在函数调用时候,该形参会成为一个数组,数组中的元素都是传递给这个函数多出来的实参的值。
比如如下代码:

function test(a, ...b) {
console.log(a); //
console.log(b); // ['22', '33']
}
test('11', '22', '33');

6. 解构赋值
解构赋值允许你使用类似数组或对象字面量的语法将数组和对象的属性赋给各种变量。

// 解构数组
var arr = ['aa', 'bb', 'cc'];
let [a1, a2, a3] = arr;
console.log(a1); // aa
console.log(a2); // bb
console.log(a3); // cc // 对象解构
var o = {a: 1, b: 2};
var {a, b} = o;
console.log(a); //
console.log(b); //

7. 交换变量

var a = 1, b = 2;
[a, b] = [b, a];
console.log(a); //
console.log(b); //

8. 从函数中返回多个值

function test() {
return {
aa: 1,
bb: 2
}
}
let { aa, bb } = test();
console.log(aa); //
console.log(bb); //

理解spread运算符与rest参数的更多相关文章

  1. 如何理解javaSript中函数的参数是按值传递

    本文是我基于红宝书<Javascript高级程序设计>中的第四章,4.1.3传递参数小节P70,进一步理解javaSript中函数的参数,当传递的参数是对象时的传递方式. (结合资料的个人 ...

  2. java 重写你可以这么理解 因为 方法名和参数类型个数相同 所以这就是重写了 然后 因为是重写 所以 返回值必须相同

    java  重写你可以这么理解    因为   方法名和参数类型个数相同  所以这就是重写了    然后  因为是重写  所以  返回值必须相同

  3. 理解 Linux backlog/somaxconn 内核参数

    https://jaminzhang.github.io/linux/understand-Linux-backlog-and-somaxconn-kernel-arguments/ 各参数的含义:h ...

  4. 深入理解python中函数传递参数是值传递还是引用传递

    深入理解python中函数传递参数是值传递还是引用传递 目前网络上大部分博客的结论都是这样的: Python不允许程序员选择采用传值还是传 引用.Python参数传递采用的肯定是"传对象引用 ...

  5. 深入理解new运算符

    在 JavaScript 中,new 运算符创建一个用户定义的对象类型的实例或具有构造函数的内置对象的实例.创建一个对象很简单,为什么我们还要多此一举使用 new 运算符呢?它到底有什么样的魔力? 认 ...

  6. ES6躬行记(2)——扩展运算符和剩余参数

    扩展运算符(Spread Operator)和剩余参数(Rest Parameter)的写法相同,都是在变量或字面量之前加三个点(...),并且只能用于包含Symbol.iterator属性的可迭代对 ...

  7. 理解 Python 中的可变参数 *args 和 **kwargs:

    默认参数:  Python是支持可变参数的,最简单的方法莫过于使用默认参数,例如: def getSum(x,y=5): print "x:", x print "y:& ...

  8. C++笔记(1)----此运算符函数的参数太多

    在VS2015中定义了这样一个类: #include<iostream> #include<vector> #include<string> using names ...

  9. 基于TensorFlow理解CNN中的padding参数

    1 TensorFlow中用到padding的地方 在TensorFlow中用到padding的地方主要有tf.nn.conv2d(),tf.nn.max_pool(),tf.nn.avg_pool( ...

随机推荐

  1. IdentityServer4(10)- 添加对外部认证的支持之QQ登录

    前言 前面我们提到过IdentityServer4是可以添加外部认证的,如果外部认证支持OAuth2,那么添加到IdentityServer4是非常简单的,在ASP.NET Core下提供了非常多的外 ...

  2. python常用数据结构

    0. 字典初始化 d = {'a':1,'b':2} 或 d={} d['a'] = 1 d['b'] = 2 是不是和json格式数据很相似,语法和JavaScript又很相似 1. 变量接受序列分 ...

  3. 学习爬虫的day03 (通过代理去爬去数据)

    代理的IP通过去网上找# -*- coding: utf-8 -*- import re import _thread from time import sleep, ctime from urlli ...

  4. Foundation框架中日期的操作

    #import <Foundation/Foundation.h> int main(int argc, const char * argv[]) { NSDate *date1=[NSD ...

  5. windows 下更新 npm 和 node

    原文链接 公司的新项目要启动了,需要使用 Angular 4.0,并且使用 webpack 工具进行打包.所以就需要安装 node.node 的安装很简单,在 node 的官网 nodejs.org  ...

  6. Makefile中的变量和shell变量

    我们在写makefile时 多多少少会用到shell脚本, 对于变量的在shell中的使用有一些要注意的细节.让我们从一个简单的makefile来看看. 注意makefile中一定要有一个目标,且一定 ...

  7. PHP通过ZABBIX API获取主机信息 VS 直接从数据库获取主机信息

    最近项目需要获取linux主机的一些信息,如CPU使用率,内存使用情况等.由于我们本身就装了zabbix系统,所以我只用知道如何获取信息即可,总结有两种方法可以获取. 一.通过ZABBIX API获取 ...

  8. 利用InfluxDB和Grafana搭建数据监测的仪表盘

    InfluxDB的介绍及安装 InfluxDB是支持持续写入的时序数据库,常用于监测系统所需要的数据的存储. 官网的详细安装步骤 https://docs.influxdata.com/influxd ...

  9. iOS中常见的锁

    多线程的安全隐患 一块资源可能会被多个线程共享,也就是说多个线程可能会访问同一块资源. 比如多个线程同时操作同一个对象,同一个变量. 当多个线程访问同一块资源时,很容易引发数据错乱和数据安全问题. 比 ...

  10. 网页设计——7.css的入门

    css的介绍 div+css的设计: 什么是div? 理解示意图: 实例操作: 这里就要用到div+css的布局操作 先写一个html文件,见下图: <html><head>& ...