JavaScript的一些附加特性

这些注释将向您介绍JavaScript语言的一组附加特性。我在这个时候介绍这些特性的动机是,它们将在未来几周我们学习React材料的过程中发挥作用。为了让我们的React之旅更容易一些,我想提前介绍一下这些主题,这样当我们以后遇到它们时,你就会熟悉它们。

对象引用变量

下面是一小段JavaScript代码:

let one = {a:12,b:"Hello"};令二=一;两个。A = 10;console.log(一);

您认为这段代码将打印到控制台的内容是什么?如果你说“12”,那么你对JavaScript中对象行为的一个重要方面的理解是错误的。你可能会认为赋值语句

令二=一;

复制存储在一个容器中的对象,并将其放在两个容器中。如果是这样,则后面的语句

两个。A = 10;

将更新对象2的a属性,而保持对象1不变。实际上,这里发生的事情是变量1和变量2都将包含对我们在第一个语句中创建的对象的引用。由于这两个变量都指向同一个对象,改变其中任何一个引用的a属性都会改变指向同一个对象的赢博体育变量的a属性。

同样的原则也适用于向函数传递参数:

函数setA(obj) {obj。A = 10;} let one = {a:12,b:"Hello"};刚毛(一);console.log(一);

这个例子也将输出10:当我们将存储在1中的对象传递给setA()函数时,我们传递的是对该对象的引用。当函数修改你传递给它引用的对象的a属性时,你将有效地改变变量one的a属性,因为one和参数obj都引用同一个对象。

赢博体育这些都提出了一个明显的问题:如果您想要复制一个引用的对象并将该副本存储为两个,该怎么办?下面有些笨拙的代码做到了这一点:

let one = {a:12,b:"Hello"};设2 = {a:one.a,b:one.b};两个。A = 10;console.log(一);

在这些注释后面的部分中,我们将看到一种更简洁的复制方法。

解构作业

考虑下面的代码:

let one = {a:12,b:"World",c:12.2,d:"Hello"};令n = 1。a;让问候=一;

在本例中,我们将对象分解为其组成部分,并将其中一些部分存储在单独的变量中。在JavaScript中,将对象的部分或全部属性拆分为不同的变量是一种非常常见的操作,因此该语言现在支持一种更清晰的替代语法,称为解构赋值:

let one = {a:12,b:"World",c:12.2,d:"Hello"};让{a,d} = 1;

上面的第二个语句引入了两个新变量a和d,并将对象1的a和d属性赋给它们。(注意,对于这项工作,变量的名称必须与属性的名称完全匹配。)

这个想法更常赢博体育于参数传递。将对象的两个或多个属性传递给函数是非常常见的事情。下面是第一个使用旧语法的例子:

函数示例(n,str) {console.log("n is " _+ n);Console.log ("str is " + str);}让one = {a:12,b:"World",c:12.2,d:"Hello"};示例(一、one.d);

下面是对参数使用解构赋值的同一示例的更现代版本:

函数示例({a,d}) {console.log("n is " + a);Console.log ("str is " + d);}让one = {a:12,b:"World",c:12.2,d:"Hello"};(一个例子);

扩展/休息操作符

JavaScript版本6引入了一个新的操作符,叫做扩展操作符。展开操作符的目的是分解某些东西(通常是数组或对象)的组件,并将它们分解为单个元素。演示其工作原理的最佳方法是举一个例子。

let A = [1,2,3];let B =[0,…,A];

…操作符获取A数组的内容并将它们展开,以便它们可以用于基于A组装一个新的列表。

同样的技巧也可以用于分散对象的属性:

让A = {A:10,b:"World"};让B = {c:"Hello",…A};

本例展开A的属性,并将这些展开的属性添加到新对象B的属性列表中。

扩展操作符工作方式的一个副作用是,它也可以用来复制对象:

让A = {A:10,b:"World"};让B ={…A};

一样的……sequence在JavaScript中实现了第二个操作符,rest操作符,用于解构赋值和参数传递。下面是一个在解构赋值中使用rest操作符的示例:

let one = {a:12,b:"World",c:12.2,d:"Hello"};让{a, d,…Other} = 1;

上面第二个语句中的赋值实质上是说:“将对象1的a属性放入变量a中,将d属性放入变量d中,然后将对象1中剩余的属性放入变量other将引用的新对象中。”

下面是在函数中同时使用spread和rest操作符的示例:

函数印加({,…其他}){返回{+ 1,…其他};}让one = {a:12,b:"World",c:12.2,d:"Hello"};let 2 = incA(1);console.log(两个);

在这个例子中,我们构造了一个函数,期望接收一个对象作为它的参数。我们将把对象的a属性拆分为参数a,并将对象的其余属性收集到存储在另一个参数(这是一个rest参数)中的新对象中。然后,在函数体中,通过使用扩展操作符创建并返回一个新对象,该对象由稍微修改过的a值和other中的赢博体育属性组成。

使用数组map()和filter()方法

JavaScript数组类提供了许多有用的方法。本小节将介绍其中两个方法,map()和filter()方法。

map()方法接受一个函数作为参数,并返回一个新数组,该数组的元素是将该函数赢博体育于原始数组的每个元素的结果:

let A = [1,2,3,4];函数doubleIt(x){返回2*x;} let B = A.map(doubleIt);

您可以使用箭头函数作为定义然后传入函数的替代方法。

let A = [1,2,3,4];let B = A.map(x => *x);

filter()函数类似于map(),因为它旨在基于现有数组返回一个新数组。与filter()的不同之处在于,您需要向它传递一个布尔函数。新数组将只包含布尔函数返回true的元素:

let A = [1,2,3,4,5,6];函数isEven(x){返回x % 2 == 0;} let B = A.filter(isEven);// B = [2,4,6]

同样,你可以传递一个箭头函数给filter():

let A = [1,2,3,4,5,6];let B = A.filter(x=>x%2= 0);