const命令声明变量应注意的几点
对于复合类型的变量,变量名不指向数据,而是指向数据所在的地址。const命令只是保证变量名指向的地址不变,并不保证该地址的数据不变,所以将一个对象声明为常量必须非常小心。
 const person = {
      name : 'Tom',
      age : 18
 };
 person.age = 20;
 alert(person.age);
上面的代码中,常量person存储的是一个地址,指向一个对象。不可变的只是这个地址,即不能把person指向另一个地址,但对象本身是可变的,所以其属性的值是可以修改的。
下面是另外一个例子:
const arr = [];
arr.push(1);
arr.push(2);
alert(arr.length);
arr.length = 0;
alert(arr.length);
上面的代码中,常量arr是一个数组,这个数组本身是可写的,但如果将另一个数组赋值给arr,就会报错。
如果真的想把对象冻结,应该使用Object.freeze()方法。
 const person = Object.freeze({
      name : 'Tom',
      age : 18
 });
 person.age = 20;
 alert(person.age); //
上面的代码中,常量person指向一个冻结的对象,所以修改属性值不起作用。
除了将对象本身冻结,对象的属性也应该冻结。下面是一个将对象彻底冻结的例子:
 var person =  {
      name : 'Tom',
      age : 18,
      friend : {
             name : 'Jerry',
             age : 19
            }
      };
 var constantize = (obj)=>{
     Object.freeze(obj);
     Object.keys(obj).forEach((key,value)=>{
         if(typeof obj[key] === 'object'){
             constantize(obj[key]);
           }
        })
    };
 constantize(person);
 person.friend.age = 25;
 alert(person.friend.age); //
const命令声明变量应注意的几点的更多相关文章
- 【ES6基础】let、const命令和变量的结构赋值
		ES5声明变量(2):var .function ES6声明变量(6):var.function.let.const.import和class 1.let命令和const命令 (1)let和const ... 
- C++ ——  类中static和const关键字声明变量的初始化方式总结
		在类中声明变量/常量时,经常会用到static.const关键字.对于该变/常量的初始化问题,网上有许多相关文章,但是大多不够完善,或者存在错误.经过实际验证,总结如下: (注明:测试编译平台为VS2 ... 
- 『忘了再学』Shell基础 — 19、使用declare命令声明变量类型
		目录 1.declare命令介绍 2.声明数组变量类型 3.声明变量为环境变量 4.声明只读属性 5.补充: 1.declare命令介绍 Shell中所有变量的默认类型是字符串类型,如果你需要进行特殊 ... 
- es6之let和const命令的一些笔记
		let和const命令 let命令 基本用法 let命令用来声明变量,声明的变量只在命令所在的代码块内有效.for循环中很适合使用let命令. 有必要理解的例子: var a = []; for (v ... 
- es6 - 一共有 6 种声明变量的方法(var, function, let, const, class, import)
		var命令和function命令声明的全局变量,依旧是顶层对象的属性:let命令.const命令.class命令声明的全局变量,不属于顶层对象的属性.也就是说,从 ES6 开始,全局变量将逐步与顶层对 ... 
- var、let、const声明变量的区别
		let和var声明变量的区别:1.let所声明的变量只在let命令所在的代码块内有效.(块级作用域) for(let i=0;i<10;i++){ // ... } console.log(i) ... 
- ES6之用let,const和用var来声明变量的区别
		var(掌握) 不区分变量和常量 用var声明的变量都是变量,都是可变的,我们可以随便对它进行运算操作.这样当多个人进行同一个项目时,区分变量和常量会越来越难,一不小心就会把设计为常量的数据更改了 ... 
- JavaScript:学习笔记(7)——VAR、LET、CONST三种变量声明的区别
		JavaScript:学习笔记(7)——VAR.LET.CONST三种变量声明的区别 ES2015(ES6)带来了许多闪亮的新功能,自2017年以来,许多JavaScript开发人员已经熟悉并开始使用 ... 
- es6学习笔记(1) let和const命令详解
		let和const命令: Es6新增了let命令,声明变量,但与var不一样的,只在let命令所在的代码块内有效(如for循环之外let声明的变量就不再有效).并且let不像var那样会发生" ... 
随机推荐
- pc端   添加购物车示例
			添加到购物车列表及相关商品推荐. <!DOCTYPE html> <html lang="en"> <head> <meta charse ... 
- CocosCreator引擎修改与定制
			1.CCGame.js 修改部分数据脚本的加载时机,避免首屏卡顿 // Load game scripts var jsList = config[CONFIG_KEY.jsList]; if (js ... 
- C语言中->是什么意思啊?比如说 p=p->next 到底表达了什么意思,请说清楚点,还有->这个符号是一个整体吗,什么意思??
			->是一个整体,它是用于指向结构体.C++中的class等含有子数据的指针用来取子数据.换种说法,如果我们在C语言中定义了一个结构体,然后申明一个指针指向这个结构体,那么我们要用指针取出结构体中 ... 
- 如何避免提交页面,信息未填写完善 就出现注册成功提示             基于js
			基于bootstrip做好一个页面后,出现如下效果图 这个页面是未经过任何后端处理的页面,如果直接填写一个用户名 或者不填写任何东西都可以注册成功的,先来演示只输入一个用户名 就要可以注册成功的. 点 ... 
- 使用deb 打包开发的postgres extension 另外一种方法
			已经写过一个deb 包打包的方法,我们同时也可以使用dpkg-deb 命令 安装依赖工具包 推荐安装全点的 sudo apt-get install build-essential autoconf ... 
- Python tkinter模块和参数
			转自:https://www.cnblogs.com/aland-1415/p/6849193.html 1.使用tkinter.Tk() 生成主窗口(root=tkinter.Tk()):root. ... 
- centos7.1安装tomcat8
			上传软件包 [root@linux-node1 tools]# ls apache-tomcat-8.0.32.tar.gz jdk-8u74-linux-x64.tar.gz 添加普通用户tomca ... 
- 快速部署私人git服务--基于docker化Gogs
			Gogs 一款极易搭建的自助 Git 服务. 环境 Linux系统 docker 获取gogs镜像,并运行, docker run -it --: -p : -v /var/gogs:/data go ... 
- .Net MVC TextBoxFor 扩展  placeholder 与  class  属性
			namespace System.Web.Mvc { public static class HtmlHelperExtensions { public static MvcHtmlString Bs ... 
- Markdown语法说明(转)
			Markdown语法说明(转) Markdown创始人John Gruber的语法说明 附上本文链接 NOTE: This is Simplelified Chinese Edition Docume ... 
