js由三部分组成: ECMAScript + DOM (document对象) +BOM (window对象)
1 严格模式
2 对象的扩展
3 let 和 const
4 Object.keys()
5 for ... of
6 扩展运算符
7 set和map
8 模板字符串 `${name}`
9 默认参数
10 rest参数(可变参数)
11 箭头函数
12 解构赋值
13 异常处理 try-catch
作用:可以帮你写出更安全的js代码,如果未按照规定写,则提前报错异常
语法:
"use strict"
位置:可以是全局,可以是局部
1 变量必须先声明才能使用
"use strict"
a=1; //Uncaught ReferenceError: a is not defined
2 函数的参数不能同名
"use strict"
function f(a,a){ //Uncaught SyntaxError: Duplicate parameter name not allowed in this context
console.log(a,a);
}
f(1,2)
3 不能修改arguments
Uncaught SyntaxError: Unexpected eval or arguments in strict mode
"use strict"
function f(){
//伪数组,关键词,能够存储传递进来的参数
console.log(arguments);
arguments=100;
// for(let i=0;i
let user={
name:"张三",
write:function(){ //es5的写法
console.log("鞋子");
},
read(){ //es6的写法
console.log("读书");
}
}
var 和 let 和 const区别
var 变量提升 分为全局和局部作用域 能够重复定义
let/const 没有变量提升 作用域是块及的 不能够重复定义 TDZ(暂时性死区 )
// TDZ
console.log(a);
let a=100;
补充
函数分为声明式和表达式:
声明式:function f(){}
表达式:var f=function(){} 类似于 var 变量 =值
var 变量提升, 声明式函数也能够提升 ,并且优先级: 声明式函数 》 var
let a=b=c=1;等同于 ;let a=1 ;b=1;c=1
用来遍历对象属性,类似于 for–in
let obj={
name:"张三",
age:19
}
let arr=Object.keys(obj)
console.log(arr);
arr.forEach(k=>{
console.log(k,obj[k]);
})
for循环 forEach map 性能优先级
for 》 forEach 》Map (返回数组)
特点:
1 里面的v就直接代表每一个元素
2 没有下标
let arr=[2,3,4,5]
for(let v of arr){
console.log(v);
}
1 默认参数是用来描述形参
2 直接在形参后面添加 = 默认值即可
3 生效条件:实参没有传值或者传递了一个undefined
function f(a=10,b=10,c=20){
console.log(a,b,c);//1 10 2
}
f(1,undefined,2)
1 和arguments类似,当要传递的参数个数未知时,可以使用可变参数
2 可变参数能够把传递进来的值放进真实的数组
3 如果没有传递任何参数,则可变参数的值就是一个空[]
4 如果形参既有普通参数又有可变参数,则可变参数只能放到最后
5 可变参数不能由默认值
function f(...a){
console.log(a); // [1,2,3,4]
}
f(1,2,3,4)
//无参时
let f=()=>{
console.log("ok");
}
//有一个形参时
let f2=(a)=>{
console.log(a);
}
//简写
let f2_1=a=>{
console.log(a);
}
//当有>1个参数时
let f3=(a,b)=>{
console.log(a,b);
}
let f=()=>{
return "ok"
}
//简写({return } 都必须省略)
let f2=()=>"ok"
1 拷贝分为浅拷贝和深拷贝
2 无论是浅拷贝还是深拷贝,两个对象地址是不同的
3 浅拷贝:如果里面有引用类型的属性或元素,则拷贝的是地址
深拷贝:如果里面有引用类型的属性或元素,则拷贝的是内容
方法1(推荐): 递归
方法2(简单但有瑕疵):JSON.parse(JSON.stringify(源数据))
如果属性带有正则表达式、日期
概念:能够把数据展开的运算符,能够用于数组或对象
语法: ...数组 / ...对象
let arr=[1,2,3]
let arr2=[...arr]
面试题:能够用哪些方法来实现浅拷贝
1 =
2 concat
3 ...
let arr1=[1,2,{name:"张三"},[99,100]];
let arr2=[...arr1]
// arr2[2].name='李四';//arr1受到影响
// arr2[2]='李四';//arr1不受影响
console.log(arr1);
数组
let arr1=[1,2]
let arr2=[5,6]
let arr3=[...arr1,...arr2]
console.log(arr3);
对象:
let u1={
name:"张三",
age:18,
dog:{
type:"金毛"
}
}
let u2={
name:"李思",
address:"重庆",
dog:{
type:"泰迪"
}
}
let u3={...u1,...u2}
es6提供了新的数据结构
概念:类似于数组,是用来存储数据的
特点:元素是唯一(自带去重功能)
基本用法:
//实例化
let s=new Set();
//添加
s.add("a")
s.add("b")
s.add("A")
s.add("c")
s.add({})
s.add({})
//转为数组
let arr=[...s];
console.log(arr);
已知数组,如何快速去重
let arr=[1,3,"a",'b','b',3,6]
let s=new Set(arr);
arr=[...s];
console.log(arr);
概念:类似于对象,和对象最大的区别就是,k可以是任意类型
存储方式:k-v 键值对
特点:k不能重复,v可以重复
用法:
//实例化对象
let m=new Map();
//添加
m.set("a","a")
m.set(1,"b")
let u={};
let arr=[]
m.set(u,"c")
m.set(arr,"a")
//根据k得v
console.log(m.get(u));
//获取长度
console.log(m.size);
//遍历
m.forEach((v,k)=>{
console.log(k+":"+v);
})
demo
let arr=[1,2,3]
要求,分别把每个元素赋值给三个变量
let a=arr[0]
let b=arr[1]
let c=arr[2]
很麻烦,为了精简,可以通过解构赋值
语法:
=左边是要赋值的变量
=右边是确确实实的值
=左右两边结构必须匹配
let [] =[] --按照数组的元素顺序赋值
let {} ={} --按照k的匹配赋值
数组:
// let [a,b,c] = [1,2,3]
// console.log(a,b,c);
// let [a,,b]=[1,2,3]
// console.log(a,b);//1 3
// let [a,b]=[1,2,3]
// console.log(a,b);//1 2
// let [a,b,c]=[1,2]
// console.log(a,b,c); //1 2 undefined
// let [a,b,c=10]=[1,2,undefined]
// console.log(a,b,c); //1 2 10
// let [a,...b]=[1,2,3,4]
// console.log(a,b);//1 [2,3,4]
// let [a,b] = [1,2]
// function f([a,b]){
// console.log(a,b);
// }
// f([1,2])
// let [a,[b],c]=[1,[2,3],4]
// console.log(a,b,c); // 1 2 4
对象:
let {name:name,age:age} ={name:"张三",age:18}
console.log(name,age);
//简写
// let {name,age} ={name:"张三",age:18}
// console.log(name,age);
SyntaxError 语法错误
Duplicate 重复