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对象提供的方法,还需要注意下浏览器的兼容问题。


哈鲁
1.2k 声望25 粉丝

前端开发