ES6的学习(一)

箭头函数
  • 与函数表达式相比,箭头函数有更短的语法。
    function (i) { return i * 2} //ES5
    (i) => i * 2    //ES6

复杂时需要{}包裹

    function (i, j) {
        i++
        j++
        return i + j
    }  // ES5
    (i, j) => {i++, j++, return i + j} // ES6
  • 箭头函数没有自身的this,从外层继承this。
  • 箭头函数通常是匿名的。
块级作用域
  • ES5中只有全局作用域与函数作用域,因此内层变量将会覆盖外层变量
  • let 提供块级作用域,let命名的变量只在当前块内起作用
  • const 声明的是常量,不可更改
var a = 1
var b = 2
var c = 3
if (true) {
  var a = 10  // 函数作用域
  let b = 20  // if块内的作用域
      c = 30  // es5解决方法
  console.log('a:' + a)
  console.log('b:' + b)
  console.log('c:' + c)
}
console.log('a:' + a)
console.log('b:' + b)
console.log('c:' + c)

var声明的变量在循环时新值会覆盖旧值,导致输出的变量都为最终值

var a = []
for (var i = 0; i < 9; i++) {
  a[i] = function () {
        console.log(i)
    }
}
a[2]() // 9

ES5中利用闭包解决这一问题

function test (index) {
        var testback = function () {
            console.log(index)
        }
        return testback
}
var a = []
for (var i = 0; i < 9; i++) {
  a[i] = test(i)
}
a[2]()

ES6中仅仅使用let即可解决

var a = []
for (let i = 0; i < 9; i++) {
  a[i] = function () {
        console.log(i)
    }
}
a[2]() // 2

const声明常量

const a = 1
a = 10
console.log(a)
模版字符串
  • ES5中,当需要插入大量html文档时需要引用template插件或是用大量‘+’连接
  • 模版字符串可直接用'``'标识起始
  • 模板字符串可以包含嵌入式表达式,对象字面量,甚至是函数
var myName = 'xunfeng'
console.log(`your name is ${myName}`) // your name is xunfeng
var people = {
  name: 'xunfeng',
  age: 20
}
console.log(`your name is ${people.name}, your age is ${people.age}`)
// your name is xunfeng, your age is 20
function fn () {
  return 'function'
}
console.log(`可以嵌套函数:${fn()}`)
  • 模板字符串可以在表达式内进行数学运算
var a = 10
var b = 20
console.log(`a+b=${a+b}`) //a+b=30
  • 模板字符串内保留空格,不需要换行符即可换行
console.log(`第一行
第二行`)
// 第一行
// 第二行
数值扩展 Numeric Literals
  • 支持二进制(0b)和八进制(0o)新写法
0b111110111 === 503 // true
0o767 === 503 // true
将二进制或八进制转换成十进制
Number('0b111')  // 7
Number('0o10')  // 8
  • 新的方法
Number.isFinite() // 检查一个数值是否为有限
Number.isNaN()  // 检查一个数值是否为NaN
Number.isInteger()  // 检查一个数值是否为整数
Number.EPSILON  // 极小的常量,设定的误差范围
  • Math对象的扩展
Math.trunc()  // 去除一个数的小数部分,返回整数部分
Math.sign() // 判断一个数到底是正数、负数、还是零
Math.cbrt() // 用于计算一个数的立方根
Math.hypot() // 返回所有参数的平方和的平方根
Math.expm1() // Math.expm1(x)返回ex - 1,即Math.exp(x) - 1
Math.log1p() // Math.log1p(x)方法返回1 + x的自然对数
Math.log10() // Math.log10(x)返回以10为底的x的对数
Math.log2() // Math.log2(x)返回以2为底的x的对数
Math.sinh(x) // 返回x的双曲正弦(hyperbolic sine)
Math.cosh(x) // 返回x的双曲余弦(hyperbolic cosine)
Math.tanh(x) // 返回x的双曲正切(hyperbolic tangent)
Math.asinh(x) // 返回x的反双曲正弦(inverse hyperbolic sine)
Math.acosh(x) // 返回x的反双曲余弦(inverse hyperbolic cosine)
Math.atanh(x) // 返回x的反双曲正切(inverse hyperbolic tangent)
  • 指数运算符 **
console.log(2 ** 3) // 8
对象部分扩展
  • 变量和函数可直接作为对象的属性和方法
<!-- ES6 -->
var object = {
  value: 42,
  toString() {
    return this.value
  }
}
console.log(object.toString() === 42) // true
<!-- ES5 -->
var object = {
  value: 42,
  toString: function toString() {
    return this.value
  }
}
console.log(object.toString() === 42) // true
  • 计算属性名可以用变量当做对象的属性名
var computed = 'calc'
var comFn = {
  [computed + 'xun']: 'hi',
  [computed + 'feng']: 'hello'
}
console.log(comFn['calcxun']) // hi
console.log(comFn['calcfeng']) // hello
解构
  • 允许从数组或对象中提取数据并对变量赋值
var a = 1
var b = 2
var c = {a, b}
console.log(c) // {a: 1, b: 2}

var c = {a: 1, b: 2}
var {a, b} = c
console.log(a, b) // 1 2
默认参数 default
  • ES6可以指定默认参数在arguments中
function myFn(mes = 'hello') {
  console.log(mes)
}
myFn(); // hello
myFn('hi'); // hi
其他参数 rest
  • 允许将部分参数作为一个单独的数组
function myFn(a, ...b) {
  var result = a
   for(let i = 0; i<b.length; i++) {
     result += b[i]
   }
   return result
}
console.log(myFn(1,2,3,4)) // 10
迭代器 iterators && for of
  • 可以直接遍历容器的内容
var a=['x', 'y', 'z']
for (let i of a){
  console.log(i)  // x y z
}
类 classes
  • constructor(构造方法)
    创建实例对象时设定的属性
  • extends(继承)
    class之间可以通过extends相互继承,相比于原形链更简洁易懂
  • super
    在子类constructor中调用父类的constructor
  • getter && setter
    在Class内部可以使用get和set关键字,对某个属性设置存值函数和取值函数,拦截该属性的存取行为。
  • static 静态方法
    不会被实例对象继承,只能通过类或类继承来调用
class student {
  constructor(name, age) {
    this.name = name
    this.age = age
  }
  getName () {
    console.log(this.name)
  }
  get myAge() {
    return this.age
  }
  set myAge(value) {
    this._age = value
  }
  static bar() {
    console.log('static')
  }
}
// 创建实例对象
var xun = new student('xun', 20)
xun.getName() // xun
xun.bar() // TypeError: xun.bar is not a function. (In 'xun.bar()', 'xun.bar' is undefined)
student.bar() // static
// 继承
class Tom extends student {
  constructor(name, age, sex) {
    super(name, age)
    this.sex = sex
  }
}
var tom = new Tom('tom', 20, 'man')
console.log(tom)  // 实例对象属性
tom.myAge = 22
console.log(tom._age) // 22
console.log(tom.myAge) // 20
模块 modules
  • export 暴露对外接口
  • import 导入其他模块接口
<!-- export.js -->
//命名导出
export var foo = ...
export let bar = ...
export const MY_CONST = ...

export function myFunc() {
   ...
}
export function* myGeneratorFunc() {
   ...
}
export class MyClass {
   ...
}
// default 导出
export default 123
export default function (x) {
   return x
}
export default x => x;
export default class {
   constructor(x, y) {
       this.x = x
       this.y = y
   }
};
//也可以自己列出所有导出内容
const MY_CONST = ...
function myFunc() {
   ...
}

export { MY_CONST, myFunc }
//或者在导出的时候给他们改个名字
export { MY_CONST as THE_CONST, myFunc as theFunc }

//还可以导出从其他地方导入的模块
export * from 'src/other_module'
export { foo, bar } from 'src/other_module'
export { foo as myFoo, bar } from 'src/other_module'

<!-- import.js -->

// Default exports and named exports
import theDefault, { named1, named2 } from 'src/mylib'
import theDefault from 'src/mylib'
import { named1, named2 } from 'src/mylib'

// Renaming: import named1 as myNamed1
import { named1 as myNamed1, named2 } from 'src/mylib'

// Importing the module as an object
// (with one property per named export)
import * as mylib from 'src/mylib'

// Only load the module, don’t import anything
import 'src/mylib'
参考链接

30分钟掌握ES6/ES2015核心内容
ECMAScript 6 入门
ECMAScript 6 equivalents in ES5

如有错误,欢迎指正。

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

推荐阅读更多精彩内容