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

运算符有两种:对象扩展运算符与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运算符。

最新文章

  1. gdb可以调试python的pdb么
  2. java的继承
  3. 爱上MVC~在Views的多级文件夹
  4. 什么是web框架?
  5. Binder相关
  6. 团队开发——Alpha版总结会议
  7. iphone 6 设置自定义铃声(未越狱)
  8. ExcelUtils 导表实例
  9. JavaScript的语法要点 4 - 面向对象的基础
  10. PyQt4学习记录之事件和信号
  11. [置顶] mysql中的set和enum类型的用法和区别
  12. window.onscroll
  13. 重构 ORM 中的 Sql 生成
  14. 十二个 ASP.NET Core 例子——1.1版本 EF MySql快速搭建
  15. CodeIgniter怎么引入公共的头部或者尾部文件(实现随意引入或分区域创建header.html,bodyer.html,footer.html)
  16. A1124. Raffle for Weibo Followers
  17. js 显示刚刚上传的图片 (onchange事件)
  18. java并发编程基础-ReentrantLock及LinkedBlockingQueue源码分析
  19. elasticsearch报错之 memory locking requested for elasticsearch process but memory is not locked
  20. JavaScript进阶系列02,函数作为参数以及在数组中的应用

热门文章

  1. MQ选型对比RabbitMQ RocketMQ ActiveMQ Kafka
  2. 远程使用tomcat8的首页的管理工具
  3. hdu4965矩阵快速幂
  4. centos7(debian,manjora,freebsd)命令及安装mysql、git、gpg、gogs,安装docker,zsh,chrome
  5. [转]PowerDesigner 把Comment写到name中 和把name写到Comment中 pd7以后版本可用
  6. IAR使用notice
  7. java.io.File中的 pathSeparator 与separator 的区别
  8. L175 Endorestiform Nucleus: Scientist Just Discovered a New Part of the Human Brain
  9. New Concept English Two 25 67
  10. 回测框架pybacktest简介(一)