理解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. 利用VGG19实现火灾分类(附tensorflow代码及训练集)

    源码地址 https://github.com/stephen-v/tensorflow_vgg_classify 1. VGG介绍 1.1. VGG模型结构 1.2. VGG19架构 2. 用Ten ...

  2. 【转】Java中用单例模式有什么好处

    Java Singleton模式主要作用是保证在Java应用程序中,一个类Class只有一个实例存在. 使用Singleton的好处还在于可以节省内存,因为它限制了实例的个数,有利于Java垃圾回收( ...

  3. nginx使用replace-filter-nginx-module实现内容替换

    有时候我们想对响应(例如PHP接口)返回的内容做些字符串,虽然可以使用各语言代码相关方法(例如PHP的str_replace)进行替换,但是在nginx层面替换是更方便的,无需修改代码. 约定:本文源 ...

  4. Oracle11g静默安装

    静默安装Oracle11G 前期准备 1虚拟机准备: Centos 6.5 64位 内存2G 硬盘30G Cpu 4核 Hostname silent 将安装包放到/tmp/oracle目录下 2.软 ...

  5. Django的分页器(paginator)

    先导入模块: from django.core.paginator import Paginator, EmptyPage, PageNotAnInteger 分页器paginator 下面的所有方法 ...

  6. springMVC+commons-fileupload上传文件大小限制异常

    异常信息: 严重: Servlet.service() for servlet [suibian] in context with path [/SpringMvcDemo3] threw excep ...

  7. Python的集合

    1. Python的集合 1.1 集合的定义 在Python中, 集合set是基本数据类型的一种集合类型,它有可变集合(set())和不可变集合(frozenset)两种.Python中的集合set类 ...

  8. 企业级Tomcat安全管理优化方案

    telnet管理端口保护 1. 修改默认的8005管理端口为不易猜测的端口(大于1024): <Server port=" shutdown="dangerous" ...

  9. day5、文件乱码怎么解决

    1.1 Linux下,如何将一个乱码的文件进行重命名 方法一: 命令格式:mv $(ls   |egrep "[^a-zA-Z0-9.-]") tandao.tx [root@nb ...

  10. Effective Java 第三版——3. 使用私有构造方法或枚类实现Singleton属性

    Tips <Effective Java, Third Edition>一书英文版已经出版,这本书的第二版想必很多人都读过,号称Java四大名著之一,不过第二版2009年出版,到现在已经将 ...