一、浅拷贝和深拷贝
浅拷贝:(1)对于基本数据类型,拷贝的是值,修改的时候数据互不影响;(2)对于引用数据类型,拷贝的是在堆内存中存储的内存地址,修改的时候,数据来自同一个内存地址,所以数据会受到影响。比如,修改其中一个拷贝过来的对象,另一个对象中的也会改变。常用es6中的object.assign()实现。
深拷贝:是将一个对象完整的拷贝出来,在堆内存中开辟一块新的内存地址来存储,所以修改的时候,数据之间不会互相影响。常用es6中的扩展运算符,array.concat()实现。
二、防抖和节流
防抖:一段时间内只触发一次,如果在这段时间内再次触发,会重新开始计时。多次触发只有最后一次生效。
节流:一段时间内只触发一次,如果在这段时间内再次触发,是不会重新计时的。多次触发只有第一次生效。
通俗理解:王者荣耀的回城和技能冷却时间。回城使用的就是防抖,如果多次点击,只有最后一次点击之后才算是开始回城。技能冷却使用的就是节流,点击一个技能之后,只有当冷却时间结束,才可以点击下一次,在这过程中重复点击是不生效的。
三、http状态码
2xx:表示请求成功
200:表示一切正常。
3xx:表示重定向
301:永久重定向。
302:临时重定向。
4xx:表示客户端错误
400:请求报文中出现语法错误。
403:跨域问题。
404:请求的资源不存在。
5xx:表示服务端错误
500:服务端在处理请求时出现错误。
四、ES6新特性
(1)let,const:定义变量,常量;
(2)模板字符串:反引号包裹字符串,中间的变量使用${}包裹;
(3)解构赋值:解构对象,数组中的单个数据;
(4)箭头函数:()=> {};
(5)set和map数据结构:set会自动去重;
(6)symbol:基本数据类型,里面的值唯一;
(7) class类:使用extends实现继承;
(8)for...of循环:遍历数组、对象,set和map;
(9)promise(async,await):解决异步编程;
(10)展开运算符:将数组,对象中的值展开,还可以将set转换为数组;
(11)proxy:代理对象,监听对象变化,触发相应逻辑。
五、ajax的使用
(1)创建ajax对象:let ajax = new XMLHttpRequest()
(2)创建ajax请求:ajax.open('请求方式','请求的url地址')
(3)发送ajax请求:ajax.send()
(4)接收服务器返回结果
ajax.onreadystatechange = function (){
if(ajax.readyState == 4 && ajax.status == 200){
var text = ajax.responseText;
console.log(text);
}
}
六、cookie,localstorage,sessionstorage的区别
(1)存储大小:cookie最大只能达到4K,localstorage和sessionstorage能达到5M,甚至更大。
(2)数据的有效时间:
cookie:设置的有一个过期时间,在这个时间过期之前,cookie都是存在的,即使浏览器窗口关闭;
localstorage:数据一直有效,即使浏览器窗口关闭,只有手动删除才会被清除数据;
sessionstorage:数据在浏览器窗口关闭后自动删除。
(3)数据与服务器的交互方式:cookie的数据会自动发送到服务器,localstorage和sessionstorage不会发送到服务器,仅在客户端存储。
(4)作用域:
cookie和localstorage :在所有同源(协议、域名、端口都相同)窗口共享;
sessionstorage :仅在一个浏览器共享,不同浏览器不共享。
七、promise
promise是解决异步编程的一种方案。
有三种状态:pending(等待中),resolved(成功),rejected(失败)
有两种转换过程:
(1)pending=>resolved:从未完成变成成功,在异步操作成功时调用
(2)pending=>rejected:从未完成变成失败,在异步操作失败时调用
promise常用方法
(1)then:一般用来接收异步任务成功的结果
(2)catch:接收失败结果,获取异常信息
(3)finally:不管是成功还是失败都会执行
使用场景:发送ajax或axios请求
好处:防止出现回调地狱,提高代码可读性,像同步操作那样去执行异步操作
八、箭头函数和普通函数的区别
(1)箭头函数没有this,它继承的是父级的this;
(2)箭头函数不能使用new操作符;
(3)箭头函数不能通过call,apply,bind改变this的指向;
(4)箭头函数可以简写:()=> { };
(5)箭头函数没有函数提升;
(6)箭头函数没有原型和arguments对象;
九、async和await
(1)async和await与promise一样,都是用来解决异步编程问题的,它可以避免回调地狱,以最接近同步代码的方式编写异步代码。
(2)async和await必须同时使用。
(3)async:
用来声明一个异步函数,写在函数名之前,这个函数需要返回一个promise对象;
async是Generator的语法糖,它将 Generator 函数和自动执行器,包装在一个函数里来实现。
(4)await:
用来等待这个函数返回的promise对象的resolved(成功)结果,并拿到这个结果(res);
await的好处是可以等数据加载过来之后才去执行下边的js代码;
await有两个作用,一是作为求值关键字,二就是将异步操作转为同步操作。
十、解构赋值
ES6的解构赋值本质上就是“模式匹配”,主要是针对数组和对象。只要等号两边的模式相同,左边的变量就会自动匹配右边相对应的值,如果匹配不成功,相应的变量就是undefined。
// 解构目标为数组
let [a, [[b], c]] = [1, [[2], 3]];
// a = 1
// b = 2
// c = 3
// 解构目标为字符串
let [a, b, c, d, e] = 'hello';
// a = 'h'
// b = 'e'
// c = 'l'
// d = 'l'
// e = 'o'
// 解构目标为对象
let obj = {p: ['hello', {y: 'world'}] };
let {p: [x, { y }] } = obj;
// x = 'hello'
// y = 'world'