WEB前端 面经

WEB前端 - JS部分

1.JS数据类型

  • 基本数据类型:Boolean、Number、String、undefined、Null、Symbol(ES6新增,表示独一无二的值);
  • 引用数据类型:Object、Array、Function;

2.判断数据类型的方法有哪些?

css 复制代码
利用`typeof`可以判断数据的类型;  
A instanceof` B可以用来判断A是否为B的实例,**但它不能检测 null 和 undefined**;  
`B.constructor == A`可以判断A是否为B的原型,**但constructor检测 Object与instanceof不一样,还可以处理基本数据类型的检测**。

3.var、let、const的区别是什么?

varletconst都是用于声明变量或函数的关键字。其区别在于:

var let const
作用域 函数作用域 块级作用域 块级作用域
作用域内声明提升 无(暂时性死区)
是否可重复声明
是否可重复赋值 否(常量)
初始化时是否必需赋值

4.闭包

【概念】闭包就是引用了其他函数作用域中变量的函数,这种模式通常在函数嵌套结构中实现。里面的函数可以访问外面函数的变量,外面的变量的是这个内部函数的一部分。

【作用】1.加强封装,模拟实现私有变量。2实现常驻内存的变量。

【缺点】闭包不能滥用,否则会导致内存泄露,影响网页的性能。闭包使用完了后,要立即释放资源,将引用变量指向null

【应用场景】1.函数作为参数传递;2.函数作为返回值。

js 复制代码
/**
  *JavaScript中的函数会形成了闭包。
*闭包是由函数以及声明该函数的词法环境组合而成的。该环境包含了这个闭包创建时作用域内的任何局部变量。
**/

function foo(){
  var num = 1
  function compute(){
    num++
    return num
  }
  return compute
}

var fn = foo()
fn()

// num 变量和 compute 函数就组成了一个闭包

5.浅拷贝与深拷贝

浅拷贝

【概念】浅拷贝只复制指向某个对象的指针,而不复制对象本身,新旧对象还是共享一块内存。修改时原对象也会受到影响。 【实现方法】

  • 利用"="赋值操作符实现浅拷贝;
  • 数组的浅拷贝一般使用slice、concat;
  • 数组的浅拷贝 - 遍历;
  • 对象的浅拷贝 - Object.assign();
  • 对象的浅拷贝 - 扩展运算符;

深拷贝

【概念】深拷贝就是在拷贝数据的时候,将数据的所有引用结构都拷贝一份。简单的说就是,在内存中存在两个数据结构完全相同又相互独立的数据,将引用型类型进行复制,而不是只复制其引用关系。修改时原对象不在受到任何影响。 【实现方法】

  • 利用JSON对象中的parse和Stringify。
js 复制代码
JSON.parse(JSON.stringify(obj))深拷贝弊端:
1.时间会变成字符串形式,而不是时间对象。
2.如果obj里面有function,undefined,则序列化的结果会把function,undefined丢失
3.如果obj里面有NaN,Infinity和-Infinity,则序列化的结果会变成null
4.JSON.stringify()只能序列化对象的可枚举的自有属性
5.如果obj里有RegExp、Error对象,则序列化的结果只能得到空对象
  • 利用递归来实现每一层都重新创建对象并赋值。

6.防抖与节流

防抖与节流函数时一种常用的高频触发优化方式,能对性能有较大的帮助。

防抖

【概念】将多次高频操作优化为只在最后一次执行,通常使用的场景时:用户输入,只需再输入完成后做一次输入校验即可。

js 复制代码
/**
 * 防抖 (debounce)将多次高频操作优化为只在最后一次执行
 * 
 * @param {Function} fn 需要防抖函数
 * @param {Number} wait  需要延迟的毫秒数
 * @param {Boolean} immediate 可选参,设为true,debounce会在wait时间间隔的开始时立即调用这个函数
 * @return {Function}
 * 
 */
 const debounce= (fn, wait, immediate) =>{
    let timer = null

    return function() {
        let args = arguments
        let context = this

        if (immediate && !timer) {
            fn.apply(context, args)
        }

        if (timer) clearTimeout(timer)
        timer = setTimeout(() => {
            fn.apply(context, args)
        }, wait)
    }
}

节流

【概念】每隔一段时间后执行一次,也就是降低频率,将高频操作优化成低频操作,通常使用场景:滚动条事件或者resize事件,通常每隔100-500ms执行一次即可。

js 复制代码
/**
 * 节流(throttle)将高频操作优化成低频操作,每隔 100~500 ms执行一次即可
 * 
 * @param {Function} fn 需要防抖函数
 * @param {Number} wait  需要延迟的毫秒数
 * @param {Boolean} immediate 可选参立即执行,设为true,debounce会在wait时间间隔的开始时立即调用这个函数
 * @return {Function}
 * 
 */
 const throttle =(fn, wait, immediate) =>{
    let timer = null
    let callNow = immediate
    
    return function() {
        let context = this,
            args = arguments

        if (callNow) {
            fn.apply(context, args)
            callNow = false
        }

        if (!timer) {
            timer = setTimeout(() => {
                fn.apply(context, args)
                timer = null
            }, wait)
        }
    }
}

7.Array常见操作方法

diff 复制代码
- map:遍历数组,返回回调返回值组成的新数组;
- forEach:无法break,可以用try/catch中throw new Error来停止;
- filter:过滤
- some:有一项返回true,则整体为true;
- every:有一项返回false,则整体为false;
- join:通过制定链接符生成字符串;
- push/pop:未尾推入和弹出,改变原数组,返回推入/弹出项;
- unshift/shift:头部推入和弹出,改变原数组,返回操作项;
- sort(fn)/reverse:排序与反转,改变原数组;
- concat:连接数组,不影响原数组,浅拷贝;
- slice(start,end):返回截断后的新数组,不改变原数组;
- splice(start,number,value...): 返回删除原数组的数组,Value为插入项,改变原数组;
- indexOf/lastIndexOf(value,fromIndex):查找数组项,返回对应的小标;
- reduce / reduceRight(fn(prev, cur), defaultPrev): 两两执行,prev 为上次化简函数的return值,cur 为当前值(从第二项开始)
- flat: 数组拆解, flat: [1,[2,3]] --> [1, 2, 3]

8.Object常见操作方法

vbnet 复制代码
- Object.key(obj): 获取对象的可遍历属性(键);
- Object.values(obj):获取对象的可遍历属性(值);
- Object.entries(obj):获取对象可遍历键值对;
- Object.assign(targetObject,...object):合并对象可遍历属性;
- Object.is(value1,value2):判断两个值是否是相同的值;

9.浏览器存储Cookie、 LocalStorage 与 SessionStorage

复制代码
一般由服务器生成,可设置失效时间。如果在浏览器端生成Cookie,默认是关闭浏览器后失效
大小限制为4KB左右
每次都会携带在HTTP头中,如果使用cookie保存过多数据会带来性能问题
需要程序员自己封装,源生的Cookie接口不友好

LocalStorage

javascript 复制代码
除非被清除,否则永久保存
一般为5MB
仅在客户端(即浏览器)中保存,不参与和服务器的通信
原生接口可以接受,亦可再次封装来对Object和Array有更好的支持

SessionStorage

javascript 复制代码
仅在当前会话下有效,关闭页面或浏览器后被清除
一般为5MB
仅在客户端(即浏览器)中保存,不参与和服务器的通信
原生接口可以接受,亦可再次封装来对Object和Array有更好的支持
相关推荐
天平6 分钟前
react native现代化组件库的推荐 【持续更新...】
android·前端·react native
潜行的鱼30 分钟前
iframe 的同源限制与反爬机制的冲突
前端
静Yu32 分钟前
蚂蚁百宝箱|快速搭建会讲故事、读新闻的智能体
前端·agent
Mintopia1 小时前
像素的进化史诗:计算机图形学与屏幕的千年之恋
前端·javascript·计算机图形学
Mintopia1 小时前
Three.js 中三角形到四边形的顶点变换:一场几何的华丽变身
前端·javascript·three.js
归于尽1 小时前
async/await 从入门到精通,解锁异步编程的优雅密码
前端·javascript
陈随易1 小时前
Kimi k2不行?一个小技巧,大幅提高一次成型的概率
前端·后端·程序员
猩猩程序员2 小时前
Rust 动态类型与类型反射详解
前端
杨进军2 小时前
React 实现节点删除
前端·react.js·前端框架