说一说cookie sessionStorage localStorage 区别?
Cookie、SessionStorage、 LocalStorage都是浏览器的本地存储。
它们的共同点:都是存储在浏览器本地的
它们的区别:cookie是由服务器端写入的,而SessionStorage、 LocalStorage都是由前端写入的,cookie的生命周期是由服务器端在写入的时候就设置好的,cookie不安全,容易窃取。LocalStorage是写入就一直存在,除非手动清除,SessionStorage是页面关闭的时候就会自动清除。cookie的存储空间比较小大概4KB,SessionStorage、 LocalStorage存储空间比较大,大概5M。
(((Cookie、SessionStorage、 LocalStorage数据共享都遵循同源原则,SessionStorage还限制必须是同一个页面。在前端给后端发送请求的时候会自动携带Cookie中的数据,但是SessionStorage、 LocalStorage不会
加分回答 由于它们的以上区别,所以它们的应用场景也不同,Cookie一般用于存储登录验证信息SessionID或者token,LocalStorage常用于存储不易变动的数据,减轻服务器的压力,SessionStorage可以用来检测用户是否是刷新进入页面,如音乐播放器恢复播放进度条的功能。
说一说JS数据类型有哪些,区别是什么?
总体上划分为基本数据类型和引用数据类型,基本数据类型就是直接存储在栈内存中的简单数据段,包括:Undefined、Null、Boolean、Number和String,以及ES6新增的symbol,BigInt。引用数据类型就是保存在堆内存中的对象,仅将指针存储在栈内存,该指针指向堆中该实体的起始地址,解释器通过指针取得堆中引用数据的实体。包括对象(Object)、数组(Array)、函数(Function)…,。
加分:Symbol是ES6新出的一种数据类型,不能使用new Symbol()创建, 这种数据类型的特点就是没有重复的数据,可以作为object的key不用担心覆盖.
//缺点:无法应用对象的方法来获取键名(for in Object.getOwnPropertyNames() Object.keys().
需要使用Object.getOwnPropertySymbols(obj)获得这个obj对象中key类型是Symbol的key值。
o1[id]; //只能使用中括号方式才能获取到symbol键名的键值。
说一说你对闭包的理解?
解题思路
得分点 变量背包、作用域链、局部变量不销毁、函数体外访问函数的内部变量、内存泄漏、内存溢出、形成块级作用域、柯里化、构造函数中定义特权方法、Vue中数据响应式Observer 标准回答 闭包 一个函数和词法环境的引用捆绑在一起,这样的组合就是闭包(closure)。一般就是一个函数A,return其内部的函数B,被return出去的B函数能够在外部访问A函数内部的变量,这时候就形成了一个B函数的变量背包,A函数执行结束后这个变量背包也不会被销毁,并且这个变量背包在A函数外部只能通过B函数访问。 闭包形成的原理:作用域链,当前作用域可以访问上级作用域中的变量 闭包解决的问题:能够让函数作用域中的变量在函数执行结束之后不被销毁,同时也能在函数外部可以访问函数内部的局部变量。 闭包带来的问题:由于垃圾回收器不会将闭包中变量销毁,于是就造成了内存泄露,内存泄露积累多了就容易导致内存溢出。 加分回答 闭包的应用,能够模仿块级作用域,能够实现柯里化,在构造函数中定义特权方法、Vue中数据响应式Observer中使用闭包等。
什么是深拷贝和浅拷贝,请举例说明?如何区分深拷贝与浅拷贝
假设B复制了A,当修改A时,看B是否会发生变化,如果B也跟着变了,说明这是浅拷贝,如果B没
变,那就是深拷贝;
引用关系的拷贝过程
var obj1 = {id:1,name:'obj1'};
obj2 = obj1; //相当于只是复制了一个指针地址,obj1和obj2实际指向的是同一数据对象
所以
obj2.id = 2;
obj1.id 的结果会同步变化
说一说null 和 undefined 的区别,如何让一个属性变为null
标准回答 undefind 是全局对象的一个属性,当一个变量声明了但没有被赋值或者一个函数没有返回值或者某个对象不存在某个属性却去访问或者函数定义了形参但没有传递实参,这时候都是undefined。**undefined通过typeof判断类型是'undefined'。
null代表对象的值未设置,相当于一个对象没有设置指针地址就是null。null通过typeof判断类型是'object'。
undefined 表示一个变量初始状态值,而 null 则表示一个变量被人为的设置为空对象,而不是原始状态。在实际使用过程中,不需要对一个变量显式的赋值 undefined,当需要释放一个对象时,直接赋值为 null 即可。 让一个变量为null,直接给该变量赋值为null即可。
加分回答 null 其实属于自己的类型 Null,而不属于Object类型,typeof 之所以会判定为 Object 类型,是因为JavaScript 数据类型在底层都是以二进制的形式表示的,二进制的前三位为 0 会被 typeof 判断为对象类型,而 null 的二进制位恰好都是 0 ,因此,null 被误判断为 Object 类型。 对象被赋值了null 以后,对象对应的堆内存中的值就是游离状态了,GC 会择机回收该值并释放内存。因此,需要释放某个对象,就将变量设置为 null,即表示该对象已经被清空,目前无效状态。