let&const

let和const命令是ES6中新增的用来声明变量的命令。

let命令

let用法与 var 类似,但是 let 声明的变量只在它所在的代码块有效。ES6 let命令实际上为 Javascript 新增了块级作用域。ES5提供了全局作用域和函数作用域,没有块级作用域。

1
2
3
4
5
6
7
8
9
10
11
12
13
{
var a = 1;
let b = 2;
}
a;//1
b;//undefined,调用报错,只在定义时代码块内有效。
var name = 'es6';
while(true){
var name='es5';
console.log(name);//es5
break;
}
console.log(name);//es5

当有了块级作用域后:

1
2
3
4
5
6
7
let name = 'es6';
while(true){
let name = 'es5';
console.log(name);//es5
break;
}
console.log(name);//es6

注意:

  • let声明的变量不存在变量提升。所以使用let变量前,必须先声明,否则会报错。*

暂时性死区:ES6明确规定,如果区块中存在let和const声明的变量,从一开始就形成了封闭作用域。在变量声明之前调用这下变量会报错。

1
2
3
4
5
var tmp = 123;
if(true){
tmp = '123';//Uncaught ReferenceError: tmp is not defined(…)
let tmp;
}
  • 不允许重复声明:let 不允许在相同作用域内,重复声明同一变量。*

const

const声明一个只读的常量,一旦常量声明,就不能改变。如果尝试修改const变量值,就会报错。同时,const一旦声明变量,就必须立即进行初始化,只声明不赋值,同样会报错。
const变量不存在变量提升。与let类似,const变量只在声明所在块级作用域有效,存在暂时性死区,不能重复声明。

1
2
3
const m = 1;
m = 2;//Assignment to constant variable.
const n;//Missing initializer in const declaration

Tips:

当引用第三方库时声明的变量,用const来声明,可避免重命名导致的bug
const 命令声明的常量,也不能提升,同样存在暂时性死区,只能在声明的位置后使用。


2017-11-10 补充:

本质

const 实际上保证的,并不是变量的值不改动,而是变量指向的那个内存地址不得改动。对于简单类型的数据(数值,字符串,布尔值),值就保存在变量指向的那个内存地址,因为等同于常量。但对于复合类型的数据(主要是数组和对象),变量指向的那个内存地址,保存的就是一个指针,const只能保证这个指针是固定,至于它指向的数据结构是不是可变的,就完全不能控制了。

1
2
3
4
5
6
const foo = {}

foo.prop = 123;
foo.prop

foo = {}; //TypeError, "foo" is read-only

上述代码中,常量foo储存一个地址,这个地址指向一个对象。不可变的只是这个地址,即不能把foo指向另一个地址,但对象本上是可变的,所以依然可以为其添加新属性。

1
2
3
4
const a = [];
a.push('hello');//可执行
a.length = 0;//可执行
a = ['world'];//Uncaught TypeError: Assignment to constant variable.

上面代码中,常量a是个数组,数组本身是可写的,但是如果将另一个数组赋值给a, 就会报错。

如果想冻结对象,使用Object.freeze方法

1
2
3
4
const foo = Object.freeze({})
//常规模式下,下面一行不起作用
//严格模式下,该行会报错
foo.prop = 123;

在前端开发中,我们经常会碰到这样一个概念:类数组。那究竟类数组和数组有什么样的关联呢?

阅读全文 »

script type

向HTML页面插入Javascript标签,主要通过 script 标签。script标签中的type属性, 用来表示编写代码使用的脚本语言的内容类型(MIME)。 text/script 和 text/ecmascript 都已经不推荐使用, 但我们一般还是用 text/script。

阅读全文 »

linux关于文件行号显示,cat / nl 命令均可以实现,但nl 可以将行号做比较多的显示设计,包括位数与是否自动补齐 0 等等的功能。

阅读全文 »

物理像素(physical pixel)

一个物理像素是显示器(手机屏幕)上最小的物理显示单元,在操作系统的调度下,每一个设备像素都有自己的颜色值和亮度值。

阅读全文 »

cat,全称为concatenate files and print on the standard output,主要作用为:查看文件内容,也可以给文件追加内容到结尾。

阅读全文 »

cp, copy之意,用于文件或目录的复制。注意:一般情况下,使用命令行下复制文件时,如果目标文件已经存在,就会询问是否覆盖,无论是否使用 -i 参数。但是在shell脚本中执行cp时,如果没有-i参数,则不会询问是否覆盖-命令行和shell脚本的执行方式有些不同。

阅读全文 »

今天来学习的是 linux中常用命令之一的– mv。mv命令是move的缩写,用于移动文件或者文件重命名。这里先提前说一下与 cp 命令不同,mv 命令是完全将源文件移动到指定目录, cp 命令只是复制文件内容从一个目录到另一个目录。

阅读全文 »

第六条linux命令: rmdir

前面我们学习了 rm 删除文件或目录的指令,今天学习另外一个常用的指令—— rmdir 。该命令主要用于删除空目录,在该目录删除之前,此目录必须是空的。当然你也可以用 rm -r dir 命令代替,但鉴于 rm 命令的危险性,还是用 rmdir 命令靠谱些。

阅读全文 »