let
命令有的几个特性,const
也有。ES6学习笔记:let的使用
其他特性:
用来声明常量,声明时必须初始化
const PI;//"SyntaxError: Missing initializer in const declaration
声明的常量不能重新赋值
//对于基本类型,值不能改变
const PI = 3.1415926;
PI = 3;//"TypeError: Assignment to constant variable.
//对于引用类型,
const obj = {x: 0};
obj = {y: '123'};//"TypeError: Assignment to constant variable.
obj.x = '123';//obj存储的是一个地址,地址不能变,但对象本身是可变的
如果不想后续更改对象,使用Object.freeze
Object.freeze
MDN文档
用来冻结一个对象。冻结对象是指那些不能添加新的属性,不能修改已有属性的值,不能删除已有属性,以及不能修改已有属性的可枚举性、可配置性、可写性的对象。也就是说,这个对象永远是不可变的。该方法返回被冻结的对象。
const obj = Object.freeze({k:{}});
// 常规模式时,下面一行不起作用;
// 严格模式时,该行会报错
obj.prop = 123;//TypeError: Can't add property prop, object is not extensible
obj.k = {x: 123};//"TypeError: Cannot assign to read only property 'k' of object '#<Object>'
obj.k.x = 123;//输出{k:{x: 123}}
上面的例子我们又发现一个问题:如果属性值是对象,还是只能冻结该对象的地址,而内容还是可以进行修改。
//使用递归对属性进行遍历并冻结
var constantize = function(obj){
Object.freeze(obj);
Object.keys(obj).forEach( function(key,value){
if ( typeof obj[key] === 'object' ) {
constantize( obj[key] );
}
});
};
涉及到Object
对象的几个方法,总结下Object.keys
MDN文档
返回一个由给定对象的所有可枚举自身属性的属性名组成的数组,数组中属性名的排列顺序和使用for-in循环遍历该对象时返回的顺序一致(两者的主要区别是 for-in 还会遍历出一个对象从其原型链上继承到的可枚举属性)
var arr = ["a", "b", "c"];
alert(Object.keys(arr)); // 弹出"0,1,2",数组的下标
var obj = { 0 : "a", 1 : "b", 2 : "c"};
alert(Object.keys(obj)); // 弹出"0,1,2"
//enumerable默认为false, 也就是说getFoo是个不可枚举的属性
var my_obj = Object.create({},
{ getFoo : {
value : function () { return this.foo }
}
});
my_obj.foo = 1;
alert(Object.keys(my_obj)); // 只弹出foo
//手动设置getFoo可枚举
var my_obj = Object.create({},
{ getFoo : {
value : function () { return this.foo },
enumerable: true
}
});
如果想使用Object
对象提供的方法,还需要注意下浏览器的兼容问题。
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用
。你还可以使用@
来通知其他用户。