// ES6允许按照一定模式 从数组和对象中提取值 对变量进行赋值 这就是解构 let [a,b,c] = [1,2,3]//模式匹配 let [foo,[[bar],baz]] = [1,[[2],3]] foo//1 bar//2 baz//3 let [head,...tail] = [1,2,3,4]; head//1 tail//[2,3,4] let [x,y,...z] = ['a']; x//'a' y//undefined 说明解构不成功 值为undefinded z//[] // 不完全解构模式 即等号左边的模式 只匹配部分等号右边的数组 即不完全解构 let [x,y] = [1,2,3] x//1 y//2 // Set结构 也可使用数组的解构赋值 let[x,y,z] = new Set(['a','b','c']) x//'a' // 解构赋值允许指定默认指 let [foo = true] = [] foo//true let [x,y = 'b'] = ['a'] x//'a' y//'b'
const [a,x,c,s,a] = 'hello';//字符串的解构赋值 是将字符串转换成类似数组的对象 a//h x//e c//l // 类似数组的对象都有一个length属性 所以还可以对这个属性解构赋值
// const声明一个只读常量 一旦声明 常量的值便不能改变 //因为const 声明变量不能改变 则必须一开始声明时就应该赋值 和var 不一样 否则会报错 //const 作用域与let相同 只在 声明所在的块级作用域有效 声明的变量也不提升 同样存在暂时性死区 //const 本质上保证的不是变量的值不得改动 而是变量指向的那个内存地址所保存的数据不得改动 // 对于复合型数据 变量指向的内存地址 保存的只是一个指向实际数据的指针 const 只能保证 // 这个指针是固定的(即总是固定指向一个地址) const foo = {} foo.prop = 123; console.log(foo.prop); // foo = {}//报错 因为常量foo储存的是一个地址 这个地址指向一个对象 不可变的是这个地址 即不能把这个地址指向 // 指向另一个地址 但对象本身是可变的数据结构 所以可以添加属性 const a=[]; a.push('hello') a.length = 0; // a = ['dave']//报错 同上 改变了数组 console.log(a); const fooo = Object.freeze({});//冻结对象 fooo.prop = 123; //严格模式下可能会报错 一般模式新添加属性不起作用 // 将对象彻底冻结的函数 var constan = (obj) => { Object.freeze(obj); Object.keys(obj).forEach((key,i)=>{ if(typeof obj[key] == 'object'){ constan(obj[key]) } }) }
// ES5只有两种声明变量的方法 // 1.var 命令 // 2.function命令 // ES6声明变量的方法: // 1.var // 2.let // 3.const // 4.class // 5.function命令 // 6.import命令 // 顶层对象的属性 // 浏览器环境中 指window对象 // Node中指 global对象 // ES6中 var function 声明的全局变量依旧属于顶层对象的属性 (为和ES5兼容) // 但let const class 声明的全局变量不再属于顶层对象的属性 // globalThis对象 // 浏览器里 顶层对象是window self也指向顶层对象 // node里 顶层对象是global