ES6

关于ES6

  • 开发环境已经普及使用
  • 浏览器环境却支持不好(需要开发环境编译)
  • 内容很多,重点了解常用语法
  • 面试:开发环境的使用,重点语法的掌握

问题

  • ES6模块化如何使用,开发环境如何打包?
    模块花的基本语法
/* util1.js */
export default {
  a:100
}

/* util2.js */
export function fn1() {
  alert('fn1')
}

export function fn2() {
  alert('fn2')
}


/* index.js */
import util1 from './util1.js'
import { fn1, fn2 } from './util1.js'
console.log(util1)
fn1()
fn2()

开发环境的配置

电脑有node环境,运行npm init
npm install --save-dev babel-loader @babel/core
/*webpack.config.js*/
module: {
  rules: [
    { test: /\.js$/, exclude: /node_modules/, loader: "babel-loader" }
  ]
}

创建.babelrc文件
npm install @babel/preset-env --save-dev
/*.babelrc中的配置*/
{
  "presets": ["@babel/preset-env"]   // ES6转ES5语法
}

我们不仅需要用@babel/preset-env做语法的转换,还需要把缺失的变量或者函数,补充到低版本浏览器,
怎么补充呢,需要借助@babel/polyfill把这些缺失的变量或者函数,补充到低版本浏览器

npm install --save @babel/polyfill

关于JS众多模块化标准

一开始没有没有模块化
AMD成为标准,require.js(也有国内的CMD,很少用)
前端打包工具,使得nodejs模块化(commonJS模块规范)可以被使用
ES6出现,想统一现在所有模块化标准
nodejs积极支持,浏览器尚未统一
你可以自早lib(库),但是不要自造标准

总结

语法: import export  注意有无(default)
环境:babel编译ES6语法,模块化可用webpack,rollup
扩展:说一下自己对模块化标准统一的期待
  • class和普通构造函数的有何区别?
    js构造函数
function Animal() {
    this.name = 'name'
}

Animal.prototype.say = function(){
  alert(this.name)
}

const cat = new Animal()
cat.say()

Class语法

class Animate {
  constructor() {
    this.name = 'cat'
  }
  say(){
    alert(this.name)
  }
}
const cat = new Animal()
cat.say()

语法糖

// 所谓的语法糖,就是两种写法本质是一样的,但是第二种写法更加简单,更加易写。
class Animate { ... }
typeof Animate    // function 
Animate  === Animate.prototype.constructor  // true
cat.__proto__  ===  Animate.prototype  // true

class继承

class Animate {
  constructor() {
    this.name = 'cat'
  }
  eat() {
    console.log('eat something')
  }
}

class Dog extends Animate {
  constructor(name,color) {
    super(name)
    this.color = color
  }
  say() {
    console.log(this.name)
  }
}

const dog= new Dog('taidi')
dog.eat()
dog.say()

class总结:

class 在语法上更加贴合面向对象的写法
calss实现继承,更加易读,易理解
更易于写java等后端语言的使用
本质还是语法糖,使用prototype
  • Promise的基本使用和原理
    Promise的出现就是为了解决 callback hell(回调地狱)
// 不用promise,写的一个加载图片的函数
function loadImg(src, callback, fail) {
  var img = document.createElement('img')
  img.onload = function () {
    callback(img)
  }
  img.onerror = function () {
    fail()
  }
  img.src = src
}

var src = 'https://www.imooc.com/static/img/index/logo-recommended.png'
loadImg(src, function (img) {
  console.log(img.width)
}, function () {
    console.log('加载失败')
})


// 用promise改造上边的函数
function loadImg(src) {
  const p = new Promise((resolve, reject) => {
    var img = document.createElement('img')
    img.onload = function () {
      resolve(img)
    }
    img.onerror = function () {
      reject(new Error('图片加载失败'))
    }
    img.src = src
  })
  return p
}

var src = 'https://www.imooc.com/static/img/index/loo-recommended.png'
loadImg(src).then((img) => {
  console.log(img.width)
  return img
}).then((img) => {
  console.log(img.height)
}).catch((err) => {
  console.error(err)
})

promise基本语法总结

new Promise实例,然后return
new Promise()接受函数作为参数,函数有resolve,reject两个参数
成功是执行resolve(),失败时执行reject()
then监听结果
  • 总结ES6的常用功能
1. let/const
let 定义变量,可以被重新赋值
const 定义常量,不能重新赋值
// js
var a = 10

a = 20 
//ES6
let b = 30
b = 40  // 正确
const c = 50
c = 60 // 报错


2. 多行字符串/模板变量  ``
//js
var name = 'zhangsan', age = 20, html = '';
html += '<div>';
html += '<p>' + name + '</p>';
html += '<p>' + age + '</p>';
html += '</div>';

//ES6
const name = 'zhangsan', age = 20
const html = `
  <div>
    <p>${name}</p>
    <p>${age}</p>
  </div>
`

3. 解构赋值
var arr1 = ['a', 'b', 'c']
console.log(obj1.a, obj1.b, obj1.c)  // 10,20,30
console.log(arr1[0])  //a

const obj2 = {
  a: 10,
  b: 20,
  c: 30
}
const {a , b} = obj2
console.log(a, b)  //10 20

let [o, p, q] = [1, 2, 3];
console.log(o)  // 1
console.log(p)  // 2
console.log(q)  // 3


4. 块级作用域
var obj = {
  a: 10,
  b: 20,
  c: 30
}
for (var item in obj) {
  console.log(item)  // a,b,c
}
console.log(item)   // c

const obj2 = {
  a: 10,
  b: 20,
  c: 30
}

for (let item in obj2) {
  console.log(item)  // a,b,c
}
console.log(item)  // item is not defined
5. 函数默认参数
// js
function fn(a, b) {
  if (a == null) {
    a = 0
  }
}

// ES6
function fn(a = 0, b) {
  
}


6. 箭头函数
// js
var arr1 = [1, 2, 3]
var res = arr1.map(function (item) {
  return item+1
})
console.log(res)  //[2, 3, 4]
  
// ES6
const arr2 = [1, 2, 3]
// 如果函数只有一个参数,并且函数体中只有一行,可以这么写
const res2 = arr2.map(item => item + 1)

// 当然如果函数有2个参数,并且函数体多余1行的化,要这么写
const res3 = arr2.map((item, index) => {
  console.log(index)
  return item *2
})

console.log(res2)  // [2, 3, 4]
console.log(res3)  //[2, 4, 6]


function fn() {
  console.log(this)   // {a:100]}
  var arr1 = [1, 2, 3]
  var res = arr1.map(function (item) {
    console.log('js' + this)  // window  JS里比较坑的地方,明明是在map函数里的this结果还是指向window
    return item+1
  })

  const arr2 = [4,5,6]
  const res2 = arr2.map(item => {
       console.log('ES6',this)  // {a:100}   箭头函数就完美的解决了上边函数里的this的指向问题
       item + 1
    }
  )
}

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