函数默认值问题

在ES6之前,不能直接为函数指定默认值,但是ES6允许为函数的参数设置默认值

之前实现方式

function log(x, y) {
y = y || 'World';
console.log(x, y);
} log('Hello') // Hello World
log('Hello', 'China') // Hello China
log('Hello', '') // Hello World

解析:缺点在于如果给参数y赋值了,但是对应的布尔值是false,则会出现最后一样的输出结果

ES6实现方式

function log(x, y = 'World') {
console.log(x, y);
} log('Hello') // Hello World
log('Hello', 'China') // Hello China
log('Hello', '') // Hello

ps:  参数变量是默认声明的,所以不能用let或者const再次声明,否则会报错;

  使用参数默认值时,函数不能有同名参数;

  参数默认值是惰性求值的;

例子

//不能let或者const再次声明参数变量x
function foo(x = 5) {
let x = 1; // error
const x = 2; // error
} //使用参数默认值,参数不能同名
// 不报错
function foo(x, x, y) {
// ...
} // 报错
function foo(x, x, y = 1) {
// ...
} //参数默认值惰性求值
//参数p的默认值是x+1.每次调用函数foo,都会重新计算x+1,而不是默认p=100
let x = 99;
function foo(p = x + 1) {
console.log(p);
} foo() // 100 x = 100;
foo() // 101

与解构赋值默认值结合使用

//只使用解构赋值默认值

function foo({x, y = 5}) {
console.log(x, y);
} foo({}) // undefined 5
foo({x: 1}) // 1 5
foo({x: 1, y: 2}) // 1 2
foo() //报错 解构赋值默认值和函数参数默认值结合使用
function foo({x, y = 5} = {}) {
console.log(x, y);
} foo() // undefined 5

没有第二个参数时,函数参数的默认值就会生效,然后才是解构赋值的默认值生效,变量想y才会取到默认值5。

例题

// 写法一
function m1({ x = 0, y = 0 } = {}) {
return [x, y];
} // 写法二
function m2({ x, y } = { x: 0, y: 0 }) {
return [x, y];
} // 函数没有参数的情况
console.log(m1());// [0, 0]
console.log(m2());// [0, 0] // x 和 y 都有值的情况
console.log(m1({ x: 3, y: 8 }));// [3, 8]
console.log(m2({ x: 3, y: 8 }));// [3, 8] // x 有值,y 无值的情况
console.log(m1({ x: 3 }));// [3, 0]
console.log(m2({ x: 3 }));// [3, undefined] // x 和 y 都无值的情况
console.log(m1({})) // [0, 0];
console.log(m2({}));// [undefined, undefined] console.log(m1({ z: 3 }));// [0, 0]
console.log(m2({ z: 3 }));// [undefined, undefined]

解析:相同:都有函数参数默认值

   不同:

    写法一 函数参数默认值为空对象 设置了对象解构赋值的默认值

    写法二 函数参数默认值为一个有具体属性的对象 没有设置对象解构赋值默认值

箭头函数

//无参数的箭头函数
var f = () => 5; 等价于
var f = function () { return 5 }; //一个参数的箭头函数
var f = v => v; 等价于
var f = function(v) {
return v;
}; //2个参数的箭头函数
var sum = (num1, num2) => num1 + num2; 等价于 var sum = function(num1, num2) {
return num1 + num2;
};

ps:

//箭头函数代码块语句多于一条,需要使用花括号括起来,并且使用return语句
var sum = (num1, num2) => { return num1 + num2; } //如果箭头函数直接返回一个对象,必须加上括号,否则会报错
// 报错
let getTempItem = id => { id: id, name: "Temp" };
// 不报错
let getTempItem = id => ({ id: id, name: "Temp" });

箭头函数注意事项

(1)函数体内的this对象,就是定义时所在的对象,而不是使用时所在的对象。

(2)不可以当作构造函数,也就是说,不可以使用new命令,否则会抛出一个错误。

(3)不可以使用arguments对象,该对象在函数体内不存在。如果要用,可以用 rest 参数代替。

(4)不可以使用yield命令,因此箭头函数不能用作 Generator 函数。

箭头函数的this的问题

function foo() {
setTimeout(() => {
console.log('id:', this.id);
}, 100);
} var id = 21; foo.call({ id: 42 });
//输出结果为42 并非21

函数绑定运算符

它是并排的两个冒号(::),该运算符会自动将左边的对象,作为上下文环境(this对象),绑定到右边的函数上,

写法:对象::函数

作用:用函数运算符来取代call,apply,bind调用。

应用:

//普通双冒号运算符应用
foo::bar 等同于 bar.bind(foo) foo::bar(...arguments) 等同于 bar.apply(foo,arguments) //双冒号左边为空,右边是一个对象的方法,则是将该方法绑定到该对象上 let log = ::console.log; // 等同于 let log = console.log.bind(console);

相关资料:https://www.cnblogs.com/wangyingblog/p/5583825.html

       http://www.jb51.net/article/80861.htm

     http://blog.csdn.net/ganyingxie123456/article/details/70855586

【ES6】函数的更多相关文章

  1. ES6函数扩展

    前面的话 函数是所有编程语言的重要组成部分,在ES6出现前,JS的函数语法一直没有太大的变化,从而遗留了很多问题和的做法,导致实现一些基本的功能经常要编写很多代码.ES6大力度地更新了函数特性,在ES ...

  2. 深入理解javascript函数系列第四篇——ES6函数扩展

    × 目录 [1]参数默认值 [2]rest参数 [3]扩展运算符[4]箭头函数 前面的话 ES6标准关于函数扩展部分,主要涉及以下四个方面:参数默认值.rest参数.扩展运算符和箭头函数 参数默认值 ...

  3. ES6函数剩余参数(Rest Parameters)

    我们知道JS函数内部有个arguments对象,可以拿到全部实参.现在ES6给我们带来了一个新的对象,可以拿到除开始参数外的参数,即剩余参数(废话好多 O(∩_∩)O~). 这个新的对象和argume ...

  4. ES6函数默认参数(Default Parameters)

    语言更新时每一个新增的特性都是从千百万开发者需求里提取过来的,规范采用后能减少程序员的痛苦,带来便捷. 我们经常会这么写 function calc(x, y) { x = x || 0; y = y ...

  5. es6函数的rest参数和拓展运算符(...)的解析

    es6的新特性对函数的功能新增加了rest参数和...的拓展运算符.这是两个什么东西呢? 先来看一个问题:如何获取一个函数除了定义的参数之外的其他参数?传统的做法是借助函数的arguments关键字来 ...

  6. ES6函数的拓展

    ES里面现在支持在函数的参数直接给参数赋一个默认值,ES6支持拓展运算符(...)三个英文的点,这个形式如function(...a)这个里面...a可以接受若干的值,这个拓展运算符也可以把若干的值转 ...

  7. ES6 函数的扩展1

    1. 函数参数的默认值 基本用法 在ES6之前,不能直接为函数的参数指定默认值,为了避免这个问题,通常需要先判断一下参数y是否被赋值,如果没有,再等于默认值. ES6允许为函数的参数设置默认值,即直接 ...

  8. ES6 函数的扩展3

    箭头函数 基本用法 ES6允许使用"箭头"(=>)定义函数 var f = v => v; 上面的箭头函数等同于: var f = function(v) { retu ...

  9. ES6 函数的扩展2

    8.2 rest参数 ES6引入rest参数(形式为"-变量名"),用于获取函数的多余参数,这样就不需要使用arguments对象了. arguments对象并没有数组的方法,re ...

  10. ES6 函数的扩展(1)

    1. 函数参数的默认值 基本用法 在ES6之前,不能直接为函数的参数指定默认值,为了避免这个问题,通常需要先判断一下参数y是否被赋值,如果没有,再等于默认值. ES6允许为函数的参数设置默认值,即直接 ...

随机推荐

  1. 应用分类&练手项目计划

    应用分类 练手项目 [应用] 通讯录 xx管理 聊天室 [组件] web容器 db 中间件

  2. windows 上用 docker 部署aspnetcore 2.0

       首先下载docker for windows 并且 安装. 这其中需要显卡支持虚拟化  windows系统升级到专业版  bois 启用虚拟   通过vs2017 创建一个net core ap ...

  3. angularjs+webapi2 跨域Basic 认证授权(一)

    如今的app,利用各种前端框架结合html5的混合开发模式已然盛极一时.其中ionic+angularjs更是如日中天.这种模式利用angularjs $http 请求数据api 以达到前后端分离深得 ...

  4. mapper接口方法参数

    mapper接口中的方法只有一个参数,是不影响程序员开发的可以将参数指定为 pojo类型 或 map

  5. K8S 高级调度方式

    可以使用高级调度分为: 节点选择器: nodeSelector.nodeName 节点亲和性调度: nodeAffinity Pod亲和性调度:PodAffinity Pod反亲和性调度:podAnt ...

  6. Python 一键拉取Git分支源码自动解析并执行SQL语句

    基于Python实现自动拉取Git分支源码自动解析并执行SQL语句 by:授客 QQ:1033553122 1.代码用途 开发过程中,研发人员会提交SQL更新脚本到Git源码库,然后测试负责去拉取这些 ...

  7. (网页)jquery-qrcode.js生成二维码

    基础用法 <div id="qrcode"></div> <script type="text/javascript"> n ...

  8. android默认开启adb调试方法分析

    用adb调试android时,每次接入usb线,都会提示一个确认打开usb调试功能的窗口,有时候,我们需要默认打开usb调试功能.或者无需弹出对话框,直接默认开启.这个我们需要分析adb的流程了. a ...

  9. mssql sqlserver 批量删除所有存储过程的方法分享

    转自:http://www.maomao365.com/?p=6864 摘要: 下文讲述采用sql脚本批量删除所有存储过程的方法,如下所示: 实验环境:sqlserver 2008 R2 平常使用sq ...

  10. 爬取mzi.com妹子图片网站(requests库)

    看了崔大佬的文章,写了这个爬虫,学习了!原文地址 现在该网站加了反爬机制,不过在headers里加上refere参数就行了. 以下代码仅做学习记录之用: from bs4 import Beautif ...