1,关于let和var的区别,请先看下面的实例
var a = [];
for(var i = 0 ; i < 10 ; i++){
a[i] = function (){
console.log(i);
};
}
a[6]();//10
上面的代码,变量i是var生命的,在全局内都有效,所以每循环一次,新的i值都会覆盖旧值,导致最后执行方法时,输出的都是最后一轮的i值。
var a = [];
for (let i = 0 ; i < 10 ; i++){
a[i] = function (){
console.log(i);
};
}
a[6]();//6
上面的代码中,i是let声明的,当前的i只在本轮循环中有效,所以每次循环的i都是一个新的变量,而且只在for循环代码块中有效,所以最后输出6.
2,let和const申明的变量不存在变量提升,同一个作用域内不允许重复声明。
3,我们经常在函数中,按照下面的方式取值,其实是一种变量的解构赋值用法
//假定全局中有一个对象persion
persion: {
name: 'name',
age: 19,
sex: female
}
function xx(persion){
let {name,age} = person;
//以下是其他代码
}
4,定义一个检查元素的方法
const contains = (()=>
Array.prototype.includes ? (arr,value) => arr.includes(value) : (arr,value) => arr.some(el => el === value)
)();
contains(['foo','bar'],'foo');// true
5,ES5的对象属性名都是字符串,这容易造成属性名的冲突。比如,你使用了一个他人提供的对象,但又想为这
个对象添加新的方法(
mixin
模式),新方法的名字就有可能与现有方法产生冲突。如果有一种机制,保证每
个属性的名字都是独一无二的就好了,这样就从根本上防止属性名的冲突。这就是
ES6
引入
Symbol
的原因。
ES6
引入了一种新的原始数据类型
Symbol
,表示独一无二的值。它是
JavaScript
语言的第七种数据类型,前
六种是:
Undefined
、
Null
、布尔值(
Boolean
)、字符串(
String
)、数值(
Number
)、对象
(
Object
)。
Symbol
值通过
Symbol
函数生成。这就是说,对象的属性名现在可以有两种类型,一种是原来就有的字符串,
另一种就是新增的
Symbol
类型。凡是属性名属于
Symbol
类型,就都是独一无二的,可以保证不会与其他属性
名产生冲突。
let s = Symbol();
typeof s; // "symbol"
上面代码中,变量
就是一个独一无二的值。
运算符的结果,表明变量
是
Symbol
数据类型,而不是
字符串之类的其他类型。
Symbol
函数可以接受一个字符串作为参数,表示对
Symbol
实例的描述,主要是为了在控制台显示,或者转为
字符串时,比较容易区分。
let s1 = Symbol('name');
let s2 = Symbol('age');
s1.toString(); // "Symbol(name)"
s2.toString(); // "Symbol(age)";
上面代码中,s1和s2 是两个Symbol值。如果不加参数,它们在控制台的输出都是Symbol() ,不利于区分。
有了参数以后,就等于为它们加上了描述,输出的时候就能够分清,到底是哪一个值。