青训营X豆包MarsCode 之ES学习 记录| 豆包MarsCode AI 刷题

84 阅读3分钟

ES类似于对于JS、TS的统一规范,每一年进行规定更新,所以会有ES5,ES6* 编译 => AST =>babel 监听 转义

下面是一个例子

var zhaowa = 'zhaowa' //之前声明变量
zhaowa='es'

//固定量ES6
const LIMIT =10
const OBJ_MAP={
	a:'A',
    b:'B'

上述可知,const是常量

常量有什么特征

1.不允许重复声明赋值

//ES5
Object.defineProperty(window,'arg',{
	value:'yy',
    writable:false
})
console.log(arg) //yy
//并且在更改后重新输出 =>浏览器不会报错2

//ES6
const arg3='yy'

const arg4
arg4='yy' //=>一样会报错哦~
//更改后重新输出,浏览器会报错

块级作用域

//ES5
if(true){
	var arg1='yy'	
}
console.log(arg1) //yy

//ES6
if(true){
	const arg1='yy'
}
console.log(arg1) //error

无变量提升

//ES5
console.log(arg1) 
var arg1= 'yy' 

=> var arg1
console.log(arg1)
arg1='yy'

//ES6
console.log(arg1) //error
const arg1='yy'

//dead zone 死驱
if(true){
	console.log(arg3) //error
    const arg3='yy'
}

进一步探讨

const obj={
	teacher:'yy',
    coutse:'zhaowa'
}
obj.course='es'
obj={} //NO OK

对象合并
Object.assign(obj,obj1)

obj={
...obj1,
...obj2
}
//const 常量的是obj 引用类型
//obj =>栈 (地址ajsddr) =>堆(内容值) 
//常量的是addr

**面试题:**破局方法

const obj2={
	teacher:'yy',
	course:'es'
}
Object.freeze(obj2) //冻结后
obj2.course='ts' //不会报错,但是被冻结后无法更改了

//追问
const obj3={
	teacher:'yy',
    course:'es',
    zhaowa:{
        score:5
    }
}
Object.freeze(obj3)
obj3.zhaowa.score=4.9 //成功
//freeze只能冻结当前层级 =>如何破局

//通过递归访问key值,判断key值进行再次递归调用
function deepFreeze(obj){
    Object.freeze(obj)
    (Object.keys(obj) || []).forEach(key=>{
        if(typeof obj[key]==='object'){
			deepFreeze(obj[key])
        }
    })
}
deepFreeze(obj3)

deconstruction 解构

const zhaowa={
	teacher:'yy',
    course:'es'
}
//es5
const teacher =zhaowa.teacher

//es6
const{
	teacher,
    course
}=zhaowa

//es5
const arr=['aa','bb','cc']
const a=arr[0]
const b=arr[1]
//es6
const {a,b,c}=arr

别名

const {
    course,
    name:className //=>将name变成className
    teacher:
 {
	name,
    age
 }
}=zhaowa

arrow_function 箭头函数

//es 5
function test(a,b){
	return a+b
}
const test=function(a,b){
	return a+b
}
const result=test(1,1)

//es6
const test=(a,b)=>{
   return a+b
}
//箭头连接 输入和输出

const test= (a,b)=> a+b

上下文

const obj={
	teacher:'yy',
    getTeacher:function(){
        console.log('function',this.teacher)//yy
    },
    course:'es',
    getCourse:()=>{
	console.log('course',this) //无法指向到course,因为这是范式
    }
}

注意以下场景

dom操作

const btn = document.querySelector("#btn")
btn.addEventListener('click',function(){
	this.style.coloer='#fff'
})

这里如果将function改为箭头函数,那么this指向就无法完成=>因为箭头函数是一个范式

类操作

//下面function不可以改成箭头函数
function Obj(techer,course){
	this.teacher=tercher
	this.course=course
}
const Obj1=new Obj('aa','es')

class

助力JS更加具备面向对象的能力

//es5
function Course(teacher,course){
	this.teacher=teacher
	this.course=course
}
Course.prototype.getCourse=function(){
    return `teacher:${this.teacher},course:${this.course}`
}

//es6
class Course{
    
    //构造过程需要的东西
	constructor(teacher,course){
		this.teacher=teacher
        this.course=course
    }
    getCourse(){
		/...
    }
}
console.log(typeof Course) //function

属性定义

class Course{
    
    //构造过程需要的东西
	constructor(teacher,course){
		this._teacher=teacher //_ +xxx内部属性
         this.course=course
    }
    //外部对teacher进行操作时候 =>进行的加工操作
    get teacher(){
        return '爪哇'+this._teacher
    }
    set teacher(){
        throw Error() //只读,不能进行修改
        this._teacher=val
    }
}

1.变量的只读
2.如何实现私有属性 -闭包
class Course{
    
    //构造过程需要的东西
	constructor(teacher,course){
		this._teacher=teacher //_ +xxx内部属性
         let _course='es6'
         
         //闭包
         this.getCourse=()=>{
             return _course //只能拿到给出的,访问不到内部的
         }
    }
}

3.适配器模式
class utils{
	constructor(core){
	this._main=core
     this._name={
		first:'zhaowa',
         last:'.....'
     }
    }
    
    //获取name的时候进行加工
    get name(){
		return this._name.first +this._name.last
    }
}

总结

ES主要是对于Javascript与Typescript的语法规范化的规定,每一年由广大程序员提出建议,进行统一探讨后进行发布,供大家参考,ES6主要是const、class、desconstruciton等提出。