本文转载自微信公众号《三分钟学会前端》,作者安姐。转载本文请联系三分钟学习前端公众号。TypeScript中的const和readonly有什么区别?TypeScript中有两种实现不可变变量的方法:使用ES6const关键字声明的值类型,用readonly修饰TypeScript中的readonly修饰符可以声明更严格的变量read属性通常用在interface、Class、type、array和tuple类型,也可用于定义函数的参数//typetypeFoo={readonlybar:number;};//const确保'config'不能被改变constfoo:Foo={bar:123};//不能被改变foo.bar=456;//错误:foo.bar是只读属性//functionfunctionfoo(config:{readonlynum:number}){//..}constconfig={num:123}foo(config)区别const用于变量,readonly用于属性const在运行时检查,readonly在编译时检查。声明为const的变量不得改变值,也就是说变量一旦声明为const,就必须立即初始化,不能留待以后赋值;readonly修饰的属性可以确保他们不能修改属性,但是当你把这个属性给其他没有这种保证的用户时(允许类型兼容性原因),他们可以mutateconstfoo:{readonlybar:number;}={bar:123};functioniMutateFoo(foo:{bar:number}){foo.bar=456;}iMutateFoo(foo);console.log(foo.bar);//456此时iMutateFoo需要明确指出他们的参数不可修改,这时编译器会发出错误警告:functioniTakeFoo(foo:Foo){foo.bar=456;//Error:barattributeread-only}const保证的不是变量的值一定不能变,而是变量指向的内存地址一定不能变。比如使用const变量保存的数组,可以使用push、pop等方法。但是如果用ReadonlyArray声明的数组不能使用push,pop等方法。枚举和常量枚举有什么区别?枚举和常量枚举(constenumeration)使用枚举来明确表达意图或创建一组差异化的用例编译的时候会编译成一个对象,可以作为一个对象来使用。typescript编译时会删除const枚举,const枚举成员在该处使用。被内联以避免额外的性能开销//枚举enumColor{Red,Green,Blue}varsisterAn=Color.Red//在JavaScript中会被编译成varsisterAn=Color.Red//即在运行和执行时,它会寻找变量Color和Color.Red//常量枚举constenumColor{Red,Green,Blue}varsisterAn=Color.Red//在JavaScript中会被编译成varsisterAn=0//运行时没有Color变量的来源:https://github.com/Advanced-Frontend/Daily-Interview-Question
