原文地址:JavaScript & The spread operator

拓展运算符看起来像什么? 三个点,...

它能做什么? 拓展运算符允许一个表达式在某个地方展开成为多个元素、变量或参数

定义看上去毫无乐趣,下面通过几个例子理解到底什么是拓展运算符。

初识

  • 1、创建一个数组middle
  • 2、创建第二个数组,包含第一个数组
  • 3、输出结果
var middle = [3, 4];
var arr = [1, 2, middle, 5, 6]; console.log( arr );
// [1, 2, [3, 4], 5, 6]

上面没有使用拓展运算符arr在创建的时候把middle插入到arr数组的中间,此时arr数组里面包了一个数组middle

如果我们的目标是两个数组,那上面的做法很不错,但如果我们只想要一个数组呢?

我们可以通过拓展运算符实现。再提一次,拓展运算符允许数组的元素展开。来看下面的代码,除了使用了拓展运算符,代码和上面的没啥区别:

var middle = [3, 4];
var arr = [1, 2, ...middle, 4, 5]; console.log( arr )
// [1, 2, 3, 4, 5, 6]

还记得刚才读到的拓展运算符的定义吗?上面的代码发挥了拓展运算符的作用,正如你看的,我们创建了数组arr,然后对middle使用了拓展运算符,此时,middle数组并没有直接插入到arr中,而是被展开了。middle数组中的每一个元素插入到了arr数组中。此时,arr不再是嵌套数组,而是一个从1到6的简单数组。

1、Slice

slice是JavaScript中数组方法,允许我们拷贝数组。同样,我们可以使用拓展运算符来拷贝数组。

var arr = ['a', 'b', 'c'];
var arr2 = [...arr]; console.log(arr2);
// ['a', 'b', 'c']

瞧,我们成功复制了数组。arr数组中的所有元素都分解成独立的个体,然后分配到arr2数组中。我们现在可以对arr2进行任意修改,都不会影响到源数组arr

上述可以工作的原因是arr的值填充到了arr2定义的方括号中。所以,我们是让arr2的值和arr的值相等,而不是和arr本身相等。下面的不适用拓展运算符的示例更能说明问题。

如果我们简单的创建一个数组,然后让另一个数组和他相等,就像这样:

var arr = ['a', 'b', 'c'];
var arr2 = arr; console.log(arr2);
// ['a', 'b', 'c']

现在你可能会说,这也work了,和上面的结果一样啊。

然后,这只是看起来一样,但是本质是完全不同。我们并没有让arr2的值和arr中每个值相同,而是直接让两个数组相等,这也就意味着任何对arr2的修改都是影响arr

arr2.push('d');

console.log(arr2);
// ['a', 'b', 'c', 'd'] console.log(arr);
// ['a', 'b', 'c', 'd']

正如你亲眼所见,即使没有明确的向源数组arr添加新值,新值d依然会添加到arr中。

2、Concat

使用concat()可以连接数组,使用拓展运算符也能实现。首先看看使用concat()是什么样子:

var arr = ['a', 'b', 'c'];
var arr2 = ['d', 'e', 'f']; arr1 = arr.concat(arr2);
console.log(arr);
// ['a', 'b', 'c', 'd', 'e', 'f']

现在,使用拓展运算符:

var arr = ['a', 'b', 'c'];
var arr2 = ['d', 'e', 'f']; arr = [...arr, ...arr2];
console.log(arr);
// ['a', 'b', 'c', 'd', 'e', 'f']

结果完全相同,每个数组都分解然后加入到新的数组arr中。

注:原文评论中有人指出使用拓展运算符连接数组可能并不高效。在测试中,使用拓展运算符要比concat慢一些。对大数组的处理,使用拓展运算符可能并不理想。

3、Math

Math函数可以与拓展运算符结合使用,我们以Math.max()为例。

简单介绍一下,Math.max()返回一组数字中的最大值。

Math.max();
// -Infinity Math.max(1, 2, 3);
// 3 Math.max(100, 3, 4);
// 100

如果没有拓展运算符,我们也可以借助.apply()通过Math.max()求数组中的最大值:

var arr = [2, 4, 8, 6, 0];

function max(arr) {
return Math.max.apply(null, arr);
} console.log(max(arr));
// 8

这是让人讨厌的实现。

现在,我们来看通过拓展运算符如何实现。代码更加简洁:

var arr = [2, 4, 8, 6, 0];
var max = Math.max(...arr); console.log(max);
// 8

4、String to Array

将字符串转成数组有很多种方法,比如slicesplit等,使用拓展运算符会更加简单:

var str = "hello";
var chars = [...str]; console.log(chars);
// ['h', 'e',' l',' l', 'o']

很酷吧,拓展运算符会遍历str中的每个字符,然后分配到chars新数组中。

通过四个例子理解JavaScript拓展运算符的更多相关文章

  1. 最简单的例子理解Javascript闭包

    理解Javascript的闭包非常关键,本篇试图用最简单的例子理解此概念. function greet(sth){ return function(name){ console.log(sth + ...

  2. 深入理解javascript作用域系列第四篇——块作用域

    × 目录 [1]let [2]const [3]try 前面的话 尽管函数作用域是最常见的作用域单元,也是现行大多数javascript最普遍的设计方法,但其他类型的作用域单元也是存在的,并且通过使用 ...

  3. 深入理解javascript作用域系列第四篇

    前面的话 尽管函数作用域是最常见的作用域单元,也是现行大多数javascript最普遍的设计方法,但其他类型的作用域单元也是存在的,并且通过使用其他类型的作用域单元甚至可以实现维护起来更加优秀.简洁的 ...

  4. 深入理解javascript原型和闭包(1)——一切都是对象

    “一切都是对象”这句话的重点在于如何去理解“对象”这个概念. ——当然,也不是所有的都是对象,值类型就不是对象. 首先咱们还是先看看javascript中一个常用的函数——typeof().typeo ...

  5. 深入理解JavaScript中创建对象模式的演变(原型)

    深入理解JavaScript中创建对象模式的演变(原型) 创建对象的模式多种多样,但是各种模式又有怎样的利弊呢?有没有一种最为完美的模式呢?下面我将就以下几个方面来分析创建对象的几种模式: Objec ...

  6. 理解Javascript的动态语言特性

    原文:理解Javascript的动态语言特性 理解Javascript的动态语言特性 Javascript是一种解释性语言,而并非编译性,它不能编译成二进制文件. 理解动态执行与闭包的概念 动态执行: ...

  7. JavaScript 扩展运算符

    扩展运算符格式扩展运算符格式很简单,就是三个点(...) 扩展运算符作用???扩展运算符允许一个表达式在期望多个参数(用于函数调用)或多个元素(用于数组字面量)或多个变量(用于解构赋值)的位置扩展. ...

  8. 深入理解JavaScript系列(15):函数(Functions)

    介绍 本章节我们要着重介绍的是一个非常常见的ECMAScript对象——函数(function),我们将详细讲解一下各种类型的函数是如何影响上下文的变量对象以及每个函数的作用域链都包含什么,以及回答诸 ...

  9. 深入理解JavaScript系列(13):This? Yes,this!

    介绍 在这篇文章里,我们将讨论跟执行上下文直接相关的更多细节.讨论的主题就是this关键字.实践证明,这个主题很难,在不同执行上下文中this的确定经常会发生问题. 许多程序员习惯的认为,在程序语言中 ...

随机推荐

  1. Android简介(一)

    Android构架 Android的系统架构和其操作系统一样,采用了分层的架构.从架构图看,android分为四个层,从高层到低层分别是应用程序层.应用架构层.系统运行库层和Linux核心层. 1. ...

  2. 国寿e店/人寿云参会云助理,不去公司就能刷脸考勤打卡?

    自从2017年3月平安保险公司实行E行销打卡考勤以来,保险增员迅猛增加,保险业绩也随之水涨船高.年底开始中国人寿保险也陆续开始实行app考勤,有些需要连接公司指定WiFi,或在指定地点方可打卡考勤.不 ...

  3. Tomcat软件使用常见问题

    Tomcat软件使用常见问题 tomcat软件使用的常见问题 1)闪退问题 原因:tomcat软件是java语言开发的. tomcat软件启动时,会默认到系统的环境变量中查找一个名称叫JAVA_HOM ...

  4. PHP实现伪静态方法汇总

    PHP伪静态的使用主要是为了隐藏传递的参数名,下面给大家介绍php实现伪静态的方法,对php实现伪静态相关知识感兴趣的朋友一起学习吧 PHP伪静态的使用主要是为了隐藏传递的参数名,下面给大家介绍php ...

  5. ThinkPhp_5框架开发【指导】

    ================================================== ThinkPhp_5环境安装指导 -------------------------------- ...

  6. SQLITE3 使用总结(3~5)(转)

    3 不使用回调查询数据库/ `- ^# T6 ?, F: H* m2 ~# ~上 面介绍的 sqlite3_exec 是使用回调来执行 select 操作.还有一个方法可以直接查询而不需要回调.但是, ...

  7. Hadoop集群的JobHistoryServer详解(转载)

    Hadoop自带了一个历史服务器,可以通过历史服务器查看已经运行完的Mapreduce作业记录,比如用了多少个Map.用了多少个Reduce.作业提交时间.作业启动时间.作业完成时间等信息.默认情况下 ...

  8. Python3.6.1的安装

    Python 3.61的下载和安装,下载地址:https://www.python.org/downloads/ 选择最近的版本,目前为Python3.6.1,下载后直接安装即可 下载包为: 双击安装 ...

  9. Spring+redis整合遇到的问题集以及注意事项

    redis是一个key-value存储系统.和Memcached类似,它支持存储的value类型相对更多,包括string(字符串).list(链表).set(集合).zset(sorted set ...

  10. linux 中 ping的回传值

      今天在学习鸟哥私房菜的过程中,不明白ping的回传值是怎么设置的,后来网上找的结果了,特此记录一下 1 题目大意是指,ping一个网段的机器,如果可以通,就显示UP,如果不通就显示Down,其中一 ...