ECMAScript和JavaScript及TypeScript

时间:2020-07-30 21:47:29   收藏:0   阅读:64

文章内容输出来源:拉勾教育大前端训练营

ECMAScript

- 浏览器中的javascript指的是ES + Web提供的Api(dom bom)
- node环境中javascript指的是ES + node提供的Api

作用域

全局作用域(公共作用域)

1. 在全局作用域中的函数,变量都是公用的.所有相同的变量名称重复命名都会冲突导致报错
2. 函数内部直接赋值变量会把变量提升为全局变量
var a = 3
function a() {
    a = 2;
    console.log(‘func a‘)   
}
console.log(a())//TypeError: a is not a function

var a = 3
function test() {
    a = 2;
    console.log(a)   
}
console.log(test())//2


function test() {
    console.log(a) //未声明 报错
    a = 2;
    console.log(a)   
}
console.log(test()) //a is not defined
console.log(a)



function test() {
    a = 2;
    console.log(a)   //2
}

console.log(test())
console.log(a)  //2

函数作用域

1. 函数内部使用var声明变量(局部变量)只能在函数作用域内使用,外部无法访问到
function test() {
   
   var a = 2;
    console.log(a) //2
}

console.log(test()) 
console.log(a)//a is not defined

块级作用域(ES2015新增)

1. {} 花括号包括的就是块级作用域
2. let 关键字可以绑定到所在的作用域中
3. var 关键字声明的变量会提升到最近的函数作用域当中(函数作用域)
var  a=1;
function test() {
    function test1() {
        if (true) {
           var a = 44;
            console.log(a) //44
        }
        console.log(a) //44
    }
    test1()
    console.log(a) //1
}


console.log(a) //1
console.log(test())
console.log(a) //1

const 常量

const a = { a: 1 };
a.a= 2
console.log(a) //{ a: 2 }

const b=2;
b=3 //TypeError: Assignment to constant variable.

解构

数组解构
const arr=[1,2,3,4]
const [first,secend,...rest]=arr;
console.log(first)//1
console.log(rest)//[3,4]
对象解构
const obj ={
    name:‘aa‘,
    age:18
}

const {name,age}=obj

console.log(name)//aa

console.log(age)//18

模板字符串

const obj ={
    name:‘aa‘,
    age:18,
    [‘姓名‘]:‘哈哈‘
}

console.log(`字符串输出${obj.姓名}`)//字符串输出哈哈

箭头函数

const obj ={
    name:‘aa‘,
    age:18
}


let age1=obj=>{
    return this
}
console.log(age1(obj))//{}

对象字面量

计算属性名
const obj ={
    name:‘aa‘,
    age:18,
    [‘姓名‘]:‘哈哈‘
}


let age1=obj=>{ 
    return obj.姓名
}
console.log(age1(obj)) //哈哈

Object.assign 对象拷贝

const obj={
    name:‘test‘
}
console.log(Object.assign({},obj)) //{ name: ‘test‘ }
console.log(Object.assign({},obj,obj1)) //{ name: ‘test‘, age: ‘18‘ }

Object.is 同值比较

console.log(Object.is(-0,+0)) //false
console.log(Object.is(NaN,NaN)) //true
console.log(-0===+0)//true
console.log(NaN===NaN)//false

Proxy 对象代理器

const obj = {
    name: ‘test‘
}

const newProxy = new Proxy(obj, {
    get(targer, property) {
        return property in targer ? targer[property] : ‘default‘
    },
    set(targer, property, value) {
        if (property === "age")
            if (!Number.isInteger(value))
                throw new TypeError("错误的数据类型")
        targer[property] = value
        console.log(targer)
    }
})
console.log(newProxy.name) //test
console.log(newProxy.xx) //default
newProxy.age = "哈哈" //TypeError: 错误的数据类型
console.log(newProxy.age)

Proxy对比object.defineProperty

const obj = {
    name: ‘test‘
}

const newProxy = new Proxy(obj, {
    get(targer, property) {
        return property in targer ? targer[property] : ‘default‘
    },
    set(targer, property, value) {
        if (property === "age")
            if (!Number.isInteger(value))
                throw new TypeError("错误的数据类型")
        targer[property] = value
        // console.log(targer)
    },
    delete(targer,property){
       delete targer[property]
    }
})
// console.log(newProxy.name)
// console.log(newProxy.xx)
newProxy.age = 18
delete  newProxy.age
console.log(newProxy.age) // default

Proxy 对数组的操作监视

const list = [];
let arrProxy = new Proxy(list, {
    set(targer, property, value) {
        targer[property] = value
        return true  //返回写入成功,不写返回值会报错(‘set‘ on proxy: trap returned falsish for property ‘0‘)
    }
})

arrProxy.push(200)
arrProxy.push({ name: ‘test‘ })
console.log(list)

Reflect 一套用于对象操作类(api),13个方法

const obj = {
    name: ‘test‘
}
// console.log(‘name‘ in obj) //true
// console.log(delete obj[‘name‘]) //true
// console.log(Object.keys(obj))//[]
console.log(Reflect.has(obj,‘name‘))//true
console.log(Reflect.deleteProperty(obj,‘name‘))//true
console.log(Reflect.ownKeys(obj))//[]

class 类

function myCls() {
    this.name = "测试"
}

myCls.prototype.say = function () {
    return this.name
}

let my = new myCls()
console.log(my.say())//测试
class myCls2  extends myCls{
    //静态方法
    static create(no,name) {   
        return new myCls2(no,name)
    }
    constructor(no,name) {
        super(name)
        this._no = no
    }
    //实例方法
    say() {
        return this._no
    }
}

// let my2 = new myCls2(‘测试2‘)
// console.log(my2.say())//测试2
let my2=myCls2.create(1,‘测试2‘)
console.log(my2.say())

set 数据解构

Map 键值对集合

let m=new Map()
m.set({name:123},90)
console.log(m)

let om=new Object()
om.s=99;
console.log(om)

Symbol

for of 遍历

类型安全

强类型和弱类型
类型系统

类型限制

Flow

function (nb :number){
    return nb;
}

//数组类型
let arr:Array<number>=[1,2,3] //<> 指定成员类型
let arr:number[]=[1,3,4] //:number[] 效果一样
let arr:[string,number]  //元组数据类型(固定长度数组)


//对象类型
let obj:{foo?:string,bar:number}
let obj:{[string]:string}  //限制对象属性 key 必须是字符串 ,值也必须是字符串

//函数类型
let fn:(string,number)=>void =function(‘aa‘,1){} //指定2个参数类型分别是string 和number,指定无返回值(undefind)

//type 关键字设置类型  
type str=string

//字面量类型
 type s=string | number //string或者number类型
 
//maybe 设置可为空
 const b: ?number = undefind  
 const b: number | null | void = undefind
 

mixed & any 类型

TypeScript

  let num = 123 as number 
  let numb = ‘123‘ as number //直接报错
  /**类型 "string" 到类型 "number" 的转换可能是错误的,因为两种类型不能充分重叠。
  如果这是有意的,请先将表达式转换为 "unknown"。
  **/
//设置动态接口
interface CacheTs {
    readonly name: string //只读
    [prop: string]: any   //属性名string 值可以为任何值
};

let cc: CacheTs = {
    name: ‘张三‘,
    processName: ‘测试‘
};
//cc.name=‘里斯‘ //报错无法分配到 "name" ,因为它是只读属性。
console.log(cc.name);//张三
enum book {
    ‘天文‘,
    ‘地理‘,
    ‘文学‘,
    ‘言情‘,
    ‘科幻‘
}
console.log(book[0]) //天文
interface people {
    name: string | null | undefined
    age: number | undefined
}
class man implements people {
    name: string | null | undefined = undefined
    age: number | undefined = undefined
    sex: number | null | undefined = undefined
    constructor(name: string, sex: number, age: number) {
        this.name = name;
        this.age = age;
        this.sex = sex;
    }

}
let p = new man("张三", 1, 18)
console.log(p) //man { name: ‘张三‘, age: 18, sex: 1 }

javascript 的性能优化

...未完待续

评论(0
© 2014 mamicode.com 版权所有 京ICP备13008772号-2  联系我们:gaon5@hotmail.com
迷上了代码!