前端面试之javascript篇

  • 深拷贝和浅拷贝
    浅拷贝是拷贝了对象的引用,当原对象发生变化的时候,拷贝对象也跟着变化;深拷贝是另外申请了一块内存,内容和原对象一样,更改原对象,拷贝对象不会发生变化;
    深层次理解:浅拷贝是拷贝一层,深层次的对象级别的就拷贝引用;深拷贝是拷贝多层,每一级别的数据都会拷贝出来
    深拷贝实现方法:
    递归和序列化反序列化
    浅拷贝:
    object.assign()
    扩展运算符
    遍历

  • webpack
    侧重打包,性能优化,压缩从四,js

  • 数组排序:原生sort,冒泡排序(比较相邻的两个数),快速排序(递归,左右快速的排序), 还有插入排序,选择排序

  • 数据结构
    栈(先进后出)队列(先进先出)链表,set集合

  • js拖拽功能的实现

  • js节流和防抖
    防抖是输入框,滚动,太频繁容易使页面卡顿,掉帧。然后采用合并请求,n秒内执行一次。

节流是n秒内至少执行一次。

  • 手动实现promise

  • Commonjs,Amd,cmd模块化
    commonjs是用在服务器端的,同步的,如nodejs
    amd, cmd是用在浏览器端的,异步的,如requirejs和seajs
    其中,amd先提出,cmd是根据commonjs和amd基础上提出的

  • Once函数

  • Promise封装ajax

  • Js监听对象属性的改变

  • 自己实现一个bind函数,apply函数

  • 数组去重(最起码说三种)

1.indexof 遍历,元素在数组中出现的位置push到数组中
2.Array.from(newSet(arr))
3.对象建值对去重

  • sleep函数

  • 怎么用set timeout 实现set intervals
    Settimeout(function(){
    settimeout(arguments.callee,200)},200)

  • 递归 自己调用自己
    function getSum(x) {
    if (x==1){
    return 1
    }
    return x+getSum(x-1);
    };

    var sum=getSum(5);
    console.log(sum);
    console.log(getSum(10));

  • js主线程,异步队列
    macro-task队列真实包含任务:
    script(主程序代码),setTimeout, setInterval, setImmediate, I/O, UI rendering
    micro-task队列真实包含任务:
    process.nextTick, Promises, Object.observe, MutationObserver
    由此我们得到的执行顺序应该为:
    script(主程序代码)—>process.nextTick—>Promises…——>setTimeout——>setInterval——>setImmediate——> I/O——>UI rendering
    在ES6中macro-task队列又称为ScriptJobs,而micro-task又称PromiseJobs
    微任务优先级高于宏任务
    setImmediate(function(){
    console.log(1);
    },0);
    setTimeout(function(){
    console.log(2);
    },0);
    new Promise(function(resolve){
    console.log(3);
    resolve();
    console.log(4);
    }).then(function(){
    console.log(5);
    });
    console.log(6);
    process.nextTick(function(){
    console.log(7);
    });
    console.log(8);

  • 第一个过程过后,已经输出了3 4 6 8
  • 第二步. 由于其他micro-task 的 优先级高于macro-task。
  • 此时micro-task 中有两个任务按照优先级process.nextTick 高于 Promise,所以先输出7,再输出5
  • 第三步,micro-task 任务列表已经执行完毕,家下来执行macro-task. 由于setTimeout的优先级高于setIImmediate,所以先输出2,再输出1。
  • 闭包的应用
    1.匿名自执行函数
    2.缓存结果(不太会用)
    3.封装
    4.类和继承

一个是前面提到的可以读取函数内部的变量,另一个就是让这些变量的值
闭包:即重用一个变量,又保护变量不被污染的一种机制。
为什么使用闭包 : 全局变量和局部变量都具有不可兼得的优缺点。
   全局变量:  优: 可重用, 缺: 易被污染。
   局部变量:  优: 仅函数内可用,不会被污染。
          缺: 不可重用!
 
何时使用: 只要即重用一个变量,又保护变量不被污染时。
 如何: 3步:
   1. 用外层函数包裹要保护的变量和内层函数。
   2. 外层函数将内层函数返回到外部。
   3. 调用外层函数,获得内层函数的对象,保存在外部的变量中——形成了闭包。  
 
闭包形成的原因: 外层函数调用后,外层函数的函数作用域(AO)对象无法释放,被内层函数引用着。
 
闭包的缺点:
   比普通函数占用更多的内存。
   解决:闭包不在使用时,要及时释放。
   将引用内层函数对象的变量赋值为null。

  • 去除字符串首尾空格
    1.正则
    function str(arr){
    if (arr && typeof arr === “string”){
    return arr.replace(/(^\s+)|(\s+)$/g,"")
    }
    }
    let trim=str(" hkjfgh jfh ")
    console.log(trim);
    2.trim

let arr=" jkhjgjhg jhdgjhd "
let str=arr.trim() //首尾

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值