一、设置默认参数

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中函数的扩展的更多相关文章

  1. es6(三):es6中函数的扩展(参数默认值、rest参数、箭头函数)

    1.函数可以设置参数默认值 function test1(x,y=1){ console.log(x,y) } test1(10)//10 1 2.rest参数:形式为...变量名 function ...

  2. ES6中函数新增的方式方法

    ---恢复内容开始---   绪 言 ES6 大家对JavaScript中的函数都不陌生.今天我就为大家带来ES6中关于函数的一些扩展方式和方法. 1.1函数形参的默认值 1.1.1基本用法 ES6 ...

  3. ES6中对象的扩展

    ES6不仅为字符串.数值和数组带来了扩展,也为对象带来了很多新特性.这一节,我们来一起学习一下对象的扩展. 对象的传统表示法 我们回顾一下,对象的传统表示法: let person = { " ...

  4. ES6 之 函数的扩展 尾调用以及尾递归

    函数参数的默认值 function log(x, y) { y = y || 'world' console.log(x + ' ' + y); } log('hello') // hello wor ...

  5. ES6中字符串的扩展

    一.查找字符串 在ES5中,可以使用 indexOf 方法和 lastIndexOf 方法查找字符串: let str = 'hello world'; alert(str.indexOf('o')) ...

  6. ES6入门——函数的扩展

    1.函数参数的默认值 在ES6之前,不能直接为函数的参数指定默认值,只能采用变通的方法.现在ES6可以为函数的参数添加默认值,简洁了许多. ES5 function show(a,b){ b = b ...

  7. 【ES6】函数的扩展

    1.函数参数默认值[详情例子参照ESMAScript 6入门 (阮一峰)] 允许为函数的参数设置默认值,即直接写在参数定义的后面.[例子1] 参数变量是默认声明的,所以不能用let或const再次声明 ...

  8. ES6中函数参数默认值问题

    参数默认值 // 以前的参数默认值写法 let fn = (a, b) => { a = typeof a === "undefined" ? 10 : a b = type ...

  9. 关于es6中对象的扩展

    1.Object.is() es5比较两个值是否相等,只有两个运算符,相等(==) 和 严格相等(===),他们都有缺点,前者会自动转换数据类型,后者的NaN不等于自身,以及+0 等于 -0.es6提 ...

随机推荐

  1. LeetCode - 326, 342, 231 Power of Three, Four, and Two

    1. 问题 231. Power of Two: 判断一个整数是否是2的n次方,其中n是非负整数 342. Power of Four: 判断一个整数是否是4的n次方,其中n是非负整数 326. Po ...

  2. tensorflow学习笔记(4)-学习率

    tensorflow学习笔记(4)-学习率 首先学习率如下图 所以在实际运用中我们会使用指数衰减的学习率 在tf中有这样一个函数 tf.train.exponential_decay(learning ...

  3. Java简单工厂模式

    Java简单工厂模式 在阎宏博士的<JAVA与模式>一书中开头是这样描述简单工厂模式的:简单工厂模式是类的创建模式,又叫做静态工厂方法(Static Factory Method)模式.简 ...

  4. HDU 2491 Priest John's Busiest Day(贪心)(2008 Asia Regional Beijing)

    Description John is the only priest in his town. October 26th is the John's busiest day in a year be ...

  5. POJ 1679 The Unique MST(最小生成树)

    Description Given a connected undirected graph, tell if its minimum spanning tree is unique. Definit ...

  6. 实用的ES6特性

    1. 函数参数默认值 不使用ES6 为函数的参数设置默认值: function foo(height, color) { var height = height || 50; var color = ...

  7. <Effective C++>读书摘要--Implementations<一>

    1.For the most part, coming up with appropriate definitions for your classes (and class templates) a ...

  8. open-stf 安装篇(linux)

       OpenSTF 百度MTC的远程真机调试 Testin的云真机 腾讯WeTest的云真机 阿里MQC的远程真机租用 什么是OpenSTF? OpenSTF是一个手机设备管理平台,可以对手机进行远 ...

  9. Thread.Sleep(0)

    理解Thread.Sleep函数 我们可能经常会用到 Thread.Sleep 函数来使线程挂起一段时间.那么你有没有正确的理解这个函数的用法呢? 思考下面这两个问题: 1.假设现在是 2008-4- ...

  10. Python自定义包在linux服务器导入错误的解决办法

    在本地机器上跑python代码,自己定义的文件进行导包运行是没有问题,但是放到linux服务器上的时候就会提示 ImportError:No module named xxxx(要导入的文件包名) 在 ...