目录:let、const、解构赋值
======let 及 块级作用域======— — let — —
1、let声明变量 有块级作用域的概念,不会污染到全局;
2、let或者const声明的变量,不能重复声明,但可以重新赋值;如let num = 1;let num = 2 会报错,直接重新赋值num = 2 则可以。
3、let不会预解析(如果使用变量前没有声明,会报错未定义的;)
— — 块级作用域 — —
{}花括号内就是块级作用域,例如直接一个{}包含,或者if(){}、for(){},需要注意的是,对象的{}不是块级作用域。
扩展知识 — —暂存死区— — 别乱写就不会有这个问题,具体百度
======const======const 声明的是 常量
1、常量在声明的时候必须赋值
2、常量不能重复声明与赋值,与let不同,不管重复声明还是赋值都是不行的
3、常量不会预解析提升
4、常量有块级作用域的概念
5、常量是引用类型(对象、数组、函数)时,里面的数据可以修改,例如 const obj = {age : 10},obj.age = 20 是会生效,可以修改的,但是对象本身不能被修改,const obj = {age : 20}是不行的,只能修改里面的数据,不能修改指向的地址
6、让常量里面的数据也不能修改的方法:Object.freeze() 括号内填常量名,这样就会冻结里面的数据,无法增删改
7、ES6前,声明常量的方法:
使用object.defineProperty(让数据不能修改) 和object.seal(不能扩展数据)方法搭配完成
var obj = { age : 1 }
object.defineProperty( obj(对象名字), ' age(属性名) ',{ writable : false(不能修改) } ) 就能让对象里面的数据不能修改
object.seal (obj) 填入对象名,就能让对象不能扩展数据
封装成一个函数(未完成,如果里面还有一个对象,里面对象的数据还是能修改)
======数组的解构赋值======------例子------数组是有排序的,对应顺序获取想要的值
const arr = [1, 2, 3, [4, 5, [6, 7] ] ];
const [,,, a] = arr =》 a = [4,5 [ 6,7 ] ] 很简单 忘了自己再去试
----- 扩展运算符 ... -------
const arr = [1, 2, 3, [4, 5, [6, 7] ] ];
const [ , , ...a ] =》 取的是 [ 3,[ 4,5,[ 6,7 ] ] ] ...a取的是剩下的所有值
const arr1 = [ 1,2 ] const arr2 = [ 3,4 ]
const arr3 = [ ...arr1,...arr2 ] =》 [ 1,2,3,4 ] 会把两个数组合并成一个数组
可以先理解为,会把数组、对象里的值或属性拆分合并在一起获取
------- 交换变量 --------
let、var a = 10; let、var b = 20;
[ a,b ] = [ b,a ] 两个变量的值就交换了,如果声明的是常量则不能交换
--------接收多个 函数返回值---------
function getUserInfo(id){
return [(1)true,(2){ name:' 小明 ', gender:' 女 ', id:' id ' },(3) ' 请求成功 ' ];
};
const [ (1)status,(2)obj,(3)str ] = getUserInfo(123);
函数执行后返回的是一个数组,所以可以利用数组的解构赋值,获取到函数的返回值(数组中是第一个布尔值放在status中,第二个对象放在obj中,第三个字符串放在str中)
之前的做法是将函数的赋值给一个变量a(或者常量),然后通过变量a的[ i ] 赋值给各个变量b,c,d(或常量),才能够获取到函数的返回值
======对象的解构赋值======
------例子------ 对象里的属性是无序的,所以是通过属性名解构赋值
-------结合扩展运算符---------
(1)获取
const obj = { name : ' 二狗 ',age : '100',sex : ' 男 ' }
const {...s}= obj =>所有都获取到赋值给常量 s
const { name,...s } => name以后的,都获取赋值给 s
(2)合并 扩展运算符会把对象、数组这些拆开与前面合并成一个对象、数组
const obj = { name : '二狗', ... { age : '18', sex : '男' } }
输出obj对象,结果为{name:'二狗',age:'18',sex:'男'}
-------默认值---------
和数组一样,如果是let声明的,某个属性的值是空,可以给他赋值,如果有值(包括null)则改变不了原有的值,也可以给它添加新属性;
---------使用对象传入乱序的函数参数----------常用要掌握
---------获取多个函数返回值-----------和数组差不多
====== 字符串的解构赋值 ======
按顺序获取,一个个字符,可以提取字符串的属性:length、split
const str = 'I Love You';
const [a, b, ...o] = str; a = 'I' b = ' ' o = ['L','o','v','e','','Y'...]