ES6语法学习笔记

一、全局变量以及对应的作用域、this动态作用域

1)变量提升

在es5中var变量 在一个作用域内,变量的声明会提升,也就是一个作用域里面,无论变量声明的位置在什么地方,在执行过程中,都会把声明提到代码最前执行

 funcation example(){
     console.log(a);
     var a;
 }
 # 输出内容:undefined 因为a这个变量已经声明 ,但是并没有初始化内容
2)全局变量的声明和属性值的区分
# 在index.js中
var a = 0 #声明了一个window的全局变量
a = 0 # 声明了一个window属性

在实际用到的过程中,看似效果差不多,但是其实本质并不同。

3)闭包的作用
#在es5中

function fun1(){
    var a = 2;
    function fun2(){
        return a + 4;
    }
    return fun2;
}
输出:6

在es5中,如果在fun2函数中找不到变量a的声明,则会一层一层向上直到找到声明,否则会报错。如下就实现了闭包。

4)块变量 let 和const

在es5中var变量根据作用域分有:全局作用域、局部作用域

  #es5用法
  function test(){
      var a = 1;
      
  }

二、array数组的遍历、转换、生成、查找有哪些相关的函数

1)数组遍历
  • forEach 输出的每一项都是key所对应的value值,不支持continue,break这些关键词
 let arry = [2,3,4,5];
 array.forEach(functon(item){
     console.log(item)
 })
  • 如果回调函数返回了false时 则结束遍历,否则继续循环
arry.every(funcation(item){
    console.log(item)
    return true
})
  • for ....in 循环 获取到的是key 也就是获取索引值,针对的是对象,数组可以看做是一种特殊的对象
for(let i in arry){
    console.log(array[i])  
}
  • for ... of 循环,获取到的key所对应的value值
  for(let item of arry){
      console.log(item)
  }
2)数组的查找
  • 使用过滤器filter,筛选过程中,无论是否寻找到合适的内容,都会返回一个数组。
   var arr = [1,2,3,4,5,6];
   arr.filter(item=>{
       return item%2 == 0
   })
   输出:[2,4,6]
  • 使用find进行查找,只会查找到第一个符合条件的第一个value,而findIndex返回索引
array.find(function(item){
    return item % 2 == 0;
})
输出:2
array.findIndex(funcation(item){
    return item % 2 == 0;
})
输出:1

三、es6和es5在class类的原型链中挂载一个函数

  • es5 定义构造函数
let Animal = function(type){
  this.type = type;
  this.fun1  = function(){
      console.log("输出内容")
  }
}
let dog = mew Animal("dog");
#在原型链挂载函数,所有实例公用一个
dog.constructor.prototype.eat =function(){
      console.log("输出内容")
  }
  • es6中无需手动挂载,自动实现
 class Animal(){
     contructor(type){
         this.type = type;
     }
     eat(){
         consolo.log("自动挂载在原型链中")
     }
 }

四、es6使用set和get进行class属性的读写操作(内含闭包)

let realage =7 ;
  class example(){
      get age(){
          return  realage;
      }
      set age(val){
          realage = val;
      }
  }
  let ww = new example();
  console.log(ww.age);
  ww.age = 10;
  console.log(ww.age);
  输出:7,10

五、es5与es6的继承

//在es5中继承
let dog = function(){
//初始化构造函数
Animal.call(this,"dog")  //使用call改变this的指向
//在子类中挂载一些方法
this.run  = function(){
////
}
}
//把子类原型链指向到父类原型链
this.dog.prototype = this.Animal.prototype

总结es6在class的声明、 属性、方法、继承

  class parent{
  //重定义构造函数
     constructor(type){
         this.type = type //定义属性
     }  
 //定义静态·方法
 static walk(){
     console.log("This is a static methods!")
 }
  func1(){
      console.log("自动被挂载在原型链的method")
  } 
  class child extends parent(){
     constructor(type){
        super(type)  //继承
         this.type = type //定义属性
     }  
     this.run = funcation(){
         console.log("自定义函数")
     }
  }
}

六、 处理不确定参数

对于es5 使用arguements获取执行的参数

function sum(x,y,z){
   console.log(Array.from(this.arguement))
    return x + y + z;
}

在es6 使用 ...num 浅拷贝的形式获取 Rest parameter

function sum(...data){
    let nums = 0;
    data.forEach(function(item){
        nums += item;
    })
    return data;
}
let datas=[1,2,4];
sum(...datas);

九、Arrow Function (箭头函数)

箭头函数是对函数写法一个简化,对this的指向也有了一个变化,之前的函数 是谁执行函数this指向谁,而箭头函数中的this是定义时的绑定

# 当参数有且仅有一个的时候小括号可以省略,当函数体内容是表达式花括号可以省略
let arrow = () =>{}

下面举一个经典的例子

let x = 11;
let obj={
 x:22,
 say:()=>{
   console.log(this.x);
 }
}
obj.say();
//输出的值为11

原因如下,say和箭头函数相当于是obj对象中key和value的关系,say函数本身所在的对象是obj,可是因为obj只有在函数被调用,或者通过构造函数new Object()的形式才会有this,因此this向上执行继承父类window的this

十、对象属性

在es6中,对对象的使用更加便捷化,对象中的key值可以是表达式、变量,且当key和value相同,可以省略很多东西

let x = 1, y = 2, z=3;  
let obj = {
    x,
    y,
    [z+x]:5,
    <!--eat(){-->
    <!--    console.log("这个是一个方法");-->
    <!--}-->
}
console.log(obj);
输出:{x:1,y:2,4:5}

十一、set数据结构

set对象的增删改查,以及常用的一些函数,最大的特点是会自动去重,但是不可以修改内容,遍历方法可参照数组遍历方法。

let  s =new Set();//声明一个set对象
s.add(1).add(2);  //增加一个元素
console.log(s.keys(),s.values(),s.entries());//获取所有key、value值、所有的内容
s.size  //获取元素个数
s.has(1) //true 获取某元素是否存在
s.delete(1)//删除某个元素

十二、map数据结构

map对元素有一定的要求,需要是可遍历的,并且每一个元素都有对应的键值对,相对于来说比set类型的数据性能更好,以下是和set数据结构有些不同的部分

let m = new Map([[2,"value1"],[4,"value3"]]); //声明形式如下,[2,"value1"] 是其中的一个元素
m.set(5,"values");  //增加元素
m.set(2,"value11"); //修改元素
m.has(2)  //判断的是key值
m.get(5)  //获取对应的value
# 两种遍历方式
m.forEach(function(value,key){  //注意key和value的位置
    console(value,key);
})
for(let [key,value] of m){
     console(value,key);
}

十三、字符串模板

字符串模板可以解决在和字符串拼接过程中遇到 字符串换行、包含变量、逻辑运算的简洁方法

 const price = 10;
 const retails = "retail"
 const showText1 = `您购买的价格是${price}`;  //和字符串常量中加入表达式
 const showText2 = `我是第一行
 我是第二行`  //可以直接识别模板
 function hanlePrice(strings,type){ //strings是获取到的
    let s1 = `这个是一个测试!`
     return `${strings[0]}${s1}`
 }
 let showText3 = handlePrice`您好${retail}`
 console.log(showText3)
 输出:您好这个是一个测试!

十四、解构赋值

解构赋值是对可遍历对象的取值做了一个极大的贡献,使得赋值的过程变得简洁.可以尝试的用在获取接口数据、函数参数的场景中。

  • 数组的解构赋值
let arry = [1,2,3,4];
let [one,two] = array;
console.log(one,two);
//输出:1,2
  • 获取需要的内容
let [one,,three] = array;
console.log(one,three);
//输出:1,3
  • 获取需要内容并且使用rest变量保留剩余内容
let [one,two,...last] = array;
console.log(one,two,last);
//输出:1,2,[3,4]
  • 解构对象
let option ={width:100,height:30}
let [width,height] = option
console.log(width,height);
//输出 100 30

let options ={
    size:{
        width:100,
        height:20
    },
    items:['Cakes','Dount'],
    extra:true
}
let [size:{width},items:[one]] = options;
console.log(width,one);
//输出:100,Cakes
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 211,639评论 6 492
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 90,277评论 3 385
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 157,221评论 0 348
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 56,474评论 1 283
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 65,570评论 6 386
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 49,816评论 1 290
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 38,957评论 3 408
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 37,718评论 0 266
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,176评论 1 303
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 36,511评论 2 327
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 38,646评论 1 340
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 34,322评论 4 330
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 39,934评论 3 313
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 30,755评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,987评论 1 266
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 46,358评论 2 360
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 43,514评论 2 348

推荐阅读更多精彩内容

  • [TOC] 参考阮一峰的ECMAScript 6 入门参考深入浅出ES6 let和const let和const都...
    郭子web阅读 1,773评论 0 1
  • 什么是ES6? ECMAScript 6.0 是继ECMAScript 5.1 之后 JavaScript 语...
    多多酱_DuoDuo_阅读 1,088评论 0 4
  • 第一章:块级作用域绑定 块级声明 1.var声明及变量提升机制:在函数作用域或者全局作用域中通过关键字var声明的...
    BeADre_wang阅读 825评论 0 0
  • 一、问:ES6是什么,为什么要学习它,不学习ES6会怎么样? 答: ES6是新一代的JS语言标准,对分JS语言核...
    水落斜阳阅读 1,269评论 0 19
  • 第一章 错误处理: 错误: 程序运行过程中,导致程序无法正常执行的现象(即bug) 现象: 程序一旦出错,默认会报...
    fastwe阅读 1,099评论 0 1