ES6系列_4之扩展运算符和rest运算符

运算符可以很好的为我们解决参数和对象数组未知情况下的编程,让我们的代码更健壮和简洁。

运算符有两种:对象扩展运算符与rest运算符。

1.对象扩展( spread)运算符(...)

(1)解决参数个数问题

以前我们编程是传递的参数一般是确定,否则将会报错或者异常,如下:

function test(a,b,c,d) {
    console.log(a)
    console.log(b)
    console.log(c)
    console.log(d)
    console.log(e)//e is not defined
}

test(1,2,3,4)

参数固定,多余的参数会出错。

但我们又想传递多个参数,但是不确定参数的个数,这时候可以使用对象扩展运算符来作参数。

function test1(...arg) {
    console.log(arg[0]);//1
    console.log(arg[1]);//2
    console.log(arg[2]);//3
    console.log(arg[3])//4
    console.log(arg[4])//5
    console.log(arg[5])//undefined
}

test1(1,2,3,4,5)

这时候程序是不会报错的,多余取值返回的结果是undefined。这说明是可以传入多个值,并且就算方法中引用多了也不会报错。

(2)解决数组赋值问题

我们先用一个例子说明,我们声明两个数组arr1和arr2,然后我们把arr1赋值给arr2,然后我们改变arr2的值,你会发现arr1的值也改变了,因为我们这是对内存堆栈的引用,而不是真正的赋值。

let arr1=[‘i‘,‘love‘,‘you‘];
let arr2=arr1;
console.log("arr2====",arr2);
arr2.push(‘too‘);
console.log("arr1====>",arr1);

控制台输出的结果为:

 ["i", "love", "you"]

 ["i", "love", "you", "too"]

这是我们不想看到的,可以利用对象扩展运算符简单的解决这个问题,现在我们对代码进行改造。

let arr1=[‘i‘,‘love‘,‘you‘];
let arr2=[...arr1];
console.log(arr2);
arr2.push(‘too‘);
console.log(arr1);

最终可以看到我们的arr1并没有改变,简单的扩展运算符就解决了这个问题。

2.rest运算符

(1)含义

rest参数作用: 将多余的逗号分隔的参数序列转换为数组参数

注意: rest参数必须是最后一个参数,否则报错。

rest运算符与对象扩展运算符有很多类似之处,它也用…(三个点)来表示,比如:

function test(first,...arg){
  console.log("first==>",first)//0
  console.log("arg=====>",arg)
}
test(0,1,2,3,4,5,6,7);

输出结果为:

first==> 0
arg=====>[1, 2, 3, 4, 5, 6, 7]

 (2)如何循环输出rest运算符

用for…of循环来进行打印出arg的值

function test(first,...arg){
   for(let val of arg){
       console.log(val)
   }
}
test(0,1,2,3,4,5,6,7);

结果为:1,2,3,4,5,6,7

最后总结:

扩展运算符用三个点号表示,功能是把数组或类数组对象展开成一系列用逗号隔开的值
rest运算符也是三个点号,不过其功能与扩展运算符恰好相反,把逗号隔开的值序列组合成一个数组
当三个点(...)在等号左边,或者放在形参上。为 rest 运算符
当三个在等号右边,或者放在实参上,是 spread运算符

或者说:放在被赋值一方是rest 运算符。放在赋值一方式 spread运算符。

原文地址:https://www.cnblogs.com/bfwbfw/p/10052202.html

时间: 2024-08-29 18:43:56

ES6系列_4之扩展运算符和rest运算符的相关文章

ES6 入门系列 - 函数的扩展

1函数参数的默认值 基本用法 在ES6之前,不能直接为函数的参数指定默认值,只能采用变通的方法. function log(x, y) { y = y || 'World'; console.log(x, y); } log('Hello') // Hello World log('Hello', 'China') // Hello China log('Hello', '') // Hello World 上面代码检查函数log的参数y有没有赋值,如果没有,则指定默认值为World.这种写法的

[js高手之路] es6系列教程 - 迭代器,生成器,for...of,entries,values,keys等详解

接着上文[js高手之路] es6系列教程 - 迭代器与生成器详解继续. 在es6中引入了一个新的循环结构for ....of, 主要是用来循环可迭代的对象,那么什么是可迭代的对象呢? 可迭代的对象一般都有Symbol.iterator属性,你可以在控制台中用console.dir打印数组,Map,Set,在他们的原型对象(prototype)上面就能找到.这个属性与迭代器密切相关,通过该函数可以返回一个迭代器,下文,我会举一个例子.一般来说所有的集合对象(数组,Set,Map 以及字符串)都是可

[ES6系列-04]再也不乱“哇”了:用 let 与 const 替代 var

[原创]码路工人 Coder-Power 大家好,这里是码路工人有力量,我是码路工人,你们是力量. github-pages 博客园cnblogs 今天的内容是,关于 JavaScript 中定义变量的变化(其实不确切,函数,常量表示被冷落). 首先,回顾下 var 定义存在的问题 1. 哇..var 好乱.. 1.1 可以重复定义 /* eg.0 * multi-definition of var-variable */ //----------------------------------

【ES6】对象的扩展

Object.setPrototypeOf(obj, proto) Object.getPrototypeOf(obj) Object.getOwnPropertyDescriptor(obj,property) 获取该属性的描述对象.描述对象的enumerable属性,称为“可枚举性”,如果该属性为false,下列操作会忽略当前属性 for...in循环:只遍历对象自身的和继承的可枚举的属性. Object.keys():返回对象自身的所有可枚举的属性的键名. JSON.stringify()

ES6对数组的扩展

ECMAScript6对数组进行了扩展,为数组Array构造函数添加了from().of()等静态方法,也为数组实例添加了find().findIndex()等方法.下面一起来看一下这些方法的用法. Array.from() Array.from()将类数组(array-like)对象与可遍历的对象转化为数组并返回.例如将dom节点集合转化为数组,以前我们可能都会这样写: var divs = document.querySelectAll("div"); [].slice.call(

es6 字符串String的扩展

ES6给字符串带来了很多实用性的扩展:模板字符串,标签模板,repeat函数.includes函数,startsWith函数,endsWith函数,codePointAt函数,String.fromCodePoint函数,String.raw函数. es6 字符串String的扩展:http://www.cnblogs.com/whybxy/p/7274461.html

ES6 系列之异步处理实战

前言 我们以查找指定目录下的最大文件为例,感受从 回调函数 -> Promise -> Generator -> Async 异步处理方式的改变. API 介绍 为了实现这个功能,我们需要用到几个 Nodejs 的 API,所以我们来简单介绍一下. fs.readdir readdir 方法用于读取目录,返回一个包含文件和目录的数组. fs.stat stat 方法的参数是一个文件或目录,它产生一个对象,该对象包含了该文件或目录的具体信息.此外,该对象还有一个 isFile() 方法可以

Swift之需要注意的基本运算符和高级运算符

在去年翻译<Swift编程入门经典>(Swift1.0版本,基于Xcode6)这本书时,系统的搞了搞Swift语言,接下来的一段时间内打算持续更新一下相关Swift语言的一些东西, 不过现在已经是Swift2.0版本了,区别还是不小的.并且目前在工作中正重构着整个项目的代码,之后根据一些项目实例再更新一些关于代码重构的博客与大家交流一下,然后再整理一些Android开发的一些东西吧,当然是类比着iOS开发了. 废话少说,开始今天博客的主题.有些小伙伴看到今天的博客Title可能会笑到,基本运算

Java的算数运算符、关系运算符、逻辑运算符、位运算符

Java的运算符,分为四类:                           算数运算符.关系运算符.逻辑运算符.位运算符.                           算数运算符:+  -  *  /  %  ++  --                           关系运算符:==  !=  >  >=  <  <=                           逻辑运算符:&&  ||  !  ^  &  |