@[spread, javavscript, es6, react]

Spread语法是ES6中的一个新特性,在需要使用多参数(函数参数)、多元素(数组迭代)或者多变量(解构赋值)的地方使用spread语法,可以让表达式的结果平铺化

java中的可变参数

熟悉java的朋友对可变参数应该比较熟悉了,他用来指定方法接受不定个数的参数,参数被传进来后形成一个数组,可供你迭代使用分别取出传进来的参数。

public int sum(int... input){
int result;
for(int i: input){
result+=i;
}
return result;
}

上述代码就是用来求和的,输入的可变参数的个数是不定的,但是进入方法后,所有的参数变成了一个数组,可以供你迭代。于是这个sum方法可以这样子调用:

int[] array = [1,2,3,4,5];
int result = sum(array);// result is 15

当做参数传递

function myFunction(x, y, z) { }
var args = [0, 1, 2];
myFunction(...args);

这里就和java的可变参数有点类似,...(spread操作符?spread语法)用来将args数组展开,分别当做参数传递给了myFunction的x,y,z

function myFunction(v, w, x, y, z) { }
var args = [0, 1];
myFunction(-1, ...args, 2, ...[3]);

这个例子说明spread操作符可以多次使用。0和1分别当做参数赋值给了w和x,最后一个[3]也是一个数组,那么他被spread操作符展开后当然就只有一个结果,即3被赋值给了z

用于数组的创建和组合

var parts = ['shoulders', 'knees'];
var lyrics = ['head', ...parts, 'and', 'toes']; // ["head", "shoulders", "knees", "and", "toes"]

以上的例子是parts数组作为lyrics的一部分给赋值进去了

这里也可以使用数组的push函数:

var arr = [1,2,3];
var arr2 = [...arr]; // like arr.slice()
arr2.push(4);

arr2的结果是[1,2,3,4],而arr并不受任何影响依然存在

var arr1 = [0, 1, 2];
var arr2 = [3, 4, 5];
arr1.push(...arr2);// arr1 is [0,1,2,3,4,5]

arr2被赋值给了arr1的末尾

spread只可用于可枚举类型

var obj = {"key1":"value1"};
var array = [...obj]; // TypeError: obj is not iterable

以上的代码会报错,obj是一个对象,不可以被枚举,spread并不适用于这种类型

rest操作符

rest操作符也是三个点(...),但实际他和spread操作符相反,他是将多个元素组合成一个元素,这里其实就是java的可变参数,但是在js中叫做rest参数

function fun1(...theArgs) {
console.log(theArgs.length);
} fun1(); // 0
fun1(5); // 1
fun1(5, 6, 7); // 3

具体使用方法就不再赘述,和java一样

spread attributes延展属性

在写React的代码的时候,spread attributes是最常用的到写法,用来传递一个对象给一个组件的props,然后这个组件有哪些props你却并不完全清楚。这里举个例子说明

class Student extends React.Component {

    constructor(props){
super(props)
this.state = {
name: "",
age: 0
}
} render(){
return(
<div>name is : {this.props.name}, age : {this.props.age}</div>
)
}
} ReactDOM.render((
<Student name="xiaoming" age={10}/>
), document.getElementById("main"));

这里写了而一个Student组件,他含有两个属性 ,一个是name一个是age。我们渲染他的时候,通过name="xiaoming" age={10}这种key-value方式传入,从而达到了定制组件的目的。想象一下如果Student属性特别多,那么难道要一个个的在这里写上吗?何况当这个Student可能并不似你写的,里面有哪些属性你也并不清楚。这里可以用到spread操作符:

var args = {
name: "xiaoming",
age: 10
} ReactDOM.render((
<Student {...args}/>
), document.getElementById("main"));

这段代码和上面的是等价的

spread语法解析与使用的更多相关文章

  1. With语句以及@contextmanager的语法解析

    with 语句以及@contextmanager的语法解析   with语句可以通过很简单的方式来替try/finally语句. with语句中EXPR部分必须是一个包含__enter__()和__e ...

  2. MySQL- -Join语法解析与性能分析

    Mysql Join语法解析与性能分析 一.Join语法概述 join 用于多表中字段之间的联系,语法如下: ... FROM table1 INNER|LEFT|RIGHT JOIN table2 ...

  3. 更改AngularJS的语法解析符号

    // 更改AngularJS的语法解析符号 app.config(function ($interpolateProvider) { $interpolateProvider.startSymbol( ...

  4. 转换器4:手写PHP转Python编译器,语法解析部分

    写完词法部分,又有很多杂事,周末终于有空来实现伟大的语法解析部分了. 撸完代码之后发现,程序太短了,不算上状态机,才186行(含注释),关键代码不到100行.运行调试过后,发现还行.居然可以解析One ...

  5. 在.NET Core中使用Irony实现自己的查询语言语法解析器

    在之前<在ASP.NET Core中使用Apworks快速开发数据服务>一文的评论部分,.NET大神张善友为我提了个建议,可以使用Compile As a Service的Roslyn为语 ...

  6. Generator函数语法解析

    转载请注明出处: Generator函数语法解析 Generator函数是ES6提供的一种异步编程解决方案,语法与传统函数完全不同.以下会介绍一下Generator函数. 写下这篇文章的目的其实很简单 ...

  7. JSP编译成Servlet(一)语法树的生成——语法解析

    一般来说,语句按一定规则进行推导后会形成一个语法树,这种树状结构有利于对语句结构层次的描述.同样Jasper对JSP语法解析后也会生成一棵树,这棵树各个节点包含了不同的信息,但对于JSP来说解析后的语 ...

  8. 用java实现编译器-算术表达式及其语法解析器的实现

    大家在参考本节时,请先阅读以下博文,进行预热: http://blog.csdn.net/tyler_download/article/details/50708807 本节代码下载地址: http: ...

  9. 用java实现一个简易编译器-语法解析

    语法和解析树: 举个例子看看,语法解析的过程.句子:“我看到刘德华唱歌”.在计算机里,怎么用程序解析它呢.从语法上看,句子的组成是由主语,动词,和谓语从句组成,主语是“我”,动词是“看见”, 谓语从句 ...

随机推荐

  1. ORA-01501: CREATE DATABASE failed

    使用dbca建库时遇到ORA-01501: CREATE DATABASE failed这个错误,检查告警日志,发现有下面错误信息: SMON: enabling tx recovery Fri Ap ...

  2. linux性能监控工具

    1.uptime 该命令直观的显示了服务器在过去15分钟,5分钟,1分钟内的平均负载   2.vmstat 每隔2秒输出vmstat的信息,共输出10次. 类别 procs swap io   sys ...

  3. 伪造http的ip地址,突破ip限制的投票程序

    某WEB投票程序, 使用 ip 限制和cookie限制技术,来限制每个ip每天只能投一次票,使用的是php开发,获取访问者的 ip 使用了搜狐的接口: http://txt.go.sohu.com/i ...

  4. A cost-effective recommender system for taxi drivers

    一个针对出租车司机有效花费的推荐系统 摘要 GPS技术和新形式的城市地理学改变了手机服务的形式.比如说,丰富的出租车GPS轨迹使得出做租车领域有新方法.事实上,最近很多工作是在使用出租车GPS轨迹数据 ...

  5. centos7系统下安装nodejs开发环境

    1)安装基础工具(if not exists) yum install -y net telnet tools vim wget ntp 2)同步系统时间(if necessary) ntpdate ...

  6. Python 变量类型

    Python 变量类型 变量存储在内存中的值.这就意味着在创建变量时会在内存中开辟一个空间. 基于变量的数据类型,解释器会分配指定内存,并决定什么数据可以被存储在内存中. 因此,变量可以指定不同的数据 ...

  7. HTTP 请求报文 响应报文

    引言 超文本传输协议(HTTP,HyperText Transfer Protocol)是互联网上应用最为广泛的一种网络协议.所有的WWW文件都必须遵守这个标准.设计HTTP最初的目的是为了提供一种发 ...

  8. RCC BUCK变压器设计

    RCC电路工作于临界模式,不是固定工作频率,其设计遵从BUCK原理.Buck电路在最高输入电压时为电感最恶劣工作条件: 以下图为例: 1.首先设定如下参数:输入电压Vin,输出电压Iout,工作频率f ...

  9. Unity3D所使用的第三方工具

    前言 最近在研究Unity3D的结构和原理.关于Unity3D怎么用之类的教程在网上一找一大堆,想看教程之类的就不用看这篇文章了.我想做的是从使用Unity3D所看到的表象(表),摸透其设计原则和组织 ...

  10. java 28 - 6 JDK7的新特性

    JDK7的新特性: 二进制字面量 数字字面量可以出现下划线 switch 语句可以用字符串 泛型简化 异常的多个catch合并 try-with-resources 语句 二进制字面量 JDK7开始, ...