函数默认值问题

在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. js 面向对象 ES5 AND ES6

    1. ES5实现 父类: // 职员类 function Employees(id,name,salary) { // 属性 this.id = id; this.name = name; this. ...

  2. 用js实现超链接导航菜单点击切换选中时的状态

    项目中使用到点解导航切换不同的颜色,如果只是li选项卡还好办,这次用到的超链接选项卡,因为a链接每次点击都会刷新,所以浏览器记不住点击的状态,也没法切换点击状态,因为项目中有好多地方要用到,在网上找了 ...

  3. 详解LSTM

    https://blog.csdn.net/class_brick/article/details/79311148 今天的内容有: LSTM 思路 LSTM 的前向计算 LSTM 的反向传播 关于调 ...

  4. springboot 数据验证

    不能相信前端传过来的任何数据 一定不能相信前端传过来的任何数据 绝对不能相信前端传过来的任何数据 @JsonFormat 时间必须是指定的格式(这里是接收参数格式,不是取数据来格式化) @Null 必 ...

  5. iOS----------开发中常用的宏有那些

    OC对象判断是否为空? 字符串是否为空 #define kStringIsEmpty(str) ([str isKindOfClass:[NSNull class]] || str == nil || ...

  6. Nginx 日志格式配置介绍

    Nginx日志格式配置介绍   by:授客  QQ:1033553122   测试环境 CentOS 6.5-x86_64 nginx-1.10.0 配置例子 log_format  main  '$ ...

  7. Python Elasticsearch批量操作客户端

    基于Python实现的Elasticsearch批量操作客户端 by:授客 QQ:1033553122   1. 代码用途 1 2. 测试环境 1 3. 使用方法 1 3.1 配置ES服务器信息 1 ...

  8. Kotlin入门(27)文件读写操作

    Java的文件处理用到了io库java.io,该库虽然功能强大,但是与文件内容的交互还得通过输入输出流中转,致使文件读写操作颇为繁琐.因此,开发者通常得自己重新封装一个文件存取的工具类,以便在日常开发 ...

  9. Android RecycleView多种布局实现(工厂模式)

    RecycleView是个很常用的控件,很多APP中都可以看到它的身影,同时它也是个很难用的控件,主要就难在多种布局的实现. 在<第一行代码—Android>这本书里边有个RecycleV ...

  10. Android IPC机制(四)用ContentProvider进行进程间通信

    前言 ContentProvider为存储和获取数据提供统一的接口,它可以在不同的应用程序之间共享数据,本身就是适合进程间通信的.ContentProvider底层实现也是Binder,但是使用起来比 ...