ES6的部分笔记
解构赋值
数组的解构赋值
const F4 = ['小沈阳','刘能','赵四','宋小宝']
let [xiao,liu,zhao,song] = F4
console.log(xiao)
console.log(liu)
console.log(zhao)
console.log(song)
对象的解构+简化写法
const zhao ={
name:'赵本山',
age:'不详',
xiaopin(){
console.log("wwww")
}
}
let {name,age,xiaopin} = zhao
console.log(name)
console.log(age)
console.log(xiaopin)
xiaopin()
箭头函数
箭头函数中的this是静态的,this始终指向函数声明时所在作用域下的this的值
function getName(){
console.log(this.name)
}
let getName2(){
console.log(this.name)
}
window.name = 'aaa',
const school = {
name:'bbb'
}
//直接调用
getName()
getname2()
//输出都是全局变量,aaa
//而call方法的调用
getName.call(school)
getName2.call(school)
//输出分别是bbb和aaa
不能作为构造实例化对象
let Person = (name,age) =>{
this.name = name;
this.age = age
}
let me = new Person('xiao',30)
console.log(me)
//报错。Person不是一个构造函数
不能使用arguments变量
let fn =()=>{
console.log(arguments)
}
fn(1,2,3)
//报错,arguments没有定义
箭头函数的简写
let add = (n) =>{
return n+n
}
console.log(add(9))
简写为
let pow = n => n+n
获取元素
<style>
div{
width:200px;
height:200px
background:#58a
}
</style>
...
<div id = "ad"></div>
<script>
//点击div,2s后变成粉色
let ad = document.getelementById('ad');
ad.addEventListener("click",function(){
/*
let _this = this;
//setTimeout是函数,其this指向window,而外层的回调函数是由ad调用的,所以是方法的形式,this指向ad
setTimeOut(function)(){
console.log(this)
_this.style.background = 'pink'
},2000
})
*/
setTimeOut(()=>{
//在箭头函数中,简单说就是自己没有this,所以如果它爹有他就用爹的爹没有就用window
console.log(this)
this.style.background = 'pink'
},2000
})
//从数组中返回偶数的元素
const arr = [1,6,9,122,23]
/*
const result = arr.filter(function(item){
if(item%2 ==0){
return true
}else{
return false
}
})
*/
const result = arr.filter(item =>item%2 === 0)
//箭头函数适合和this无挂你的回调,定时器,数组的方法回调,不适合和this有关的回调,事件回调,对象的方法
{
name:"sss",
getName:(){
this.name
}
//如果改为箭头函数的话,this会指向外层的
}
</script>
给函数传递默认初始值
function connect({localhost="127.0.0.1",username,password,port}){
console.log(host)
console.log(username)
console.log(password)
console.log(port)
//输出localhost root root 3306
}
connect({
host:'localhost',
username:'root',
password:'root',
port:3306
})
rest函数
rest参数用于获取函数的实参,用来代替arguments
rest参数要放到参数的最后,
function date(){
console.log(args)
}
date('111','22','3')
//以数组的形式输出
function fn(a,b,...args){
console.log(a)
console.log(b)
console.log(args)
}
fn(1,2,3,4,5,6)
//a 是1,b是2,args是数组[3,4,5,6]
rest的放在了函数声明的实参的位置
扩展运算符,是放在了函数的调用的实参里面
const aa =["11","22","33"]
function bbb(){
console.log(arguments)
}
bbb(...aa)
扩展运算符可实现数组的合并,克隆,
const a = ['1','2']
const b = ['11','22']
const c = [...a,...b]
console.log(c)
//數組的合并
const aa = ['a','b','c']
const bb = [...aa]
console.log(aa)
//数组的克隆
//将伪数组转为真正的数组
const divs = document.querySelectorAll('div')
const divArr = [...divs]
console.log(divArr)
Symbol
Symbol 的值是唯一的,用来解决命名冲突的问题,
Symbol值不能与其他数据进行运算,
Symbol定义的对象属性不能使用for …in循环遍历,但可以使用Reflect.ownKeys来获取对象的所有简明
Symbol()创建的两个不相等,但是Symbol.for()创建的两个相等
7种数据类型
U undefined
S String Symbol
O Object
N Null Number
B Boolean
//像对象中添加方法 up 和down
let game = {...}
//声明一个变量
let methods ={
up :Symbol()
down:Symbol()
}
game[methods.up] = function(){
console.log("111")
}
game[methods.down] = function(){
console.log("222")
}
console.log(game)
let youxi = {
name:"2222",
[Symbol('a')]:function(){
console.log("1")
}}
[Symbol('b')]:function(){
console.log("2")
}}
//Symbol是表达式,要加上中括号,//这里调用我只知道用另一种方式:先在对象youxi外定义变量let say = Symbol('say')再把对象youxi内部中括号的Symbol('say')替换成刚刚在外面定义的变量say,即[say]: function..最后在对象youxi外部调用:youxi[say]()。这样就可以调用"我可以发言"那个方法了
}
console.log(youxi)
具有这些属性的对象,会被覆盖掉默认的方法,使用你自定义的方法来实现功能,比如你重写了数组的length()方法,使用自己的方法计算长度
class Person{
static[Symbol.hasInstance](param){//可以控制false和true
console.log(param)
console.log("111")
return false
}
}
let o = {}
console.log(o instanceof Person)
const arr =[1,2,3]
const arr2 =[11,22,33]
arr2[Symbol.isConcatSpreadable]=false//控制arr2不可展开
console.log(arr.concat(arr2))
迭代器
const xiyou = ['11','22','33','44']
for(let v of xiyou){
console.log(v)
}
console.log(xiyou)
let iterator = xiyou[Symbol.iterator]()
//调用对象的next方法
console.log(iterator.next())
console.log(iterator.next())
console.log(iterator.next())
console.log(iterator.next())
console.log(iterator.next())
//每次返回一个新的值,到最后value返回undefined,done返回true
//声明一个对象
const banji = {
name:"111",
stus:[
'1',
'2',
'3',
'4'
]
[Symbol.iterator]{
let index = 0;
let _this = this
return {
next:function(){
if(index<_this.stus.length){
const result = {value:_this.stus[i],done:false}
index++
return result
}else{
return{
value:undefind,done:true
}
}
}
}
}
生成器
function * gen(arg){
console.log("hello generator")
console.log('arg')
let one = yield '111';
console.log(one)
let two = yield '222';
console.log(two)
yield '333';
console.log('4')
}
let iterator = gen('AAA')
//可以传入实参
//console.log(iterator)
//执行获取迭代器对象
console.log(iterator.next())//来控制输出执行
console.log(iterator.next('BBB'))
//第二次调next方法,传入的实参, 为第一次yield的整体返回结果
console.log(iterator.next('CCC'))
console.log(iterator.next('DDD'))
回调地狱
setTimeOut(()=>{
console.log(111);
setTimeOut(()=>{
console.log(222);
setTimeOut(()=>{
console.log(333);
},3000)
},2000)
},1000)
//解决回调地狱函数方法1
function one(){
setTimeOut(()=>{
console.log(111)
iterator.next()
},1000)
}
function two(){
setTimeOut(()=>{
console.log(222)
iterator.next()
},2000)
}
function three(){
setTimeOut(()=>{
console.log(333)
iterator.next()
},3000)
}
function * gen(){
yield one()
yield two()
yield three()
}
let iterator = gen()
iterator.next()
//解决回调地狱方法2
function getUsers(){
setTimeOut(()=>{
let data = '用户数据';
iterator.next(data)
},1000)
}
function getOrders(){
setTimeOut(()=>{
let data = '订单数据';
iterator.next(data)
},1000)
}
function getGoods(){
setTimeOut(()=>{
let data = '商品数据';
iterator.next(data)
},1000)
}
function * gen(){
let users = yield getUsers();
let orders = yield getOrders();
let goods = yield getGoods()
}
let iterator = gen()
iterator.next()
Promise对象
const p = new Promise(function(resolve,reject){
setTimeOut(function()
let data = '数据库中的用户数据'
resolve(data)
//状态成功
},1000)
/*状态失败
let err = '数据读取失败'
reject(err)
*/
})
p.then(function(value){
console.log(value)
},function(reason){
console.error(reason)
})
promise封装读取文件
const fs = require('fs')
//调用方法读取文件(多个任务会缩进)
fs.readfile('./...',(err,data)=>{
if(err) throw err//如果失败则抛出错误
console.log(data.toString())//如果没有出错,则输出内容
})
//使用Promise封装(多个任务不会缩进)
const p = new Promise(functon(resolve,reject){
fs.readFile('./...'.(err,data)=>{
if(err) reject(err)
resolve(data)
})
})
p.then(function(value){
console.log(value.toString())
},function(reason){
console.log("读取失败")
})
Promise封装AJAX请求
const p = new Promise((resolve,reject)=>{
//创建对象
const xhr = new XMLHttpRequest()
//初始化
xhr.open("GET","...api 的地址")
//发送
xhr.send()
//绑定事件,处理响应结果
xhr.onreadystatechange = function(){
if(xhr.readyState ===4){
if(xhr.status>=200&&xh4.status<300){
resolve(xhr.response)
}else{
reject(xhr.status)
}
}
}
})
//有了Promise就不用在上面修改添加内容,在下面的代码中修改
//指定回调
p.then(function(value){
console.log(value)
},function(reason){
console.error(reason)
})
const p = new Promise((resolve,reject)=>{
setTimeOut()=>{
reject('error')
},1000)
})
//then方法返回结果是Promise对象,对象状态由回调函数的执行结果决定,
//如果回调函数中返回的结果是非promise类型的属性,返回对象的成功的值
//
const result = p.then(value=>{
console.log(value)
//1.非promise类型的属性
//return 'iloveyou'
//2.是promise对象
//return new Promise((resolve,rejecct)=>{
//resolve('ok')
//reject('error')
// })
//3.抛出错误
throw new Error('出错了')
},reason=>{
console.log(reason)
})
console.log(result)
多个文件内容读取
const fs = require("fs")
fs.readfile('./...1',(err,data1)=>{
fs.readfile('./...2',(err,data2)=>{
fs.readfile('./...3',(err,data3)=>{
let result = data1 +'\r\n'+ data2 +'\r\n'+ data3
console.log(result)
})
})
})
//使用promise实现
const p = new Promise((resolve,reject)=>{
fs.readFile("./...1",(err,data)=>{
resolve(data)
})
})
p.then(value=>{
new Promise((resolve,reject)=>{
fs.readFile("./...2", (err,data)=>{
resolve([value,data])
})
})
}).then(value=>{
new Promise((resolve,reject)=>{
fs.readFile("./...3",(err,data)=>{
value.push(data)
resolve(value)
})
})
}).then(value=>{
console.log(value.join('\r\n'))
})
catch方法
const p = new Promise((resolve,reject)=>{
setTimeOut(()=>{
reject('出错了')
},1000)
})
// p.then(function(value){},function(reason){
//console.error(reason)
// })
p.catch(function(reason){
console.log(reason)})