(...)这三个点在JavaScript中意味着什么?

更新日期: 2018-08-29阅读: 6.4k标签: js知识

这篇文章的标题来自我在Quora上被要求回答的一个问题。下面是我试图解释JavaScript中三个点的作用。希望这对于将来有相同问题的人来说可以消除围绕这个概念的迷雾。


数组/对象扩展运算符

假设您有以下对象:

const adrian = {
  fullName: 'Adrian Oprea',
  occupation: 'Software developer',
  age: 31,
  website: 'https://oprea.rocks'
};

假设您要创建一个具有不同名称和网站但具有相同职业和年龄的新对象(人)。

您可以通过仅指定所需的属性来执行此操作,并使用扩展运算符来完成其余操作,如下所示:

const bill = {
  ...adrian,
  fullName: 'Bill Gates',
 website: 'https://microsoft.com'
};

上面代码的作用是遍布adrian对象并获取其所有属性,然后用我们传递的属性覆盖现有属性。可以将这种传播视为逐个提取所有单个属性并将它们传递给新对象。

在这种情况下,由于我们在扩展运算符启动后指定了fullName和网站属性,因此JavaScript引擎知道我们要覆盖来自原始对象的那些属性的原始值。

这与阵列类似。除了传播键和值之外,运算符不会传播索引(index)和值。与对象传播不同的是,你不会有重复的属性,因为这是JavaScript对象的工作方式(你不能拥有一个具有两个fullName属性的对象),如果你计划实现类似的东西,那么对于数组你最终可能会有重复的值到我们的对象示例。

这意味着下面的代码将导致您拥有包含重复元素的数组。

const numbers1 = [1, 2, 3, 4, 5];
const numbers2 = [ ...numbers1, 1, 2, 6,7,8]; // this will be [1, 2, 3, 4, 5, 1, 2, 6, 7, 8]

可以把它想象成Array.prototype.concat的替代品.


rest运算符

使用函数的参数时,无论是完全替换参数还是与函数的参数一起替换参数,这三个点也称为rest运算符。

当像这样使用它时,rest操作符使开发人员能够创建可以获取无限数量的参数的函数,也称为变量arity或可变函数。

这是这种功能最简单的例子。假设您要创建一个计算其所有参数之和的函数。请注意,它不是两个,三个或四个数字的总和,而是函数作为参数接收的所有数字的总和。

这是一个简单的实现,使用rest运算符

function sum(...numbers) {
    return numbers.reduce((accumulator, current) => {
        return accumulator += current
    });
};

sum(1,2) // 3
sum(1,2,3,4,5) // 15

最简单的解释是,rest运算符接收函数接收的参数并将它们转储到以后可以使用的实数数组中。

你可能会觉得,你可以通过请求用户传递一组数字来完成此操作。这在技术上是可行的,但是这样的用户体验很差,因为用户希望用普通数字而不是数字列表来调用sum函数。

您可能还认为可以使用arguments数组。这也是事实,但要小心,参数不是真正的数组,而是类似数组的对象(具有length属性的对象)。对于我们的sum函数的第一次调用,在前面的例子中,它实际上看起来像这样:

{
  '0': 1,
  '1': 2,
  'length': 2
}

要操作此对象并在其上使用数组方法,例如reduce,从我之前的示例中,您必须执行Array.prototype.slice.call(arguments,0)操作。就速度和内存使用而言,这表现不佳并且不优雅。这样的代码,容易让你的初级水平的同事感到困惑。

这应该是您需要了解的所有内容,以便在JavaScript中使用rest / spread运算符。


原文链接: oprea.rocks  
翻译来源:https://segmentfault.com/a/1190000016168214

链接: https://fly63.com/article/detial/1038

classList的使用,原生js对class的添加,删除,修改等方法的总结,以及兼容操作

classList是一个DOMTokenList的对象,用于在对元素的添加,删除,以及判断是否存在等操作。以及如何兼容操作

js原型链,Javascript重温OOP之原型与原型链

js的原型链,得出了一个看似很简单的结论。对于一个对象上属性的查找是递归的。查找属性会从自身属性(OwnProperty)找起,如果不存在,就查看prototype中的存在不存在。

讲解JavaScript 之arguments的详解,arguments.callee,arguments.caller的使用方法和实例

arguments是什么?在javascript 中有什么样的作用?讲解JavaScript 之arguments的使用总结,包括arguments.callee和arguments.calle属性介绍。

WebSocket的原理及WebSocket API的使用,js中如何运用websocket

WebSocket是HTML5下一种新的协议,为解决客户端与服务端实时通信而产生的技术。其本质是先通过HTTP/HTTPS协议进行握手后创建一个用于交换数据的TCP连接

javascript对dom的操作总汇,js创建,更新,添加,删除DOM的方法

HTML文档在浏览器解析后,会成为一种树形结构,我们需要改变它的结构,就需要通过js来对dom节点进行操作。dom节点(Node)通常对应的是一个标题,文本,或者html属性。

深入理解JS中引用类型和基本类型

javascript中基本类型指的是那些保存在栈内存中的简单数据段,即这种值完全保存在内存中的一个位置。 引用类型指那些保存在堆内存中的对象,意思是变量中保存的实际上只是一个指针,这个指针指向内存中的另一个位置,该位置保存对象。

深入理解Javascript中apply、call、bind方法的总结。

apply 、 call 、bind 三者都是用来改变函数的this对象的指向的;第一个参数都是this要指向的对象,也就是想指定的上下文;都可以利用后续参数传参;bind 是返回对应函数,便于稍后调用;apply 、call 则是立即调用 。

理解js中prototype和__proto__和的区别和作用?

在js中有句话叫一切皆对象,而几乎所有对象都具有__proto__属性,可称为隐式原型,除了Object.prototype这个对象的__proto__值为null。Js的prototype属性的解释是:返回对象类型原型的引用。每个对象同样也具有prototype属性,除了Function.prototype.bind方法构成的对象外。

js中“=”,“==”,“===”的使用和深入理解

Js支持“=”、“==”和“===”的运算符,我们需要理解这些 运算符的区别 ,并在开发中小心使用。它们分别含义是:= 为对象赋值 ,== 表示两个对象toString值相等,=== 表示两个对象类型相同且值相等

JS的变量作用域问题,理解js全局变量和局部变量问题

js的变量分为2种类型:局部变量和全局变量。主要区别在于:局部变量是指只能在变量被声明的函数内部调用,全局变量在整个代码运行过程中都可以调用。值得注意的js中还可以隐式声明变量,而隐式声明的变量千万不能当做全局变量来使用。

点击更多...

内容以共享、参考、研究为目的,不存在任何商业目的。其版权属原作者所有,如有侵权或违规,请与小编联系!情况属实本人将予以删除!