1,symbol
在ES6之前,我们知道JavaScript支持8种数据类型:Object,String,Boolean,Number,Null,Undefined、Array、Function。现在,ES6新增了一种原始数据类型:symbol,表示独一无二的值,即每个symbol类型的值都不相同。这让我想起了另一个特殊的值:NaN,想一想,他们是不是有一点类似呢!
var sy = Symbol('test');
var sy1 = Symbol('test');
console.log(tepeof sy); //'symbol'
sy == sy1; //false
var sy2 = new Symbol('test'); //error : Symbol is not a constructor
创建symbol数据类型的值时,需要给Symbol函数传递一个字符串,并且有一点特殊的是:不能使用new关键字调用它。另外,每个symbol类型值都是独一无二的,即使传递的是相同的字符串。
2,let和const
ES6新增了两个声明变量的关键字:let和const。
他们声明的变量仅在let和const关键字所在的代码块内起作用,即在使用let和const的那一对大括号{}内起作用,也称块级作用域(ES6之前只有函数作用域和全局作用域)。
let和const声明变量不会在预编译过程中有提升行为(在全局声明也不会变成window的属性),且同一变量不能重复声明。所以要使用这类变量,只能在let和const关键字之后使用它们。
let和const关键字还有一个特性:“暂时性死区”,即在使用了该关键字的块级作用域中,其内部使用let和const关键字声明的变量与外部作用域中的变量相互隔绝,互不影响。即使是同名变量。
var a = 1;
{
console.log(a); //error Cannot access 'a' before initialization
let a = 0;
console.log(a); //0
}
console.log(a); //1
const用来声明一个常量,声明时必须赋值,且一旦声明就不能改变。
其实说const变量不能更改是不准确的,请看下面的例子:
const obj = {
name:'ren',
age:12
};
obj = {}; //error
obj.sex = male;
consol.log(obj); //{name:'ren',age:12;sex:'male'}
const声明的如果是一个原始值,那么上面的说法是准确的,如果const声明的是一个引用值,那么更准确的说法应该是一个不能被重新赋值的变量。