ES6中函数的扩展
一、设置默认参数
ES6之前,给函数设置默认参数是这样做的:
function fn(a) {
if(typeof y === undefined){
a = a || 'hello';
}
console.log(a);
}
fn('hi'); // 'hi'
fn(false); // false
这里之所以要判断一下,是因为我们本意是函数没有传值时才给参数 a 设置为 'hello',但是如果调用函数时传入了布尔值 false,也会把参数 a 设置为 'hello'。
在 ES6 中允许为函数的参数设置默认值,直接写在参数的后面即可:
function fn(a = 'hello') {
console.log(a);
}
fn('hi'); // 'hi'
fn(false); // false
非常的简洁,严谨,不用判断,不过有一点需要注意,参数变量是默认声明的,所以,在函数体内,不能再使用 let 或者 const 再次声明:
function fn(a = 'hello') {
let a = 'hi'; // error
const a = 'ha'; // error
}
二、rest参数
ES6之前,获取函数多余的参数用的是 arguments:
function fn(a) {
for(var i = 0; i < arguments.length; i ++){
console.log(arguments[i]);
}
console.log(a);
}
fn(1, 2, 3);
//
//
//
//
而且这里 arguments 对象包括的是所有的参数,并不是严格意义上的多余的参数。
ES6 中,现在就可以使用 rest参数,用来完成获取多余的参数这件事了,很方便,语法为 ...变量名:
function fn(a, ...value) {
value.forEach(function (item) {
console.log(item);
});
}
fn(1, 2, 3);
//
//
函数体内,value 变量就是一个数组,包含传入的2个多余的参数 2、3。
这里有一点需要注意,rest参数 只能放在最后面,不然就报错:
function fn(a, ...value, b) { // error
}
三、箭头函数
ES6允许使用箭头( => )来定义函数,这里定义一个最简单的函数:
var sayHi = () => {
alert('hi');
}
// 等价于
function sayHi() {
alert('hi');
}
需要传参的话把参数写在圆括号里即可:
var add = (a, b) => {
console.log(a + b);
}
//等同于
function add(a, b){
console.log(a + b);
}
add(10, 20); //
如果参数只有一个,也可以不使用圆括号:
var fn = a => {
console.log(a);
}
fn(100); //
而且如果只有一条语句,甚至花括号也可以省略。
var fn = a => console.log(a);
fn(100); //
这里还有一种极其简单的替代写法:
var fn = a => a;
// 等同于
var fn = function(a){
return a;
}
console.log(fn(10)); //
但是这种写法需要谨慎使用,比如返回的是一个对象就需要外面包一个圆括号,不然报错:
var fn = () => {username: 'tom', age: 24}; // error
// 需要这样才可以
var fn = () => ({username: 'tom', age: 24});
箭头函数有以下几个注意点:
- 箭头函数中的
this,指的是定义时所在的对象,而不是调用时所在的对象。 - 不可以当做构造函数,也就是说,不可以使用
new操作符,否则报错。 - 不可以使用
arguments对象。
上面第一点,需要格外注意,因为它确定了箭头函数中的 this 的指向是不可变的:
var id = 10;
function fn() {
setTimeout(function () {
console.log(this.id);
},100)
}
fn.call({id: 20}); //
上面代码中,setTimeout 中的函数定义时在 fn函数 生成时,此时 this 是指向 {id: 20} 的,但它的真正执行却要等到100毫秒以后,这时 this 就指向了 window 了。如果我们非要改变这种情况,一般是这样做:
var id = 10;
function fn() {
var that = this;
setTimeout(function () {
console.log(that.id);
},100)
}
fn.call({id: 20}); //
现在在箭头函数中,直接写即可:
var id = 10;
function fn() {
setTimeout(() => {
console.log(this.id);
},100)
}
fn.call({id: 20}); //
由此可见,箭头函数是可以让 setTimeout 里面的 this,指向定义时所在的作用域,而不是调用时的作用域。
ES6中函数的扩展的更多相关文章
- es6(三):es6中函数的扩展(参数默认值、rest参数、箭头函数)
1.函数可以设置参数默认值 function test1(x,y=1){ console.log(x,y) } test1(10)//10 1 2.rest参数:形式为...变量名 function ...
- ES6中函数新增的方式方法
---恢复内容开始--- 绪 言 ES6 大家对JavaScript中的函数都不陌生.今天我就为大家带来ES6中关于函数的一些扩展方式和方法. 1.1函数形参的默认值 1.1.1基本用法 ES6 ...
- ES6中对象的扩展
ES6不仅为字符串.数值和数组带来了扩展,也为对象带来了很多新特性.这一节,我们来一起学习一下对象的扩展. 对象的传统表示法 我们回顾一下,对象的传统表示法: let person = { " ...
- ES6 之 函数的扩展 尾调用以及尾递归
函数参数的默认值 function log(x, y) { y = y || 'world' console.log(x + ' ' + y); } log('hello') // hello wor ...
- ES6中字符串的扩展
一.查找字符串 在ES5中,可以使用 indexOf 方法和 lastIndexOf 方法查找字符串: let str = 'hello world'; alert(str.indexOf('o')) ...
- ES6入门——函数的扩展
1.函数参数的默认值 在ES6之前,不能直接为函数的参数指定默认值,只能采用变通的方法.现在ES6可以为函数的参数添加默认值,简洁了许多. ES5 function show(a,b){ b = b ...
- 【ES6】函数的扩展
1.函数参数默认值[详情例子参照ESMAScript 6入门 (阮一峰)] 允许为函数的参数设置默认值,即直接写在参数定义的后面.[例子1] 参数变量是默认声明的,所以不能用let或const再次声明 ...
- ES6中函数参数默认值问题
参数默认值 // 以前的参数默认值写法 let fn = (a, b) => { a = typeof a === "undefined" ? 10 : a b = type ...
- 关于es6中对象的扩展
1.Object.is() es5比较两个值是否相等,只有两个运算符,相等(==) 和 严格相等(===),他们都有缺点,前者会自动转换数据类型,后者的NaN不等于自身,以及+0 等于 -0.es6提 ...
随机推荐
- kvm虚拟化操作
本节演示如何使用 virt-manager 启动 KVM 虚机. 首先通过命令 virt-manager 启动图形界面 # virt-manager 点上面的图标创建虚机 给虚机命名为 kvm1,这里 ...
- Unicode,UTF-32,UTF-16,UTF-8到底是啥关系?
编码的目的,就是给抽象的字符赋予一个数值,好在计算机里面表示.常见的ASCII使用8bit给字符编码,但是实际只使用了7bit,最高位没有使用,因此,只能表示128个字符:ISO-8859-1(也叫L ...
- Special Offer! Super Price 999 Bourles!
Description Polycarpus is an amateur businessman. Recently he was surprised to find out that the mar ...
- android入门 — PopupWindow
第一步:自定义xml文件 第二步:获取LayoutInflater对象 第三步:调用inflate()方法获取View对象 第四步:创建PopupWindow对象 第五步:调用PopupWindow的 ...
- iOS 出现错误reason: image not found的解决方案
在制作framework时遇到真机运行时导致的reason: image not found允许崩溃的问题,下面是我的解决方案: 首先我们分析一下出现这种情况的原因,原因就是framework找不到镜 ...
- pycharm开启代码智能提示和报错提示
天呐,经历了一大波周折,终于把提示给弄好了,加入没有提示的话,pycharm就是一个空格了,没有什么作用,对我来说,真的是很困难的事情,所以无论如何都要去把这个智能提示给搞好了. 先讲讲我的经历吧.我 ...
- java中多种方式读文件
转自:http://www.jb51.net/article/16396.htm java中多种方式读文件 一.多种方式读文件内容. 1.按字节读取文件内容 2.按字符读取文件内容 3.按行读取文件内 ...
- bzoj1968 约数研究
题意 令\(f(i)\)表示\(i\)的约数个数,求\(\Sigma^n_{i=1}f(i)\). 做法 我们直接算每个数的贡献,问题可以转化成每个数在\(1\)到\(n\)中有多少个倍数,累加答案. ...
- P1315 观光公交
题目描述 风景迷人的小城Y 市,拥有n 个美丽的景点.由于慕名而来的游客越来越多,Y 市特意安排了一辆观光公交车,为游客提供更便捷的交通服务.观光公交车在第 0 分钟出现在 1号景点,随后依次前往 2 ...
- Hadoop——HDFS的构架
在使用一个工具之前,应该先对它的机制.组成等有深入的了解,以后才会更好的使用它.下面来介绍一下什么是HDFS,以及他的构架是什么样的. 1.什么是HDFS? Hadoop主要是用于进行大数据处理,那么 ...