const的可变性

const用于声明常量。

什么是常量,声明后的值不可更改。

对于值类型,比如string,number等等。const声明确实有效。

const str = "string";
str = 1; // Uncaught TypeError: Assignment to constant variable.

对于引用类型,比如array,object。const声明只保证了引用不可更改,但保证不了其内容。

const arr = [];
arr.push(1); // 不报错
arr; // [1]
const obj = {};
obj.test = 1; // 不报错
obj; // Object {test: 1} arr = 1; // Uncaught TypeError: Assignment to constant variable.
obj = 1; // Uncaught TypeError: Assignment to constant variable.

为了保证array和object的内容也不可更改。我可以使用Object.freeze方法。

const arr = [1];
Object.freeze(arr);
arr.push(1); // Uncaught TypeError: Can't add property 1, object is not extensible
arr[0] = 9; // arr[0]的值仍是1,但这条语句不会报错。
arr[0]; // 1 const obj = {};
Object.freeze(obj);
obj.a = 3; // obj的值仍是{},但这条语句不会报错。
obj; // {}

应该报错的地方,不去报错,有隐患。

隐患在于排查bug困难。

并且,Object.freeze只能锁定对象的一级值属性。

const obj = {a: {}};
Object.freeze(obj);
obj.a.b = 1;
obj; // {a: {b: 1}}

这样看来原生,并没有提供一个好的const解决方案。

直的不行,我们弯的来。

参考Facebook的immutable-js

以及这篇文章也可一看。

没有return语句的函数

JS里面的函数允许没有return语句,它会默认返回undefined。

var a = 1;
var fn = function(){};
a = fn();
a; // undefined

如果你的return是写在分支中,没有被执行到,便会有隐患。

箭头函数可读性不高

ES6还允许使用箭头函数。情况更加糟糕。

const isEven = n => n % 2 == 0;
// 等同于
const isEven = function(n){
return (n % 2) == 0;
};

箭头函数写起来更加简洁,阅读起来则更加费脑。

es6还欠完善的地方的更多相关文章

  1. 造轮子,模仿WPF的UI框架,还没完善。。。

    Wtf(暂时命名,随便起的 = _=),模仿WPF的框架,还没有完善,只有简单的基础元素,支持数据绑定.虽然支持mono但是mono有bug 写这个只是兴趣爱好,感觉也没多大意义了,如果这个UI框架完 ...

  2. 我的第一个jQuery插件开发(日期选择器,datePicker),功能还不完善,但用于学习参考已经足够了。

    一.学习jQuery插件开发网上的帖子很多,插件开发的方式也有好几种,现在推荐一个帖子讲述的特别好,我也是这篇文张的基础上学习的. 参考:http://www.cnblogs.com/ajianbey ...

  3. Python之关于量化投资实现代码--根据策略提出的代码--还未完善

    # 根据缺口的模式选股买股票 ''' -------------------------------------------- 1.总体回测前要做的事情 initialize(context) 1.1 ...

  4. mysql导入备份.sql文件时报错总结(还有待完善)

    错误1:ERROR Unknown character set: 'utf8mb4' utf8mb4编码集支持了表情符号,相信处理过社交网络数据的人都有了解.这个mysql5.5以后支持了utf8mb ...

  5. hashmap简单实现

    p.p1 { margin: 0; font: 11px Monaco } p.p2 { margin: 0; font: 11px Monaco; min-height: 15px } p.p3 { ...

  6. arcgis api for flex之专题图制作(饼状图,柱状图等)

    最近公司给我一个任务,就是利用arcgis api for flex实现在地图上点(业务数据)直接显示饼状图以及柱状图的专题图制作,而不是通过点击点显示气泡窗口的形式来实现,这个公司已经实现了. 经过 ...

  7. 关于Java导出100万行数据到Excel的优化方案

    1>场景 项目中需要从数据库中导出100万行数据,以excel形式下载并且只要一张sheet(打开这么大文件有多慢另说,呵呵). ps:xlsx最大容纳1048576行 ,csv最大容纳1048 ...

  8. android.graphics包中的一些类的使用

    游戏编程相关参考 Matrix学习系列: http://www.moandroid.com/?p=1781 Android画图学习总结系列: http://www.moandroid.com/?p=7 ...

  9. C#判断画的图形是不是三角形

    这个源代码写的不是十全十美,只是提供一个 还待完善的地方例如判断是否这个图形是封闭的.得空在解决吧 这只是一个算法上 谁有c#的参考手册网盘分享一份 谢谢 下面请看源码 凑够150个字了,不废话了. ...

随机推荐

  1. ADC 转换序列暂时难理解

    通常情况下,core文件会包含了程序运行时的内存,寄存器状态,堆栈指针,内存管理信息还有各种函数调用堆栈信息等,我们可以理解为是程序工作当前状态存储生成第一个文件,程序出错的时候理论上都会产生一个co ...

  2. smarty 模板几个例子

    一.assign和display方法的使用以及几个变量调节器 header("content-type:text/html;charset=utf-8");//加载Smarty引擎 ...

  3. MICAPS数据文件格式

    MICAPS系统的数据结构是建立在文件系统基础上的.其特点是: l  利用目录来区分不同的数据来源.要素和层次,即不同的数据来源.要素和层次的数据要放在不同的目录中.同一目录中的数据只能有时次或时效上 ...

  4. paper 123: SVM如何避免过拟合

    过拟合(Overfitting)表现为在训练数据上模型的预测很准,在未知数据上预测很差.过拟合主要是因为训练数据中的异常点,这些点严重偏离正常位置.我们知道,决定SVM最优分类超平面的恰恰是那些占少数 ...

  5. Java多线程开发系列之一:走进多线程

    对编程语言的基础知识:分支.选择.循环.面向对象等基本概念理解后,我们需要对java高级编程有一定的学习,这里不可避免的要接触到多线程开发. 由于多线程开发整体的系统比较大,我会写一个系列的文章总结介 ...

  6. cassandra.yaml介绍

    cluster_name 集群的名字,默认情况下是TestCluster.对于这个属性的配置可以防止某个节点加入到其他集群中去,所以一个集群中的节点必须有相同的cluster_name属性. list ...

  7. python for mysql

    # -*- coding: utf-8 -*- '''python coded by written in 2016/8/31 Used for get win os log for each win ...

  8. 2.多线程-GCD

    1.基本概念 同步任务:在当前线程按顺序执行,不开启新的线程 异步任务:有开新线程的欲望   串行队列:一个一个执行 并行队列:多个任务同时执行 --------------------------- ...

  9. 求android ble 解决方案!

    智能医疗的产品,求ble解决方案:整体结构如下: 名词定义: 盒子:基于android4.3或以上版本的硬件,需支持wifi.ble 手机:android/ios 手机,用户使用 服务器:云服务器,盒 ...

  10. nginx安装及负载均衡配置

    Nginx (“engine x”) 是一个高性能的 HTTP 和 反向代理 服务器,也是一个 IMAP/POP3/SMTP 代理服务器. Nginx 是由 Igor Sysoev 为俄罗斯访问量第二 ...