// 2017/7/22
/*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
log('Hello', '0') // Hello 0
log('Hello', 0) //Hello World console.log("0"==false);//true
console.log(0==false);//true //注意:这种写法的缺点在于,如果参数y赋值了,但是对应的布尔值为false,则该赋值不起作用。就像上面代码的最后一行,参数y等于空字符,结果被改为默认值。 //问题:数字0和字符串“0”的布尔值都为false,但是调用log函数的结果不一样。 //为了避免这个问题,通常需要先判断一下参数y是否被赋值,如果没有,再等于默认值。 function log(x, y) {
if(typeof y===undefined){
y="World";
} console.log(x, y);
} log('Hello') // Hello undefined
log('Hello', 'China') // Hello China
log('Hello', '') // Hello
log('Hello', '0') // Hello 0
log('Hello', 0) //Hello 0 //ES6 允许为函数的参数设置默认值,即直接写在参数定义的后面。
function log(x,y="world"){
console.log(x,y);
}
log('Hello');//Hello world
log('Hello','');//Hello
log('Hello','China');//Hello China
log('Hello',0)//Hello 0 //注意:参数变量是默认声明的,在函数体中不能用let和const再次声明。
function foo(x=8){
let x=3;
const x=3;
}
foo();//Uncaught SyntaxError: Identifier 'x' has already been declared //注意:参数默认值不是传值的,而是每次都重新计算默认值表达式的值。也就是说,参数默认值是惰性求值的。 let a=99;
function foo(x=a+1){
console.log(x);
}
foo();//
a=0;
foo();// // 上面代码中,参数x的默认值是a + 1。这时,每次调用函数foo,都会重新计算a + 1,而不是默认x等于 100。 //2017/7/24
//与解构赋值默认值结合使用
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();//Uncaught TypeError: Cannot match against 'undefined' or 'null'. //注意:只有当函数foo的参数是对象时,变量x和y才会通过解构赋值而生成。如果函数foo调用时参数不是对象,变量x和y就不会生成,从而报错。 //写法一
function m1({x=0,y=0}={}){
console.log(x,y);
} // //写法二
function m2({x,y}={x:0,y:0}){
console.log(x,y);
} m1();//0 0
m2();//0 0 m1({x:3,y:4});//3 4
m2({x:3,y:4});//3 4 m1({});//0 0
m2({});//undefined undefined m1({z:3});//0 0
m2({z:3});//undefined undefined //参数默认值的位置 //注意:定义了默认值的参数,应该是函数的尾参数。因为这样比较容易看出来。如果是非尾部的参数设置默认值,实际上这个参数是没法省略的。 function f(x=1,y){
console.log(x,y);
}
f();//1 undefined
f(2);//2 undefined
// f(,1);//Uncaught SyntaxError: Unexpected token ,
f(undefined,1);//1 1 function f(x,y=5,z){
console.log(x,y,z);
} f();//undefined 5 undefined
f(1);//1 5 undefined
f(1,2,3);//1 2 3
// f(1,,2);//报错:es6.html:971 Uncaught SyntaxError: Unexpected token ,
f(1,undefined,2);//1 5 2 //传入undefined,将触发该参数等于默认值,null则没有这个效果。
function foo(x=5,y=6){
console.log(x,y);
} foo(undefined,null);//5 null //函数的 length属性
//注意:为函数的参数指定默认值后,函数的length属性将会失真,因为函数的length属性返回的是没有指定默认值的参数个数。
//length属性的含义是:该函数预期传入的参数个数。某个参数指定默认值以后,预期传入的参数个数就不包括这个参数了。同理,rest参数也不会计入length属性。
console.log((function(a){}).length);//
console.log((function(a=1){}).length)// console.log((function(...args){}).length);// //如果设置了默认值的参数不是尾参数,那么length属性也不再计入后面的参数了。
console.log((function(a=1,b,c){}).length);//
console.log((function(a,b=1,c){}).length);// //作用域:
//一旦设置了参数的默认值,函数进行声明初始化时,参数会形成一个单独的作用域(context)。等到初始化结束,这个作用域就会消失。这种语法行为,在不设置参数默认值时,是不会出现的。 var x=1;
function f(x,y=x){
console.log(y);
}
f(2);// let x=1;
function f(y=x){
let x=2;//
console.log(y);
}
f();//1,函数f调用时,参数y = x形成一个单独的作用域。这个作用域里面,变量x本身没有定义,所以指向外层的全局变量x。函数调用时,函数体内部的局部变量x影响不到默认值变量x。
f(3);// function f(y=x){
let x=2;
console.log(y);
}
f();//es6.html:1012 Uncaught ReferenceError: x is not defined var x=1;
function f(x=x){
console.log(x);
}
f();//Uncaught ReferenceError: x is not defined
/*注意:以上代码,参数x=x形成一个单独的作用域,实际上执行的是let x=x,由于暂时性死区的原因报错,在变量x的声明语句还没有执行完成前,就去取x的值,导致报错”x 未定义“。*/ /*应用*/
//(1)利用参数默认值,可以指定某一个参数不得省略,如果省略就抛出一个错误。
//(2)可以将参数默认值设为undefined,表明这个参数是可以省略的。 //rest参数:ES6 引入 rest 参数(形式为...变量名)。
function f(...values){
let sum=0;
for(var val of values){
sum+=val;
}
return sum;
} console.log(f(4,5,1));// //严格模式 //(1)从 ES5 开始,函数内部可以设定为严格模式。
//(2)ES2016 做了一点修改,规定只要函数参数使用了默认值、解构赋值、或者扩展运算符,那么函数内部就不能显式设定为严格模式,否则会报错。
/*如何规避*/
//(1)第一种是设定全局性的严格模式,这是合法的。
//(2)把函数包在一个无参数的立即执行函数里面。

ES6_入门(6)_函数的扩展的更多相关文章

  1. ES6入门之函数的扩展

    函数js原有的: 属性:arguments[].caller(调用该函数的引用,注意与callee分别开,callee指的是调用函数本身经常在递归中出现).length(形参个数).prototype ...

  2. GEF入门实例_总结_06_为编辑器添加内容

    一.前言 本文承接上一节:GEF入门实例_总结_05_显示一个空白编辑器 在上一节我们为我们的插件添加了一个空白的编辑器,这一节我们将为此编辑器添加内容. 二.GEF的MVC模式 在此只简单总结一下, ...

  3. python入门经典_好资源送不停

    Python入门经典(2K超清_送书) https://study.163.com/course/courseMain.htm?courseId=1006183019&share=2& ...

  4. GEF入门实例_总结_05_显示一个空白编辑器

    一.前言 本文承接上一节:GEF入门实例_总结_04_Eclipse插件启动流程分析 在第三节( GEF入门实例_总结_03_显示菜单和工具栏  ),我们创建了菜单和工具栏. 这一节,我们来实现:点击 ...

  5. GEF入门实例_总结_04_Eclipse插件启动流程分析

    一.前言 本文承接上一节:GEF入门实例_总结_03_显示菜单和工具栏 注意到app目录下的6个类文件. 这6个文件对RCP应用程序而言非常重要,可能我们现在对这几个文件的理解还是云里雾里,这一节我们 ...

  6. GEF入门实例_总结_03_显示菜单和工具栏

    一.前言 本文承接上一节: GEF入门实例_总结_02_新建初始RCP空项目 这一节,我们来给我们的插件加上菜单. 二.基础知识 1.action bar.menubar.coolbar   含义 a ...

  7. ES6学习笔记(6)----函数的扩展

    参考书<ECMAScript 6入门>http://es6.ruanyifeng.com/ 函数的扩展 函数的默认值 : ES6可以为函数指定默认值 (1)指定默认值的两种方式 a.函数参 ...

  8. ArcGIS for Desktop入门教程_第二章_Desktop简介 - ArcGIS知乎-新一代ArcGIS问答社区

    原文:ArcGIS for Desktop入门教程_第二章_Desktop简介 - ArcGIS知乎-新一代ArcGIS问答社区 1 Desktop简介 1.1 ArcGIS for Desktop ...

  9. Python入门篇-生成器函数

    Python入门篇-生成器函数 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任. 一.生成器概述 1>.生成器generator 生成器指的是生成器对象,可以由生成器表达式得到, ...

随机推荐

  1. [转] Mongoose初使用总结

    连接mongoose mongoose连接数据库有两种方式 第一种: 'use strict'; const mongoose = require('mongoose'); mongoose.conn ...

  2. .Net Core下发送WebRequest请求的两种方式

    1.使用RestSharp.NetCore 2.使用WebApi请求方式

  3. google 插件

    鼠标手势    crxMouse Chrome™ Gestures Google翻译 json格式化  JSONView github展开文件夹     Octotree axure 原型  Axur ...

  4. js/jquery如何获取获取父窗口的元素

    1.$("#父窗口元素ID",window.parent.document); 对应javascript版本为 window.parent.document.getElementB ...

  5. JSP基础知识➣获取参数和过滤器(四)

    JSP表单提交和参数获取 JSP表单提交的两种方式:post和get,通过这两种方式提交的参数到后台,获取参数的值主要由request来处理,获取值的方式有以下几种: getParameter():  ...

  6. Asp.net MVC - 使用PRG模式(附源码)

    阅读目录: 一. 传统的Asp.net页面问题 二.Asp.net MVC中也存在同样的问题 三.使用PRG模式 四.PRG模式在MVC上的实现 一. 传统的Asp.net页面问题 一个传统的Asp. ...

  7. 【转载】WIN7访问共享:0x80070035 找不到网络路径解决方法

    转载:http://blog.chinaunix.net/uid-12372814-id-3518571.html 昨天刚装WIN7系统,今天早上准备访问服务器安装些软件,结果出现网络错误,提示Win ...

  8. 启动tomcat出现Removing obsolete files from server... Could not clean server of obsolete ……错误

    在Eclipse启动tomcat出现"Removing obsolete files from server... Could not clean server of obsolete …… ...

  9. oracle中date数据的转换问题

    (TO_NUMBER(TO_CHAR(FP.KPRQ, 'HH24')) >= 18 kprq >= to_DATE ('2017-01-12 18:00:00','yyyy-MM-dd ...

  10. 线段树(lazy)-hdu1689

    题目链接:https://vjudge.net/problem/HDU-1698 题目描述: 现在Pudge想做一些操作.让我们将钩子的连续金属棒从1编号到N.对于每个操作,Pudge可以将连续金属棒 ...