摘要:原因中,定义的变量没有块级作用域,在第一个中循环后已经是,里面的执行的时候弹出的就是。
ES6特性介绍(上)
ECMAScript(简称ECMA、ES),ES6也被称为ECMAScript 2015
JavaScript是ECMAScript的一种,但是目前实现ECMAScript标准的仅JavaScript
ES6新的标准,新的语法特征:
1、变量/赋值
2、函数
3、数组/json
4、字符串
5、面向对象
6、Promise
7、generator
8、ES7:async/await
var:可以重复定义、不能限制修改(问题越早发现代价越小,因此其实严谨的语法更利于开发大项目)、没有块级作用域(函数作用域)
let: 不能重复定义、变量、块级作用域
const: 不能重复定义、常量、块级作用域
示例1,如下代码得到弹出的值始终是3,大家可以想下原因。
window.onload=function(){ let aBtn = document.getElementsByTagName("input"); for (var i=0; i< aBtn.length; i++) { aBtn[i].onclick=function(){ alert(i); } } }
原因:es5中,var定义的变量没有块级作用域,i在第一个function中循环后已经是3,里面的function执行的时候弹出的就是3。
此时解决方案有2种,都是通过改变变量i的作用域解决
1、闭包的方式封一下(原生js是函数级作用域,用函数包了后作用域不会到外面去)
for (var i=0; i< aBtn.length; i++) { (function(i) { aBtn[i].onclick=function(){ alert(i); } })(i); }
2、ES6方式,let块级作用域
for (let i=0; i< aBtn.length; i++) {【赋值】
解构赋值(借鉴于Python),只有符合以下要求,解构赋值可以灵活使用
左右两边结构必须一样
定义和赋值必须同步完成
示例:
let arr=[12,5,8]; // let [a,b,c]=arr; // a=12,b=5,c=8 let {a,b,c}={a:12,b:3,c:6}; let [m,n,k]=[12,{a: {n1:5,n2:8},b:12,c:8},55]; alert(`${a},${b},${c}`); // a=12,b=3,c=6 console(m,n,k); // m=12,n={a: {n1:5,n2:8},b:12,c:8},c=552、函数(类似Python) 【箭头函数】
1、如果有且仅有1个参数,()可以省略
2、如果函数体只有一句话,而且是return,{}也可以省
关于this,箭头函数会改变this(后面提及)
let show = function(a,b){return a+b;}; let show = ((a,b)=>a+b); let show = (a=>a*3);【默认参数】
传统函数实现默认参数:
function show(a,b,c) { b=b||5; c=c||12; alert(`${a},${b},${c}`); } show(13);//值是13,5,12 show(13,24,15);//值是13,24,15
ES6实现默认参数:
function show(a,b=5,c=12) { alert(`${a},${b},${c}`);//值是13,5,12 }【...参数展开】
1、“...”作用1,接收剩余参数,参数展开必须在参数列表的最后
function show(a,b, ...args){ console.log(a,b,args); } show(18,5,14,27,44,12);//函数中a=18,b=5,args=[14,27,44,12]
2、“...”作用2,展开一个数组
let arr=[5,14,27,44]; let arr1=[18,...arr,12]; alert(arr1);//显示18,5,14,27,44,12 //等价于...arr=>5,14,27,443、数组/json 【数组常用方法】
1)map,映射,通常用于对一个列表进行操作后返回新的列表,示例:
let arr=[59,84,27,46,97]; let arr2=arr.map(item=>{ return item>=60; }); alert(arr2);//arr2=[false,true,false,false,true]
2)filter,列表过滤,过滤出返回值true的列表,示例:
let arr=[59,84,27,46,97]; let arr2=arr.filter((item,index)=>{ return item%2; }); alert(arr2);//arr2=[59,27,97]
3)forEach 遍历数组
4)reduce 通常用于汇总,返回一个值(reduce有tmp参数)
let arr=[59,84,27,46,97]; //使用reduce计算总和 let sum=arr.reduce((tmp,item,index)=>{//reduce有tmp参数 return tmp+item; });
5)伪数组使用数组的方法(类数组直接使用数组方法会报错),使用Array.from()转换
Array.from(array-like).forEach(item=>{});【json-可简写】
名字和值的变量名一样,可以省略值的变量名只写名字; function可以不写
let a=5; let obj={a,b:7, // show: function(){alert(this.a+","+this.b)}//传统写法 show(){alert(this.a+","+this.b);}//ES6 } obj.show();//4、字符串
模板字符串
1)字符串拼接,插入变量
let person={name:"李明",age:17}; alert("我叫"+person.name+",我今年"+person.age+"岁");//传统方式 alert(`我叫${person.name},我今年${person.age}岁`);//ES6模板字符串
2)模板字符串的内容书写时可以换行
新增常用方法:startsWith、endsWith
5、面向对象1)es5实现一个对象
传统方式,function实现对象,使用prototype追加方法和继承
缺点:大项目中每个开发者的实现不一致,原生没有对象概念,有性能问题
//传统方式实现对象,通过函数表达函数,prototype添加方法 function Person(name,age){ this.name=name; this.age=age; } Person.prototype.showName=function(){ alert("我叫"+this.name); } Person.prototype.showAge=function(){ alert("我"+this.age+"岁"); } // 继承 function Worker(name,age,job){ Person.call(this,name,age); this.job=job; } Worker.prototype=new Person(); Worker.prototype.constructor=Worker;//非官方继承会改变constructor指向,需要手动修复 Worker.prototype.showJob=function(){ alert("我的工作是:"+this.job); } let w=new Worker("小叶子",18,"学生");// 调用 w.showName(); w.showAge(); w.showJob();
2)es6的class实现一个对象
ES6的类和其它面向对象的语言更为类似(大部分属性类似Python)
class Person{ constructor(name,age){ this.name=name; this.age=age; } showName(){ alert("我叫"+this.name); } showAge(){ alert("我"+this.age+"岁"); } } class Worker extends Person{ constructor(name,age,job){ super(name,age); //super-超类(父类) this.job=job; } showJob(){ alert("我的工作是:"+this.job); } } let w=new Worker("小叶子",18,"学生"); w.showName(); w.showAge(); w.showJob();
【函数this/bind】
1、函数this
箭头函数this:根据所在的环境确定this,this是所在环境的this,this恒定
普通函数this:根据调用我的人确定this,谁调用this是谁,this经常变化
2、bind是function中的方法,类似call和apply,为方法绑定this
call和apply直接调用方法,bind先绑定方法的this,不执行
let p=new Person("小叶子",18); // document.onclick=p.showName;//点击的时候提示“我叫undefined”,this指向[object HTMLDocument] document.onclick=p.showName.bind(p);//点击的时候提示“我叫小叶子”,this指向p对象
【Web全栈课程三】ES6特性介绍(下)》见:https://segmentfault.com/a/11...
文章版权归作者所有,未经允许请勿转载,若此文章存在违规行为,您可以联系管理员删除。
转载请注明本文地址:https://www.ucloud.cn/yun/107567.html
摘要:示例运行函数弹出弹出函数接收参数,返回值。其中,返回一个对象,是的返回值,代表函数是否执行完成。 ES6特性介绍(下) ES6新的标准,新的语法特征:1、变量/赋值2、函数3、数组/json4、字符串5、面向对象6、Promise7、generator8、ES7:async/await 《【Web全栈课程二】ES6特性介绍(上)》见:https://segmentfault.com/a...
摘要:的另一个核心特性,苹果表示也正在开发中,按开发进度可能几个月后就能与我们见面。是基于的本地化数据库,支持以及浏览器环境。 前端每周清单专注前端领域内容,以对外文资料的搜集为主,帮助开发者了解一周前端热点;分为新闻热点、开发教程、工程实践、深度阅读、开源项目、巅峰人生等栏目。欢迎关注【前端之巅】微信公众号(ID: frontshow),及时获取前端每周清单。 本期是 2017 年的最后一...
摘要:没有耐心阅读的同学,可以直接前往学习全栈最后一公里。我下面会罗列一些,我自己录制过的一些项目,或者其他的我觉得可以按照这个路线继续深入学习的项目资源。 showImg(https://segmentfault.com/img/bVMlke?w=833&h=410); 本文技术软文,阅读需谨慎,长约 7000 字,通读需 5 分钟 大家好,我是 Scott,本文通过提供给大家学习的方法,...
摘要:并总结经典面试题集各种算法和插件前端视频源码资源于一身的文档,优化项目,在浏览器端的层面上提升速度,帮助初中级前端工程师快速搭建项目。 本文是关注微信小程序的开发和面试问题,由基础到困难循序渐进,适合面试和开发小程序。并总结vue React html css js 经典面试题 集各种算法和插件、前端视频源码资源于一身的文档,优化项目,在浏览器端的层面上提升速度,帮助初中级前端工程师快...
阅读 2914·2021-11-11 16:55
阅读 500·2021-09-27 13:36
阅读 1031·2021-09-22 15:35
阅读 2835·2019-08-30 12:46
阅读 3099·2019-08-26 17:02
阅读 1800·2019-08-26 11:56
阅读 1277·2019-08-26 11:47
阅读 407·2019-08-23 17:01