资讯专栏INFORMATION COLUMN

ES6学习笔记:const

sydMobile / 632人阅读

摘要:学习笔记的使用其他特性用来声明常量,声明时必须初始化声明的常量不能重新赋值对于基本类型,值不能改变对于引用类型,存储的是一个地址,地址不能变,但对象本身是可变的如果不想后续更改对象,使用文档用来冻结一个对象。该方法返回被冻结的对象。

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

文章版权归作者所有,未经允许请勿转载,若此文章存在违规行为,您可以联系管理员删除。

转载请注明本文地址:https://www.ucloud.cn/yun/107008.html

相关文章

  • ES6 学习笔记(一)let,const和解构赋值

    摘要:另外对于已经声明的变量进行解构赋值时,要非常小心。因此在行首加,将其强制转化为表达式执行。由于和无法转为对象,所以对它们进行解构赋值,都会报错。 let和const let和const是es6新增的两个变量声明关键字,与var的不同点在于: (1)let和const都是块级作用域,在{}内有效,这点在for循环中非常有用,只在循环体内有效。var为函数作用域。 (2)使用let和con...

    iOS122 评论0 收藏0
  • es6学习笔记-let,const和块级作用域_v1.0_byKL

    摘要:考虑到环境导致的行为差异太大,应该避免在块级作用域内声明函数。函数声明语句函数表达式循环循环还有一个特别之处,就是循环语句部分是一个父作用域,而循环体内部是一个单独的子作用域。声明一个只读的常量。 es6学习笔记-let,const和块级作用域_v1.0 块级作用域 javascript 原来是没有块级作用域的,只有全局作用域和函数作用域 例子1 因为没有块级作用域,所以每次的i都是一...

    Youngdze 评论0 收藏0
  • es6 学习笔记

    摘要:块级作用域只有全局作用域和函数作用域,没有块级作用域,这带来了很多不合理的场景。如声明变量的方法只有两种声明变量的方法命令一共有六种命令变量的解构赋值允许按照一定的模式,从数组和对象中提取,按照位置的对应关系对变量赋值,这被称为解构。 块级作用域 es5只有全局作用域和函数作用域,没有块级作用域,这带来了很多不合理的场景。 第一种场景:内层变量可能会覆盖外层变量 var test = ...

    李昌杰 评论0 收藏0
  • ES6学习笔记一:let、const、块级作用域

    摘要:一新增了命令和一样都是用来声明标量,但所声明的变量只在声明的代码块内及声明之后有效命令适合在循环中使用在循环内有效在全局内有效命令暂时性死区大括号中的使用了声明,所以在大括号中暂时只能在声明之后有效不允许在同一作用域内重复声明变量,因此不能 一、ES6新增了let命令 let 和 var 一样都是用来声明标量,但let所声明的变量只在【声明的代码块内】及【声明之后】有效 { c...

    YuboonaZhang 评论0 收藏0
  • ES6学习笔记--块级绑定

    摘要:对比常量声明与声明常量声明与声明,都是块级声明。最后一点全局块级绑定与不同于的另一个方面是在全局作用域上的表现。块级绑定新的最佳实践在的发展阶段,被广泛认可的变量声明方式是默认情况下应当使用而不是。总结与块级绑定将词法作用域引入。 var变量与变量提升 使用var关键字声明的变量,无论其实际声明位置在何处,都会被视为声明于所在函数的顶部(如果声明不在任意函数内,则被视为在全局作用域的顶...

    wangshijun 评论0 收藏0

发表评论

0条评论

最新活动
阅读需要支付1元查看
<