1.变量声明
let 用于声明一个变量
-
变量不会提升,即在变量声明之前无法使用该变量
-
不可以重复声明
-
具有块级作用域,只在当前作用域有效
const 用于声明一个常量
-
变量声明不会被提升,即在变量声明之前无法使用该变量
-
不允许重复声明。
-
具有局部作用域,即const声明的变量只能在对应代码块中使用
-
const声明的变量在声明的时候就需要赋值,并且只能赋值一次,不能修改。
// ES5 var变量声明会提前
console.log(a);
var a = 1;
// ES6 let,const变量声明不会提前,有块级作用域的概念,不允许重复声明
// const声明的变量,声明时就要赋值,而且不允许修改
// 1.变量声明不会提前
// console.log(name); //报错 1.变量声明不会提前
let name = 'wll';
{
let name2 = 'cjk';
console.log('内部',name2,name);
}
console.log('外部',name);
// 2.有块级作用域的概念
for (let i = 1;i<10;i++){
console.log(i);
}
// console.log(i); //报错 2.有块级作用域的概念
function myFun(){ //函数有局部作用域
var age = 12;
console.log(name);
}
myFun();
// console.log(age); //报错
//3.不允许重复声明
const a = 1;
// const a = true; //报错 3.不允许重复声明
// 4.const声明的变量,声明时就要赋值,而且不允许修改
//const c; //报错 const声明的变量声明时就要赋值
const c = 0;
// c++; //报错 const声明的变量不允许修改
2.数组解构
1)数组的不完全解构
// 数组的不完全解构
let [a,b] = [1,2,3]; //结果 1 2
let [a,b,c] = [1,[2,3],4];
console.log(a,b,c); //1 [ 2, 3 ] 4
let [a,[b],c] = [1,[2,3],4];
console.log(a,b,c); //1 2 4
2)集合解构 ...扩展运算符
// 拓展运算符
// ...用在=左边,有聚合的作用,生成新的对象和数组
// ...用在=右边,有拆分、剥离的作用
let [a,...b] = [1,2,3]
console.log(a,b); // 结果 1 [ 2, 3 ]
3)默认值解构(当匹配值严格等于undefined时,默认值生效)
// 数组解构设置默认值,有的话匹配,没有的话用默认值
let [a,b,c] = [1,2];
console.log(a,b,c); //结果 1 2 undefined
let [a,b,c=10] = [1,2];
console.log(a,b,c); //结果 1 2 10
let [a,b,c=10] = [1,2,3];
console.log(a,b,c); //结果 1 2 3
4)默认值也可以是函数
function myFun(){
console.log('函数'); //函数没有定义返回值
}
let [a,b,c=myFun()] = [1,2]; //c为myFun函数的返回值return
console.log(a,b,c); //1 2 undefined
3.对象解构
1)对象解构
使用对象的简写形式,省略了key值,保留了value值对应的变量
等号左边的变量放到大括号内部,匹配右侧对象中的元素。对象的属性没有次序,变量必须与属性同名,才能取到正确的值 如果变量名和属性名不一致,需要重命名
// 对象解构 使用对象的简写形式,省略了key值,保留了value值对应的变量
let {name,age} = {name:'wll',age:22};
console.log(name,age); //wll 22
let {name:username,age:userage} = {name:'wll',age:22};
console.log(username,userage); //wll 22
2)嵌套解构
一层一层解构,先解构最外层
// 嵌套解构
let obj = {p:['hello',{y:'world'}]};
let {p:[a,{y:b}]} = obj; //一层一层解构,先解构最外层
console.log(a,b); //hello world
3)对象解构 设置默认值
默认值生效的条件是,对象的属性值严格等于undefined
// 对象解构 设置默认值
let {name,age,gender} = {name:'wll',age:12};
console.log(name,age,gender); //wll 12 undefined
let {name,age,gender='female'} = {name:'wll',age:12};
console.log(name,age,gender); //wll 12 female
let {name,age,gender='female'} = {name:'wll',age:12,gender:'male'};
console.log(name,age,gender); //wll 12 male
4)对象解构的拓展
// 对象解构的拓展
let {a,...b} = {a:1,b:2,c:3};
console.log(a,b); //1 { b: 2, c: 3 }
let {...b} = {a:1,b:2,c:3};
console.log(b); //{ a: 1, b: 2, c: 3 }
5) 对象的深拷贝
开辟了一个新的内存空间
let obj = {a:1,b:2,c:3};
let {...b} = obj;
console.log(b); //{ a: 1, b: 2, c: 3 }
console.log(obj === b); //false
6) 经典面试题
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}
4.字符串解构
1)可以使用数组解构,使用数组结构可以获取指定字符
2)使用对象解构,使用对象结构可以获取实例属性方法
3)字符串转数组(数组解构,拓展运算符)
// 字符串既可以使用数组[]解构,也可以使用对象{}解构
let [a,b,c,d,e] = 'hello';
console.log(a,b,c,d,e); //h e l l o
let {length,toString} = 'hello';
console.log(length,toString); //5 [Function: toString]
// 字符串转数组(数组解构,拓展运算符)
let [...arr] = 'hello';
console.log(arr); //[ 'h', 'e', 'l', 'l', 'o' ]
5.number解构和Boolean解构
1)数字和Boolean只能使用{}解构其原型对象中的方法和属性
2)而不能使用[]解构,因为数字和Boolean是不可迭代的
//数字和Boolean只能使用{}解构其原型对象中的方法和属性
//而不能使用[]解构,因为数字和Boolean是不可迭代的
// let [a,b] = 10; //报错,数字不迭代
// let [a] = true; //报错,布尔不迭代
let {valueOf} = 10;
console.log(valueOf); //[Function: valueOf]
let {valueOf} = true;
console.log(valueOf); //[Function: valueOf]
6.对象拓展
对象简写
ES6中规定可以直接在对象中写入变量和函数作为对象的属性和方法,此时属性名为变量名, 属性值为变量的值。对象简写在未来的使用频率极其高。
let name='wll';
let age =12;
let obj = {
name,
age,
sayName(){
console.log(this.name);
}
}
obj.sayName(); //wll
静态方法
1)Object.is() 比较两个值是否一样
// === 比较两个值是否全等
//1. Object.is() 比较两个值是否一样
console.log(1 === 1); //true
console.log(Object.is(1,1)); //true
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() 深拷贝
//2. Object.assign() 对象的深复制
let obj1 = {};
let obj2 = {name:'cjk',age:12};
let obj3 = {name:'wll',gender:'female'};
//深复制,将obj2复制给obj1,返回值是obj1
Object.assign(obj1,obj2);
console.log(Object.assign(obj1,obj2)); //{ name: 'cjk', age: 12 }
console.log(obj1); //{ name: 'cjk', age: 12 }
console.log(obj1 === obj2); //false
//将obj2和obj3合并之后复制给obj1,若obj2和obj3中有相同的部分,应使用后定义的那部分
Object.assign(obj1,obj2,obj3);
console.log(obj1);
//{ name: 'wll', age: 12, gender: 'female' }
3)Object.setPrototypeOf() 设置原型对象中的方法 Object.getPrototypeOf() 获取原型对象中的方法
//3.Object.setPrototypeOf()设置原型对象中的方法
//Object.getPrototypeOf()获取原型对象中的方法
let obj1 = {};
let obj2 = {name:'cjk',age:12};
let obj3 = {name:'wll',gender:'female'};
Object.setPrototypeOf(obj1,obj2);
console.log(obj1.__proto__); //{ name: 'cjk', age: 12 }
console.log(obj1.constructor.prototype); //[Object: null prototype] {}
console.log(Object.getPrototypeOf(obj1)); //{ name: 'cjk', age: 12 }
4)Object.keys() 获取所有属性名组成的数组
Object.values() 获取所有属性值组成的数组
Object.entries() 获取键值对组成的数组
//4.Object.keys() 获取所有属性名组成的数组
//Object.values() 获取所有属性值组成的数组
//Object.entries() 获取键值对组成的数组
let obj1 = {
name:'wll',
age:22,
gender:'female'
}
let keys = Object.keys(obj1);
let values = Object.values(obj1);
let entries = Object.entries(obj1);
console.log(keys,values,entries);
//[ 'name', 'age', 'gender' ]
//[ 'wll', 22, 'female' ]
//[ [ 'name', 'wll' ], [ 'age', 22 ], [ 'gender', 'female' ] ]
entries.forEach((item,index)=>{
console.log(index,item[0],item[1]);
})
// 0 name wll
// 1 age 22
// 2 gender female
7.拓展运算符
1.在=左边:聚合的作用,返回值和外层包裹的标识符有关系
// ...用在=左边,有聚合的作用,生成新的对象和数组
let [a,...b] = [1,2,3]
console.log(a,b); // 结果 1 [ 2, 3 ]
let {a,...b} = {a:1,b:2,c:3};
console.log(a,b); //1 { b: 2, c: 3 }
let {...b} = {a:1,b:2,c:3};
console.log(b); //{ a: 1, b: 2, c: 3 }
2.在=右边:剥离(展开)的作用,把对象或数组中每个属性或键值对单独
// 拓展运算符用在=右边的,可以剥离出来
let obj1 = {
name:'wll',
age:22
}
let obj2 = {
...obj1,
name:'cjk',
gender:'female'
}
console.log(obj2);
//{ name: 'cjk', age: 22, gender: 'female' } 如果有相同的属性,则后来者居上
let arr1 = ['tom','lerry','jecky'];
let arr2 = [...arr1,'wll','cjk'];
console.log(arr2);
//[ 'tom', 'lerry', 'jecky', 'wll', 'cjk' ]
3.用在函数形参位置,叫rest参数,相当于在=左边的功能(聚合的作用)
//ES6 引入 rest 参数(形式为...变量名),用于获取函数的多余参数,这样就不需要使用arguments对象了。
// ...用在函数的形参位置,叫做rest参数,也叫拓展运算符的逆运算
let myFun4 = function (a,...b){
console.log(a,b);
}
myFun4(1,2,3,4,5,6) //1 [ 2, 3, 4, 5, 6 ]
8.数组API
1)Array.from()
将其他类型数据转换成数组
//1.Array.from() 将其他类型数据转换成数组
// ES5 Array.prototyoe.slice.call('类数组对象',0)
let arrObj = {
0:'zhangsan',
1:'lisi',
2:'terry',
length:3
}
console.log(Array.from(arrObj));
//[ 'zhangsan', 'lisi', 'terry' ]
let str = 'hello'
let arr1 = Array.from(str);
console.log(arr1); //[ 'h', 'e', 'l', 'l', 'o' ]
2)Array.of()
用于将一组值转换为数组。这个的主要目的是弥补数组构造函数Array()的不足
//2.Array.of() 用于将一组值转换为数组。这个的主要目的是弥补数组构造函数Array()的不足。
let arr1 = Array.of(3);
console.log(arr1); //[ 3 ]
3)Array.prototype.find()
find()方法用于找出第一个符合条件的数组成员。或者undefined
//3.Array.prototype.find() find()方法用于找出第一个符合条件的数组成员。或者undefined
let arr1 = Array.of(1,2,3,4,5,6);
let result = arr1.find((item,index)=>{
return item > 2
})
console.log(result); //3
4)Array.prototype.findIndex()
findIndex()找出第一个符合条件的数组成员的索引。如果所有成员都不符合条件,则返回-1
//4.Array.prototype.findIndex() //findIndex()找出第一个符合条件的数组成员的位置。如果所有成员都不符合条件,则返回-1.
let arr1 = Array.of(1,2,3,4,5,6);
let result = arr1.findIndex((item,index)=>{
return item > 2
})
console.log(result); //2
5)Array.prototype.includes()
该方法返回一个布尔值,表示某个数组是否包含给定的值,与字符串的includes方法类似。ES6引入了该方法。
//5.Array.prototype.includes() 该方法返回一个布尔值,表示某个数组是否包含给定的值,与字符串的includes方法类似。ES6引入了该方法。
let arr1 = Array.of(1,2,3,4,5,6);
let result1 = arr1.includes(1);
console.log(result1); //true
6)Array.prototype.fill()
fill()方法使用给定的值填充一个数组。改变原数组
//6.Array.prototype.fill() fill()方法使用给定的值填充一个数组。改变原数组
let arr1 = Array.of(1,2,3,4,5,6);
let result2 = arr1.fill(7); //改变原数组
console.log(result2 === arr1); //true
7)遍历
Array.prototype.keys() keys()是对键名的遍历
Array.prototype.values() values()是对属性值的遍历
Array.prototype.entries() entries()是对键值对的遍历。
//7.Array.prototype.keys() keys()是对键名的遍历
//Array.prototype.values() values()是对属性值的遍历
//Array.prototype.entries() entries()是对键值对的遍历。
let arr1 = Array.of(1,2,3,4,5,6);
let keys = arr1.keys();
let values = arr1.values();
let entries = arr1.entries();
console.log(keys,values,entries); //Object [Array Iterator] {}
console.log(Array.from(keys)); //[ 0, 1, 2, 3, 4, 5 ]
console.log(Array.from(values)); //[ 1, 2, 3, 4, 5, 6 ]
console.log(Array.from(entries)); //[ [ 0, 1 ], [ 1, 2 ], [ 2, 3 ], [ 3, 4 ], [ 4, 5 ], [ 5, 6 ] ]