原文地址: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. webpack的安装与使用

    在安装 Webpack 前,你本地环境必须已安装nodejs. 可以使用npm安装,当然由于 npm 安装速度慢,也可以使用淘宝的镜像及其命令 cnpm,安装使用介绍参照:使用淘宝 NPM 镜像. 使 ...

  2. Tomcat学习笔记(二)—— 一个简单的Servlet容器

    1.简介:Servlet编程是通过javax.Servlet和javax.servlet.http这两个包的类和接口实现的,其中javax.servlet.Servlet接口至关重要,所有的Servl ...

  3. HTTPS和HTTP的区别是什么?

    广泛应用于互联网世界的HTTP想必是大家再熟悉不过的了,然而细心的朋友可能发现淘宝.百度.网上银行等网站都变成HTTPS开头,并且还有一把小绿锁挂在地址栏,那么HTTPS和HTTP的区别是什么呢? 一 ...

  4. 安装Wamp后 Apache无法启动的解决方法

    安装Wamp后 Apache无法启动的解决方法,网上的解决方案可以说是五花八门,有些说了一大推,一点作用都起不到. 其实解决方法只需两步: 1.安装路径不能包含有中文,这个我不知道为什么,总之如果安装 ...

  5. PHP 常用的header头部定义汇总

    http://www.jb51.net/article/68159.htm

  6. VIM命令模式与输入模式切换

     vi编辑器 vi是UNIX和类UNIX环境下的可用于创建文件的屏幕编辑器.vi有两种工作模式:命令模式和文本输入模式.启动vi需要输入vi,按[Spacebar]键并输入文件名后回车. 切换模式键 ...

  7. 高级设置电脑系统windows7防火墙出错代码0×6D9原因与解决技巧

    高级设置windows防火墙能够更好的保护电脑系统安全,在电脑系统windows7设置过程中难免会遇到某些问题,有用户在安装MRGT后想要打开SNMP的161端口,但在打开高级安全windows防火墙 ...

  8. 数据库复习总结(16)-case关键字(数据透视)

    case语法: 练习1:将性别的0.1显示为男.女 select * from StudentInfo --case:对结果集中的列进行判断 --例1:显示学生信息,性别以"男女" ...

  9. ios开发 第三天

    1.复合 对象可以引用其它对象,可以利用其它对象提供的特性. 通过包含作为实例变量的对象指针实现的. 2.OC是单一继承 3.继承-重构 4.类实例化对象时,self指向了对象的首地址. 类对象isa ...

  10. Hadoop问题:apt-get install docker-engine -> Depends: init-system-helpers (>= 1.18~) but 1.14 is to be installed

    问题描述:$ apt-get install docker-engine -> Depends: init-system-helpers (>= 1.18~) but 1.14 is to ...