ES6 1

最近很多学生面试时候被问到ES6的问题,对于ES6这套标准,确实很多写法提供了便利的方式,我根据一个网站上得汇总,对每一条逐一的解释,这个过程也能发现自己对之前JS不足之处.
附:http://es6-features.org/#Constants

1.常量 Constants

在C语言里可以用const这个关键词来修饰定义出来的变量,即const int a = 10;,也可以使用宏,代替一部分不变的内容,但是在JS里,是没有常量的,这是ES6添加的新的内容

const PI = 3.141593; // ES6

这样PI就是一个常量了,跟C语言定义的方式类似,但是在之前的版本如果定义一个常量就不像ES6里这么简单,需要使用Object.defineProperty()方法对属性进行读写等操作设置

var stu = {
  name:"你好",
  age:20
 }
 Object.defineProperty(stu, "name", {
  configurable: false,
  writable: false,
  enumerable: false,
  value: null,
  set: undefined,
  get: undefined
 })

这个方法需要三个参数:
参数1是需要设置的对象,这里就是stu;
参数2是要设置的属性名,
参数3:这里需要设置属性的操作,需要把对应的设置写成一个对象
实例代码里写了六个:
1.configurable:是否可以删除属性,是否可以修改属性的writable,enumerable的值;
2.writable:读写性设置,是否能对属性进行赋值,设置成false就变成只读属性;
3.enumerable:对象想进行遍历需要使用forin,for(var key in stu),如果属性name设置了enumerable为false之后,就不能使用forin进行遍历这条属性,这条属性也称为枚举设置
4.value:设置属性的默认值,即使对象的属性有初始值,还是以value值为主导
5.set:对应放一个方法,当属性被赋值的时候会被调用,但是如果writable设置成false的话,写这个会报错,报错内容 Cannot both specify accessors and a value or writable attribute,所以这个属性用得时候要看对应读写属性设置
6.get:这个跟set类似,获取属性值的时候会调用
当然这个还有Object.getOwnPropertyDescriptor()能获得属性对应设置内容
了解完这方法在看ES5的常量方法就不难理解

Object.defineProperty(window, "PI", { 
      value: 3.141593,
      enumerable: true,
      writable: false, 
      configurable: false
})

通过给window设置一个属性PI,这个属性不能修改,不能遍历,从而就实现了常量的设置,照比ES6,确实麻烦一些

2.作用域 Scoping

在使用JS的时候,应该会发现,for循环定义的i还能在循环外使用,但是函数定义的变量在函数外是使用不了的,这源于JS使用的是函数级作用域,而OC,C等使用的是块级作用域,也就是一个大括号就是一个作用域.
ES6有了变化,不在单一的使用var,而是可以使用let这个关键字,JS的let能限制变量的作用域,用法跟var类似,但还是有一些不同的地方

首先,let是没有变量提升的

console.log(a);   // 报错,变量没有定义
let a = 100;

其次,let修饰的变量作用在块级作用域

for(let i = 0; i < 10; i++) {
    console.log(i);
   }
console.log(i); // 报错,变量没定义

之前作用域最闹心的问题就是闭包,就拿闭包举个例子,循环给标签绑定点击事件,打印下标,解决方法还有别的,这里就说闭包这种

  <div>1</div>
  <div>2</div>
  <div>3</div>
  <div>4</div>
  <div>5</div>
// ES5 代码
var divs = document.getElementsByTagName("div");
    for(var i = 0; i < divs.length; i++) {
        (function(index) {
            divs[index].onclick = function() {
            alert(index);
          }
      })(i)
   }

因为i还是函数作用域,所以要通过闭包改变i的作用范围,用index进行替换,很麻烦,而且不好理解,但是到了ES6之后,有了let,这种写法就可以不用了

// ES6 代码
var divs = document.getElementsByTagName("div");
   for(let i = 0; i < divs.length; i++) {
      divs[i].onclick = function() {
         alert(i);
      }
   }

效果是一样的,let完全限制了i的使用范围,解决了之前的问题,代码确实越来越好理解

JS里在使用变量和函数的时候要注意代码的规范,使用变量和函数之前,一定要要先定义,这样就不会出现变量提升等跟常规C语言不同的代码书写习惯,JS在ES6里还是以函数级作用域为主,即使加了{},也有效果但是本质还是函数级作用域

3.箭头函数 Arrow Functions

在ES6里新添加了这种箭头操作符,这种操作符不是JS原创的,在JAVA和C#里都有这种操作符,这种操作符称为Lambda表达式,本质上就是一个匿名函数,简化匿名函数书写

var arr = ["宋江", "卢俊义", "吴用", "公孙胜", "关胜", "林冲"];
arr.forEach(function(value, index) {
      console.log(index + value);
})

这是JS里对数组遍历的forEach方法,里面需要加一个回调函数,这个函数就是一个匿名的函数,可以对这个函数用=>的方法进行简写

arr.forEach((value, index) => {
       console.log(value+index);
})

照比之前写法,这种箭头函数写法就是去掉了function,形参和大括号之间用=>连接,其实就是一个匿名函数
在很多需要匿名函数的地方都可以使用这种方法,比如数组的map方法,也能使用箭头函数来替换

// ES5
var newArr = arr.map(function(value, index){
       return value + index;
})
// ES6
var newArr = arr.map((value, index) => value + index);

如果是给标签添加事件也可以

div.onclick = ()=>{
 console.log(111);
}

如果需要event就在括号里填上event,但是这么写完之后,可能大括号里没有代码提示,那就相信自己吧

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

推荐阅读更多精彩内容

  • 特别说明,为便于查阅,文章转自https://github.com/getify/You-Dont-Know-JS...
    杀破狼real阅读 567评论 0 0
  • 1.ES6 规定暂时性死区和let、const语句不出现变量提升,主要是为了减少运行时错误,防止在变量声明前就使用...
    长情你好阅读 449评论 0 0
  • 读第二部分,想起《大清王朝》,当时陈道明饰演的康熙,当着众位大臣面,批判贪官污吏。想必古往今来的君王,至少是清楚整...
    Tyrant先生阅读 596评论 0 0
  • 好吧,我半夜睡不着,还是爬起来写回忆录了。基于好基友的启发和感慨,我决定写写关于我人生里重要的伙伴与过客。今天开篇...
    菠萝和萝卜阅读 420评论 2 1