ES6学习

let声明变量

1-块级作用域

<script>
for(let i=0;i<oli.length;i++){
oli[i].onclick =function(){
  console.log(i)
}
}
</script>

得到每一次循环中i的值
2-不允许重复声明
3-变量提升没有
4-不与顶层对象挂钩

const声明常量

1.常量(不可以修改)
2.不能重复定义
3.块级、
4.没有声明提升
5.不与顶层对象挂钩
ps:更改const

<script>
const myobj = {
name:"jack"
age:6
}
myobj.name = "tietui"
</script>

freeze:冻结属性

<script>
const myobj = Object.freeze{
name:"jack"
age:6
}
myobj.name = "tietui"
</script>

变量解构赋值

数组

<script>
let arr = [1,2,3]
let [a,b,c] =arr//可以通过abc访问123
let x = 1;
let y = 2;
[y,x] = [x,y]//交换值
</script>

对象

<script>
let obj = {
name:"kerwin",
age:100
}
let {name,age} = obj//交换位置和数组相同 
</script>

模板字符串

<script>
let name = "tiecui"
let oli = "<li>\<b>"+name+"<b></li>"
//或
let oli = `<li><b>${name}<b></li>`
</script>

字符串扩展

<script>
let myname = "kerwin"
console.log(myname.includes("en"))//检验字符串是否含有en
console.log(myname.startsWith("k"))//检验字符串开头是否含有k
console.log(myname.endWidth("win"))//检验字符串结尾是否含有win
console.log(myname.repeat(2))//将字符串重复两次 
</script>

数值

1.二进制八进制的写法
2.Number.isFinite Number.isNaN
3.极小常量

数组扩展

pop,删除底栈元素
拓展运算符

<script>
let arr1=[1,2,3]
let arr2=[4,5,6]
console.log([...arr1,...arr2])

</script>

Array.from
将数组对象转换成真正数组

<script>
function test(){
	console.log(Array.from(arguments))
}
test(1,2,3)
let oli=document.querySelectorAll("li")
console.log(Array.from(oli))

</script>

Array.of
将一组值转化为数组,即新建数组

<script>
let arr1=Array(3)
console.log(arr1)//[,,]

let arr2=Array.of(3)
console.log(arr2)//[3]

</script>

find,findIndex
该方法主要是应用于查找第一个符合条件的数组元素
它的参数是以一个回调函数。在回调函数中可以写你要查找元素的条件,当条件成立为true时,返回该元素。如果没有符合条件的元素,返回值为undefined

<script>
let arr=[11,12,13,14,15]
let res=arr.find(function(item){
	return item>13
})
console.log(res)//14
let res=arr.findIndex(function(item){
	return item>13
})
console.log(res)//3

</script>

fill,空白填充

<script>
let arr=new Array(3).fill("kerwin")
console.log(arr)
let arr1=[11,22,33]
console.log(arr1.fill("kerwin",1,2))

</script>

flat() flatMap()
集成扁平化

<script>
let arr=[1,2,3,[4,5,6]]

let arr1=arr.flat()
console.log(arr,arr1)

</script>

函数拓展

1、默认参数

function ajax(url,method="get",async=true){
	console.log(url,method,async)
}
ajax("/bbb")

2、-rest参数 剩余参数

function(x,y,...data){//展开运算符
	console.log(data)
}

对象简写

let name="moduleA"
let obj={
	name,//name:name
	test1(){

	},
	test2(){

	}
}

对象属性 表达式

let name="moduleB"
let obj={
	name,
	[name+"test2"](){
	
	}
	[name+"test2"](){
	
	}
}

拓展运算符

let obj={
	name:"kerwin"
}
let obj1={
	...obj//不是赋值obj地址,而实内容,可以单独修改
}


Object.assign
对象拼接,会将拼接的对象拼接进第一个对象(第一个对象会被改变),最好设置一个空数组
Object.is判断两个值是否完全相等(===不能判断NaN)

箭头函数

()可以省略
{}可以省略,只有一句代码,只有返回值的时候
没有arguments
this的问题,箭头函数this是父级作用域的

<script>
var test1=function(){
	console("1111")
}
var test2=()=>{
	console.log(2222)
}

//(只有一个形参的时候)可以省略
var test = a =>{
	console.log(111,a)
}
test("kerwin",100)

//{}可以省略,只有一句代码,只有返回值的时候
var test = a =>	 100*a
console.log(test(10))

</script>

this问题

<script>
<body>
    <input type="text" id="mytext">
    <script>
        mytext.oninput=function(){
            setTimeout(function(){
                console.log(this)
            },1000)
        }
    </script>
</body>
//这里this拿到的是window,而不是mytext

//解决方案1
<body>
    <input type="text" id="mytext">
    <script>
        mytext.oninput=function(){
            var that=this//先用that保存父级
            setTimeout(function(){
                console.log(that.value)
            },1000)
        }
    </script>
</body>

//解决方案2
<body>
    <input type="text" id="mytext">
    <script>
        mytext.oninput=function(){
            setTimeout(()=>{
                console.log(this.value)
            },1000)
        }
    </script>
</body>
//霸道的箭头函数

</script>

symbol

Symbol()函数可以接受一个字符串作为参数,表示对Symbol实例的描述。这主要是为了在控制台显示,比较容易区分

let name=Symbol()
let age-Symbol()
var obj={
	[name]:"kerwin",
	[age]:100
}

let name=Symbol("name")//这样写symbol就容易区分,不会全显示symbol()=****
let age=Symbol("age")
var obj={
	[name]:"kerwin",
	[age]:100
}
console.log(obj)

ps:
1、不能运算
2、显示调用toString()
3、隐式转换boolean
getOwnPropertySymbols()拿出里面所有的symbol函数

Iterator 迭代器

作用:
1、为各种数据结构,提供一个统一的、简便的访问接口
2、使得数据结构的成员能够按某种次序排列
3、ES6创造了一种新的遍历命令for…of循环,Iterator接口主要供for…of循环

let arr=["kerwin","tiechui","gangdaner"]
for(let i of arr){
	console.log(i)//of是数组里的值,in是索引
}

过程:
1、创造一个指针对象,指向当前数据结构的起始位置。也就是说,遍历器对象本质上,就是一个指针对象
2、第一次调用指针对象的next方法,可以将指针指向数据结构的第一个成员
3、第二次调用指针对象的next方法,指针就指向数据结构的第二个成员。
4、不断调用指针对象的next方法,直到它指向数据结构的结束位置

let i=arr[symbol.iterator]()
console.log(i.next())
console.log(i.next())
console.log(i.next())
console.log(i.next())

set结构

let s1=new set([1,2,3,2,3])
console.log(s1)

let s2=new set()
s2.add(1)
s2.add(2)
s2.add(3)
console.log(s2)

size:返回set实例的成员数
set.prototype.add(value):添加某个value
set.prototype.delete(value):删除某个value,返回一个布尔值,表示删除是否成功
set.prototype.has(value):返回一个布尔值,表示该值是否为set成员
set.prototype.clear():清楚所有成员,没有返回值
遍历
set.prototype.keys():返回键名的遍历器
set.prototype.values():返回键值的遍历器
set.prototype.entries():返回键值对的遍历器
set.prototype.foreach():遍历每个成员


Map结构

类似于对象,也是键值对的集合,但是“键”的范围不限于字符串,各种类型的值(包括对象)都可以当作键

let m1=new map()
m1.set("name","kerwin")
m1.set({a:1},"大连")

console.log(m1)

let m2=new map([
	["name","kerwin"],
	[{a:1},"大连"]
])

size:返回Map结构的成员数
Map.prototype.set(key.value):添加key对应得value,返回Map结构本身
Map.prototype.get(key):获取key对应得value
Map.prototype.delete(key):删除某个键
Map.prototype.has(key):某个键是否在当前Map对象之中
map.prototype.keys():返回键名的遍历器
map.prototype.values():返回键值的遍历器
map.prototype.entires():返回所有成员的遍历器
map.prototype.foreach():遍历Map的所有成员```
# proxy代理
它的作用是在对象和对象的属性值之间设置一个代理,获取该对象的值或者设置该对象的值,以及实例化等等多种操作,都会被拦截住,经过这一层我们可以统一处理,我们可以认为它就是“代理器”
proxy本质上属于元编程非破坏性数据劫持,在原对象的基础上进行了功能的衍生而不影响原对象,符合松耦合高内聚的设计理念
# get方法

```html
let target={}
let proxy=new proxy(target,{
	get(target,prop){
		return target[prop]
	}
})

set方法

const proxy_set = new Proxy({}, {
    set: function (target, prop, value, receiver) {
        target[prop] = value;
        console.log('property set: ' + prop + ' = ' + value);
        return true;
    }
})

console.log("======proxy_set=======")
console.log('name' in proxy_set); // false
proxy_set.name = 'duXin'; // property set: name = duXin

console.log('name' in proxy_set); // true


has方法

const targetObj = {
    _secret: 'easily scared',
    eyeCount: 4
};
const proxy_has = new Proxy(targetObj, {
    has: (target, key) => {
        console.log("key==",key)
        if (key.includes('_')) {
            return false;
        }
        return key in target;
    }
})

console.log('eyeCount' in targetObj); // true
console.log('_secret' in proxy_has); // false


reflect对象

reflect可以用于获取目标对象的行为,它与object类似,但是更易读,为操作对象提供了一种更优雅的方式。它的方法与proxy是对应的

//代替object的某些方法
const obj={
};
reflect.defineprototype(obj,'name',{
	value:'kerwin',
	writable:false,
	configurable:false
})

//修改某些object方法返回结果
//老写法
try{
	object.defineproperty(target,property,attributes);
	//success
}catch(e){
	//fail
}

//新写法
if(reflect.defineproperty(target,property,attributes)){
	//success
}else{
	//fail
}

//命令式变为函数行为
const obj={
	name:"kerwin"
}
//老写法
consoel.log("name"in obj)//true
//新写法
console.log(reflect.has(obj,"name"))//true

//老写法
delete obj.name
//新写法
reflect.deleteproperty(obj,"name")

//配合proxy
let target = new set()
const proxy=new proxy(target,{
	get(target,key){
		const value=reflect.get(target,key)
		//遇到function都手动绑定一下this
		if(value instanceod function){
			console.log('访问${value}方法了')
			return value.bind(target)
			//不能是call apply
		}
		return value
	}
	set(){
		return reflect.set(...arguments)
	}
})

promise

promise是异步编程的一种解决方案,比传统的解决方案回调函数,更合理和更强大。ES6将其写进了语言标准,同意了用法,原生提供了promise对象指定回调函数方式更灵活易懂
解决异步回调地狱的问题
回调地狱:
当一个回调函数嵌套一个回调函数的时候
就会出现一个嵌套结构
当解套的多了就会出现回调地狱的情况
比如我们发送三个ajax请求
第一个正常发送
第二个请求需要第一个请求的结果中的某一个值作为参数
第三个请求需要第二个请求的结果中的某一个值作为参数

//语法
var q = new Promise(function(resolve,reject){
	//放异步
	settimeout(()=>{
		//成功兑现承诺
		resolve()

		//失败拒绝承诺
		//reject()
	},2000)
})
//pending 执行中
//fulfilled 兑现承诺
//reject 拒绝承诺

//q是promise对象
q.then(function(){
//兑现承诺,这个函数被执行
}).catch(function(){
//拒绝承诺,这个函数被执行  
})


generator函数

generator函数是ES6提供的一种异步编程解决方案
geneator函数是一种状态机,封装了多个内部状态
执行generator函数会返回一个遍历器对象们,也就是说,generator函数除了状态机,还是一个遍历器对象生成函数。返回的遍历器对象,可以一次遍历generator函数内部的每一个状态

//基本语法
function *gen(){
	console.log(1)
	tield;
	console.log(2)
	yield;
	console.log(3)
}

let g=gen()
g.next()
g.next()
g.next()

class语法

//1类的写法
classperson{
	constructor(anme,age);
		this.name=name;
		this.age=age;
	}
	say(){
		console.log(yhis.name,this.age)
	}
let obj=new person("kerwin",100)
console.log(obj)

//getter与setter
class list{
	constructor(ele){
		this.element=ele
	}

	get html(){
		return this.element.innerHTML
	}
}

class继承

class Person{
	constructor(name,age){
		this.name=name
		this.age=age
	}
	say(){
		console.log(this.name,"hello")
	}
}
//extend原型继承
class Student/*子类*/ extends Person/*父类*/{
	constructor(name.age,grade){
		super(name,age)//Person.call(this,name,age)
		this.grade=grade
	}
	say(){
	super.say()//继承上面的say
		console.log(this.name,"你好")
	}
}
var obj = new Student()
console.log(obj)


Module语法

1、私密不漏
2、重名不怕
3、依赖不乱
注意script引用记得加type=“module”(依赖不乱)

export{
	***
	*****
}
//导出函数
import{} from ' ./'
//导入函数

import{A1,A2,test as A_test} from ' ./'
import{B1,B2,test as b_test} from './'
//解决重名问题

export default c
//默认导出c


模块化

js现在有两种模块。一种是ES6模块,简称ESM;另一种是commonJS模块,简称cjs
commonjs模块是nodejs专用的,与ES6模块不兼容。语法上面,两者最明显的差异是,commonjs模块使用require()和module.exports,ES6模块使用import和export
ES6模块不是对象,而实通过export命令显示指定输出的代码,再通过import命令输入

//写法1
export default A1
import a1from "./1.js"

export {A1,A2}
import {A1,A2} from "./1.js"
import {A1as a1,A2 as a2} from "./1.js"
import * as obj from "./1.js"

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值