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
对象供应的要领,还需要注意下浏览器的兼容题目。