let与const
let声明的变量,只在let命令所在的代码块内有效,只能申明一次
for (var i = 0; i < 10; i++) {
setTimeout(function(){
console.log(i);
})
}
// 输出十个 10
for (let j = 0; j < 10; j++) {
setTimeout(function(){
console.log(j);
})
}
// 输出 0123456789var声明的变量是全局,只有循环执行完,定时器才会执行,所以会打印出i都是10,let声明的是变量只在本轮循环中有效,每一次循环都是一个新的变量,而JavaScript引擎会记住上一次循环的值,所以每次打印的值不一样。
let不存在变量声明
console.log(a); //ReferenceError: a is not defined
let a = "apple";
console.log(b); //undefined
var b = "banana";let未定义的变量,运行直接报错,var存在变量申明,未定义的变量已经存在,只是没有赋值,所以打印undefined
const声明一个只读的变量,申明之后不允许修改,申明必须初始化
注意:如果代码块存在let或者const。代码块会对这些声明命令的变量从快开始就行后才能一个封闭作用域,代码块内,在声明变量之前使用会报错!
解构赋值
数组模型解构
基本let [a, b, c] = [1, 2, 3]; // a = 1 // b = 2 // c = 3
可嵌套let [a, [[b], c]] = [1, [[2], 3]]; // a = 1 // b = 2 // c = 3
可忽略let [a, , b] = [1, 2, 3]; // a = 1 // b = 3
不完全解构let [a = 1, b] = []; // a = 1, b = undefined
剩余运算符let [a, ...b] = [1, 2, 3]; //a = 1 //b = [2, 3]
字符串等
在数组的解构中,解构的目标若为可遍历对象,皆可进行解构赋值。可遍历对象即实现 Iterator 接口的数据。let [a, b, c, d, e] = 'hello'; // a = 'h' // b = 'e' // c = 'l' // d = 'l' // e = 'o'
解构默认值
let [a = 2] = [undefined]; // a = 2
let [a = 3, b = a] = []; // a = 3, b = 3
let [a = 3, b = a] = [1]; // a = 1, b = 1
let [a = 3, b = a] = [1, 2]; // a = 1, b = 2当解构模式有匹配结果,且匹配结果是undefined,会触发默认值作为返回结果
对象模型的解构
基本
let { foo, bar } = { foo: 'aaa', bar: 'bbb' }; // foo = 'aaa' // bar = 'bbb' let { baz : foo } = { baz : 'ddd' }; // foo = 'ddd'
可嵌套可忽略
let obj = {p: ['hello', {y: 'world'}] }; let {p: [x, { y }] } = obj; // x = 'hello' // y = 'world' let obj = {p: ['hello', {y: 'world'}] }; let {p: [x, { }] } = obj; // x = 'hello'
不完全解构
let obj = {p: [{y: 'world'}] }; let {p: [{ y }, x ] } = obj; // x = undefined // y = 'world'
剩余运算符
let {a, b, ...rest} = {a: 10, b: 20, c: 30, d: 40}; // a = 10 // b = 20 // rest = {c: 30, d: 40}
解构默认值
let {a = 10, b = 5} = {a: 3}; // a = 3; b = 5; let {a: aa = 10, b: bb = 5} = {a: 3}; // aa = 3; bb = 5;
symbol
基本用法
symbol是一种新的数据类型,用来定义对象唯一得属性名,表示独一无二的值
ES6的数据类型有number string object array null undefined symbol
symbol不能使用new命令
let sy=Symbol('kk')
console.log(sy) //Symbol(kk)
console.log(typeof(sy))//symbol
let sy2=Symbol('kk')
console.log(sy==sy2) //false 相同参数symbol()返回的值不相等使用场景
1.作为属性名:由于每一个symbol的值不相等,所以symbol作为对象的属性名,可以保留属性的不重名,symbol作为对象属性名时不能用运算符,要用方括号
注意:symbol值作为属性名时,该属性是公有属性而不是私有属性,但是不会出现在for..of for...in的循环里
let sy1=Symbol("key")
let syobject={}
syobject[sy1]="key1"
console.log(syobject)//Symbol(key): "key1"
let syobject2={
[sy1]:"key2"
}
console.log(syobject2)//Symbol(key): "key2"2.定义常量
Symbol.for()
Symbol.for() 类似单例模式,首先会在全局搜索被登记的 Symbol 中是否有该字符串参数作为名称的 Symbol 值,如果有即返回该 Symbol 值,若没有则新建并返回一个以该字符串参数为名称的 Symbol 值,并登记在全局环境中供搜索。
Symbol.keyFor()
返回一个已登记的symbol类型值的key,用来检测该字符串参数作为名称的 Symbol 值是否已被登记
let sy3=Symbol.for('key3')
console.log(Symbol.keyFor(sy3))//key3若你有其它看法,欢迎指正,期待您的留言!
symbol数据类型还需要研究