1.变量
1.1 let特点(用于申明变量)
(1) 变量申明不会被晋升,即在变量申明之前无奈应用该变量(2) 具备部分作用域,即let申明的变量只能在对应代码块中应用(3) 不容许反复申明
1.2 const特点(用于申明常量)
const 用于申明一个常量(1) 变量的申明不会被晋升,即在变量申明之前无奈应用该变量(2) 不容许反复申明(3) 具备部分作用域,即const申明的变量只能在对应代码块中应用。(4) const申明的变量在申明的时候就要赋值,并且只能赋值一次,不能批改。
2. 解构
ES6容许依照肯定模式,从数组和对象中提取值,对变量进行赋值,这被称为解构。解构得实质属于“模式匹配”,只有等号两边得模式雷同,右边得变量就会被赋予对应得值。如果解构不胜利,变量得值就等于undefined。
2.1 数组解构
等号右边的变量放到中括号外部,匹配右侧数组中的元素。(1) let [a,b,c] = [1,2,3]; console.log(a,b,c);//1,2,3(2) let [a,b,c,d,e] = [1,2,3,[4,5],6]; console.log(a,b,c,d,e);//1,2,3,[4,5],6(3) 不齐全解构 let [a,b,c,[d],e] = [1,2,3,[4,5,6],7]; console.log(a,b,c,d,e);//1,2,3,[4],7(4) 汇合解构 应用...扩大运算符,用在=右边聚合作用,返回一个新数组 let [a, ...b] = [1,2,3]; console.log(a,b);//1,[2,3](5) 默认值解构(当匹配值严格等于undefined时,默认值失效) let [a,b,c=6]=[4,5]; console.log(a,b,c);//2,5,6 let [a=1, b=2, c=3] = []; console.log(a,b,c);//1,2,3(6) 默认值也能够是函数 function test(){ console.log("hello"); } let [a=test()] = [1]; console.log(a);//1 let [a] = [test()]; console.log(a);//"hello" undefiend //产生undefined的起因是函数test没有返回值。(7) let arr = [1,2,3,4]; let [...a] = arr; console.log(a===arr);//false
2.2 对象解构
等号右边的变量放到大括号外部,匹配右侧对象中的元素。对象的属性没有秩序,变量名必须与属性同名,能力取到正确的值。(1) let {foo,bar} = {foo:"hello",bar:"world"}; console.log(foo,bar);//helloworld(2) 如果变量名和属性名不统一,须要重命名 let {foo:baz} = {foo:"hello",baz:"world"}; console.log(baz);//hello(3) 对象的解构赋值是上面模式的简写,后面属性名前面变量名 let {foo:foo,bar:bar} = {foo:"hello",bar:"world"};(4) 嵌套构造 let obj = { p:["hello",{y:"world"}] } let {p:[a,{y:b}]} = obj; console.log(a,b);//hello world(5) 默认值构造 let {x:y=3}={}; console.log(y);//3面试题:const [a,b,c,...d]=[1,2,3,11,999];const {e,f,f1,g,...h}={f:4,g:5,i:6,j:7};console.log(a,b,c,d,e,f1,g,h);//1,2,3,[11,999],undefined,undefined,5,{i:6,j:7}
2.3 字符串解构
(1) 能够应用对象解构或者是数组解构,应用数组解构能够获取指定字符;应用对象解构能够获取实例属性办法。 let [a,b,c] = "hello"; console.log(a,b,c);//h e l(2) 将字符串转换为数组 let [...arr] = "hello"; console.log(arr);//["h","e","l","l","o"](3) 应用对象解构 let {toString,valueOf,length}="hello";//相当于把“hello”当成String根本包装器类型 console.log(toString,valueOf,length);//[Function: toString] [Function: valueOf] 5 let str = "hello"; let { length, toString} = str; console.log(length === str.__proto__.length);//false console.log(toString === str.__proto__.toString);//true
2.4 数值解构
能够获取到数值包装器构造函数原型中指定的办法let {toString,valueOf} = 10;console.log(toString,valueOf);//[Function: toString] [Function: valueOf]
2.5 布尔解构
能够获取到布尔包装器构造函数原型中指定得办法let { valueOf } = true;console.log(valueOf);//[Function: valueOf]
3. 对象(ES6中对于Object的扩大次要是静态方法的扩大)
3.1 对象的简写
ES6中规定能够间接在对象中写入变量和函数作为对象的属性和办法,此时属性名为变量名,属性值为变量的值。对象简写在将来的应用频率极其高。let name = "zhangsan";let age = 12;let gender = "male";let obj = { name, age, gender}
3.2 对象API拓展
(1) Object.is(a,b); 判断a和b的值是否相等 相似于=== console.log(1===1);//true console.log(Object.is(1,1));//true console.log(Object.is(1,2));//false console.log(+0 === -0);//true console.log(Object.is(+0,-0));//false console.log(NaN === NaN);//false console.log(Object.is(NaN,NaN));//true(2) Object.assign(o, obj); 实现对象深复制、拷贝。第一个参数是指标对象,将obj的值复制给o let o = {}; let obj { name:"zhangsan", age: 12 } let result = Object.assign(o,obj);//把obj中的内容复制到o对象当中,并返回o对象 console.log(o);//{name:"zhangsan",age:12} console.log(result);//{name:"zhangsan",age: 12} console.log(o === result);//true Object.assign(o,obj,obj1);三个参数代表的是合并对象obj,obj1到o当中并返回o对象 let o = {}; let obj = { name:"zhangsan", age:12 } let obj1 = { name:"lisi", gender:1 } let result = Object.assign(o,obj,obj1); console.log(o);{name:'lisi',age:12,gender:1} console.log(result);//{name:'lisi',age:12,gender:1} let result1 = Object.assign(o,obj1,obj); console.log(result1);//{name:"zhangsan",age:12,gender:1}(3) Object.getPrototypeOf() 获取原型对象中的办法 let obj = { name:"", age:1 } console.log(obj.__proto__);//[Object: null prototype] {} console.log(obj.constructor.prototype);//[Object: null prototype] {} console.log(Object.getPrototypeOf(obj));//[Object: null prototype] {}(3) 设置原型对象中的办法 Object.setPrototypeOf(obj,obj1) 设置obj的原型对象为obj1 let obj = { name:"zhangsan", age:12 } let obj1 = { gender:"male" } Object.setPrototypeOf(obj,obj1); console.log(obj.__proto__);//{ gender: "male"} console.log(obj.constructor.prototype);// [Object: null prototype] {} console.log(obj.constructor.prototype === obj1);//false console.log(Object.getPrototypeOf(obj));//{ gender: "male"}(4) Object.keys() 返回对象属性名组成的数组 Object.values() 返回对象属性值组成的数组 Object.entries() 返回对象[属性名,属性值]组成的二维数组 let obj = { name:'terry', age: 12 } //获取所有属性名组成的数组 console.log(Object.keys(obj));//[ 'name', 'age'] //获取所有属性值组成的数组 console.log(Object.values(obj));// [ 'terry', 12] //获取键值对组成的数组 console.log(Object.entries(obj));//[ [ 'name','terry'], [ 'age', 12]]
4.数组(静态方法和实例办法都有所扩大)
4.1 扩大运算符
(1)... 用在=右边,聚合的作用(对象,数组的解构) let [a, ...b] = [1,2,3,4,5] console.log(a,b);//1,[2,3,4,5](2)... 用在=左边,开展(剥离)的作用 let obj1 = { name:"tom", age: 20 } let obj2 = { ...obj1, gender: "male", age:18 }
4.2 数组API
(1) Array.from(); 将类数组对像或其余数据类型(可迭代的)转成数组 ES5将类数组对象或其余数据类型(可迭代的)转成数组的办法: Array.prototype.slice.call("类数组对象",0); ES6转数组的办法: let arrObj = { 0:"tom", 1: "12", 3: "男", 4: ['jacky','terry'] length:4 } let arr = Array.from(arrObj); console.log(arr);//["tom","12","男",['jacky','terry']] 如果将下面代码中的length属性去掉,答案会是一个长度为0的空数组 而后再把代码改一下,就是具备length属性,然而对象的属性名不再是数字类型,而是其余字符串型的,代码如下 let arrObj = { name:"tom", age:12, sex:"男", friends:['jacky','terry'], length: 4 } let arr = Array.from(arrObj); console.log(arr);//[undefined, undefined, undefined, undefined] 由上可知,要将一个类数组对象转换为一个真正的数组,必须具备以下条件: a. 该类数组对象必须具备length属性,用于指定数组的长度。如果没有length属性,那嚒转换后的数组是一个空数组。 b. 该类数组对象的属性名必须为数值或字符串型的数字。该类数组对象的属性名能够加引号,也能够不加引号。 将字符串转换为数组: let str = "hello"; console.log(Array.from(str));//['h','e','l','l','o'](2) Array.of() 创立数组实例 实参就是数组的元素,为了解决new Array(10)传递一个数组,创立length 创立数组 let arr1 = new Array(1,2,3,4); console.log(arr1);//[1,2,3,4] let arr2 = new Array(3); console.log(arr2);//[<3 empty items>] let arr3 = Array.of(3); console.log(arr3);//[3](3) Array.prototype.find( (item) => {}) find办法返回第一个满足条件的元素或者undefined,参数是回调函数 let arr = [1,2,3,2,3]; let result = arr.find((item) => { return item>2; }) console.log(result);//3(4) Array.prototype.findIndex(); //参数回调函数 findIndex返回第一个满足条件的元素的索引或者-1 let arr = [1,2,3]; let result = arr.findIndex((item) => { return item>2; }) console.log(result);//2(5) Array.prototype.includes(); includes是否蕴含某个元素,返回true/false let arr = [1,2,3] console.log(arr.includes(3));//true(6) Array.prototype.fill() 用来填充数组,批改原数组 let arr = [1,2,3]; let result = arr.fill(4); console.log(arr,result, arr===result);//[4,4,4] [4,4,4] true(7) Array.prototype.keys(); Array.prototype.values() Array.prototype.entries() //keys,values,entries变量以后是迭代器对象 let arr = [2,3,4]; let keys = arr.keys(); let values = arr.values(); let entries = arr.entries(); console.log(keys,values,entries);//Object [Array Iterator] {} Objcet [Array Iterator] {} Object [Array Iterator] {} 迭代器实现了Iterator接口,只有有实现了Iterator接口就能够for-of遍历