let/const

变量和常量

不能重复定义

case1

{
//js
var a = 10
a = 20
// es6
let b = 10
b = 30
const c = 10
c = 40 //报错
}

存在块级作用域

case2

{
const obj = {
a: 10
}
obj.b = 20
}

多行字符串/模板变量

case

{
var name = 'susan', age = 18, html = ''
//JS
html += '<div>' +
'<p>' + name + '</p>' +
'<p>' + age + '</p>' +
'</div>'
//ES6
html += `<div>
<p>${name}</p>
<p>${age}</p>
</div>
`
}

解构赋值

case1

{
var obj = {
a: 10,
b: 20
}
// JS
var a = obj.a
var b = obj.b
// ES6
let {a, b} = obj
}

case2

{
function fn(){
return {
a: 10,
b: 20
}
}
let {a, b} = fn()
console.log(a, b)
}

块级作用域

case

{
var arr = [1, 2, 3, 4, 5]
// JS
for(var i = 0; i < arr.length; i++) {}
console.log(i)
// ES6
for (let j = 0; j < arr.length; j++) {}
console.log(j)
}

函数默认参数

case

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

箭头函数

case1

{
var arr = [1, 2, 3, 4, 5]
// JS
var arr1 = arr.map(function(item) {
return item+1
})
console.log(arr1)
// ES6
let arr2 = arr.map(item => item+1)
let arr3 = arr.map((item, index) => {
return item+index
})
console.log(arr2)
console.log(arr3)
}

case2

{
function fn() {
var arr = [1, 2, 3, 4, 5]
console.log('fn: '+this)
arr.map(function(item){
console.log('JS: '+this)
})
arr.map(item=>{
console.log('ES6: '+this)
})
}
fn.call({a:10})
}

分析:第一个this是{a:10},第二个this是window对象,第三个this是{a:10}。

Class

先回顾下JS构造函数

case

{
function MathHandle(x,y){
this.x=x
this.y=y
}
MathHandle.prototype.add=function(){
return this.x+this.y
}
var m = new MathHandle(1,2)
console.log(m.add())
}

然后我们看下class语法

{
class MathHandle {
constructor(x,y){
this.x=x
this.y=y
}
add(){
return this.x+this.y
}
} var m = new MathHandle(1,2)
console.log(m.add())
console.log(typeof MathHandle)
console.log(MathHandle === MathHandle.prototype.constructor)
console.log(m.__proto__ === MathHandle.prototype)
}

上面case我们后面添加了2个console

typeof MathHandle // function

MathHandle === MathHandle.prototype.constructor // true

m.__proto__ === MathHandle.prototype // true

我们可以看出class是语法糖,它的本质还是function

继承

先看下JS的继承如何书写

case

function Animal(name){
this.name = name
this.eat = function(){
console.log(this.name + ' eat')
}
}
function Dog(name){
Animal.call(this, name)
this.bark = function(){
console.log(this.name + ' bark')
}
}
Dog.prototype = new Animal()
var dog = new Dog('hashiqi')
dog.bark()
dog.eat()

ps:原型链继承可以继承构造函数里面以及原型链上的属性和方法,实例化子类的时候没法给父类传值。对象冒充继承,没法继承原型链上的属性和方法。

然后看下es6继承如何实现

{
class Animal{
constructor(name){
this.name=name
}
eat(){
console.log(`${this.name}+ eat`)
}
}
class Dog extends Animal{
constructor(name){
super(name)
this.name=name
}
bark(){
console.log(`${this.name} bark`)
}
}
const dog = new Dog('gou')
dog.bark()
dog.eat()
}

 Promise的基本语法

解决Callback Hell

case

{
function loadImg(src, callback, fail) {
var img = document.createElement('img')
img.onload=function(){
callback&&callback(img)
}
img.onerror=function(){
fail()
}
img.src=src
}
var src='https://......jpeg'
loadImg(src, function(){
console.log('success')
}, function(){
console.log('fail')
})
}

case2

{
function loadImg(src) {
const promise = new Promise(function(resolve, reject){
var img = document.createElement('img')
img.onload=function(){
resolve(img)
}
img.onerror=function(){
reject()
}
img.src=src
})
return promise
} var src='https://.....jpeg'
var result = loadImg(src)
result.then(function(img){
console.log('success', img)
}, function(){
console.log('fail')
})
result.then(function(img){
console.log('success', img.height)
})
}

new Promise  并返回promise

有两个函数参数,函数有resolve,reject

成功执行resolve,失败调用reject

then监听结果

模块化

case1

export let A = 123

export function test(){
console.log('test')
}
export class Hello {
test(){
console.log('hello')
}
}
import {A, test, Hello} from './a'

console.log(A, test, Hello)
import * as m from './a'

console.log(m.A, m.test, m.Hello)

case2

let A = 123

function test(){
console.log('test')
}
class Hello {
test(){
console.log('hello')
}
}
export default{
A,
test,
Hello
}
import m from './a'

console.log(m.A, m.test, m.Hello)

注意有无default

JS高级-ES6的更多相关文章

  1. js高级-面向对象继承

    一.工厂模式创建对象及优缺点 继承就是把公共的部分抽象出来作为父类,基类.吃饭,跑步等 var a = {}; //批量创建不方便,不能重复设置公共属性的代码 //工厂模式出现了,创建10个Cat对象 ...

  2. JS高级(摘自简书)

    JS高级 1. 访问对象属性(方法也是属性)的通用方式:obj['属性名'] 1. 属性名包含特殊字符,如"-".空格,访问:obj['content-type'] 2. 属性名不 ...

  3. js高级之函数高级部分

    基于尚硅谷的尚硅谷JavaScript高级教程提供笔记撰写,加入一些个人理解 github源码 博客下载 原型与原型链 prototype : 显式原型属性,它默认指向一个Object空对象(即称为: ...

  4. JS高级前端开发群加群说明及如何晋级

    JS高级前端开发群加群说明 一.文章背景: 二. 高级群: 三. 加入方式: 四. 说明:   一.文章背景: 去年年初建了几个群,在不经意间火了,一直排在“前端开发”关键字搜索结果第一名.当然取得这 ...

  5. 前端进阶试题css(来自js高级前端开发---豪情)既然被发现了HOHO,那我就置顶了嘿嘿!觉得自己技术OK的可以把这套题目做完哦,然后加入高级前端的社区咯

    http://www.cnblogs.com/jikey/p/4426105.html js高级前端开发加群方法(此群很难进,里面纯技术,严禁广告,水群) 完整题目做完发邮箱(jikeytang@16 ...

  6. Node.js高级编程读书笔记Outline

    Motivation 世俗一把,看看前端的JavaScript究竟能做什么. 顺便检验一下自己的学习能力. Audience 想看偏后台的Java程序员关于前端JavaScript的认识的职业前端工程 ...

  7. 读JS高级——第五章-引用类型 _记录

    <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/ ...

  8. js高级程序设计笔记之-addEventListener()与removeEventListener(),事件解除与绑定

    js高级程序设计笔记之-addEventListener()与removeEventListener(),事件解除与绑定 addEventListener()与removeEventListener( ...

  9. 《JS高级程序设计》笔记 —— 解析查询字符串

    今天在继续翻阅<JS高级程序设计>的时候,正好翻到location对象这一小节,其中有一部分就是讲的解析查询字符串.看到这个内容立马想到了做去哪儿秋招笔试题的时候有这么一道题. 去哪儿笔试 ...

随机推荐

  1. 公网IP被别人恶意解析的后果

    在网上看的一个案例,说是自己网站的IP被别的域名恶意解析了,恶意网站没有备案,IP地址为没有备案的域名提供了正常的网站服务,导致对应的IP也被封了. 检查方法:telnet xxx.me 80端口不通 ...

  2. DOM获取元素的方法

    DOM:document object module 文档对象模型 DOM就是描述整个html页面中节点关系的图谱,如下图. 1,通过ID,获取页面中元素的方法:(上下文必须是document) do ...

  3. redis不重启,切换RDB备份到AOF备份

    确保redis版本在2.2以上 [root@pyyuc /data ::]#redis-server -v Redis server v= sha=: malloc=jemalloc- bits= b ...

  4. jvm内存溢出问题

     Java内存溢出详解 一.常见的Java内存溢出有以下三种: 1. java.lang.OutOfMemoryError: Java heap space ----JVM Heap(堆)溢出 J ...

  5. Android开发 ---基本UI组件4:拖动事件、评分进度条、圆圈式进度条、进度条控制

    Android开发 ---基本UI组件4 1.activity_main.xml 描述: 定义了一个按钮 <?xml version="1.0" encoding=" ...

  6. Linux Shell基础(下)

    Linux Shell基础(下) 目录 一.shell特殊符号cut命令 二.cut.sort.wc.uniq命令 三.tee.tr.split命令 四.简易审计系统 五.fork, exec, so ...

  7. 微信小程序用setData给数组对象赋值

    假如现在要给数组marker中的对象属性赋值 data: { marker: [ { latitude: ' ' , longitude: ' ' } ] },   在方法中的写法为   fetchJ ...

  8. tomcat 启动脚本走过的坑

    最近由于 程序写的问题 tomcat经常需要重启,所以就让我写给监控tomcat并启动的脚本 例: 看着一起正常 然后就写到 crontab 计划任务里了 后来发现不管用, 找了好多文档 就是找不到问 ...

  9. Dubbo透传traceId/logid的一种思路

    前言: 随着dubbo的开源, 以及成为apache顶级项目. dubbo越来越受到国内java developer欢迎, 甚至成为服务化自治的首选方案. 随着微服务的流行, 如何跟踪整个调用链, 成 ...

  10. SpringMVC 的<mvc:resources>使用映射路径展示文件服务器上的图片

    <servlet> <servlet-name>springMVC</servlet-name> <servlet-class>org.springfr ...