JavaScript面试题

发布时间 2023-12-01 12:26:09作者: 冉姑娘
  1. 列举常用的字符串方法
    1. indexOf(要查找的字符,开始索引) 查找某个字符串第一次出现的位置
      lastIndexOf(要查找的字符,开始索引) 查找某个子字符串最后一次出现的位置
      replace(被替换的内容,要替换的内容)  替换好的字符串
      substr(从哪个索引开始,截取多少个) 返回截取到的内容
      substring(从哪个索引开始,到哪个索引截止),包含开始索引,不包含结束索引;返回截取到的内容
      slice(起始索引,结束索引)  截取出来的字符串
      split(指定的切割符)  一个用指定切割符切割好的数组
      toLowerCase() 转成 小写字母
      toUpperCase() 转成 大写字母
      charAt() 是找到字符串中指定索引位置的内容返回
      trim() 去除空白内容以后的字符串

       

  2. 列举常用的数组方法
    1. join():用指定的分隔符将数组每一项拼接为字符串
      push() :向数组的末尾添加新元素
      pop():删除数组的最后一项
      shift():删除数组的第一项
      unshift():向数组首位添加新元素
      slice():按照条件查找出其中的部分元素
      splice():对数组进行增删改
      fill(): 方法能使用特定值填充数组中的一个或多个元素
      concat():用于连接两个或多个数组
      indexOf():检测当前值在数组中第一次出现的位置索引
      lastIndexOf():检测当前值在数组中最后一次出现的位置索引
      includes():判断一个数组是否包含一个指定的值
      sort():对数组的元素进行排序
      reverse():对数组进行倒序
      find():返回匹配的值
      findIndex():返回匹配位置的索引
      toLocaleString()、toString():将数组转换为字符串
      
      ES5新增的数组方法
      forEach():ES5 及以下循环遍历数组每一项,没有return返回值
      map():ES6 循环遍历数组每一项
      filter():“过滤”功能
      reduce() 汇总功能
      every():判断数组中每一项都是否满足条件
      some():判断数组中是否存在满足条件的项
      entries() 、keys() 、values():遍历数组
      

       

  3. js的数据类型有哪些
    1. js有7中数据类型
      基础数据类型:
          1、String类型,用于表示字符串;
          2、Number类型,用于表示数字;
          3、Boolean类型;
          4、Undefined类型;
          5、Null类型;
      引用数据类型:
          1、Array数组;
          2、Object类型。
      

        

  4. 什么是作用域链
  5. 什么是事件委托,应用场景,优缺点
  6. 什么是深拷贝?什么是浅拷贝?如何实现深拷贝?
  7. 数组冒泡排序的原理
  8. 数组排序的方法
  9. 谈谈你对this的理解
  10. get请求和post请求的区别
  11. DOM常见的操作及API
  12.  let、const、var的区别 
  13.  从输入url到浏览器显示页面发生了什么
  14.  如何实现前端性能优化
  15. 什么是事件流,解决事件冒泡
  16. 什么是原型对象
    1. 所有的构造函数在初始化时,都会自动生成一个特殊的实例话对象,构造函数的prototype属性指向该对象,该对象称为原型对象,或prototype对象
      

       

  17.  什么是原型链
    1. 原型链:由一系列__proto__属性,串联起来的原型对象,称为原型链
      原型链的意义:实例化对象在访问属性和方法时,会先访问自身的属性和方法,如果自身不存在对应的属性和方法,则会自动通过__proto__属性在整个原型链上查找,只要找到对应的属性和方法,就能正确执行,如果原型链上没找到,则报错
      

        

  18. 前端性能优化可以从哪些方面?
    1. 1..loading
      2.骨架屏
      3.压缩 HTML 
      4.删除不必要的注释
      5.删除不必要的属性
      6.使用语义化标签
      7.减少iframe数量
      8.削减DOM数量和层级数量
      9.减少 HTTP 请求次数
      10.减少重排重绘
      11.javascript脚本放到页面底部
      12.将javascript和css从外部引入
      13.减少DOM操作
      14.节流与防抖
      15.合理的ajax恳求
      16.尽量少用@import
      17.避免!important,可以选择其他选择器
      18.CSS文件压缩
      19.CSS层级嵌套最好不要超过3层
      20.删除无用的css
      21.慎用*通配符
      22.小图片引入雪碧图。
      23.图片压缩
      24.图片懒加载
      25.采用svg图片或者字体图标
      26.Base64
      27.缓存加载器
      28.Hot update 热更新
      29.DNS预解析
      参考连接:https://blog.csdn.net/chaoPerson/article/details/130743570
      

        

  19. new一个实例化对象的四个阶段
    1. 1. 创建一个空的实例化对象
      2. 让构造函数中的this指向空的实例化对象
      3. 执行(调用)构造函数,从而创建实例化对象自身的属性和方法
      4. 返回实例化对象
      

        

  20. 什么是回流和重绘
    1. 回流指的是元素的尺寸,布局,位置发生变化,导致页面的布局需要重新计算
      重绘指的是元素的外观发生变化,但尺寸和布局不变,只需要重新绘制元素.
      回流必将引起重绘,而重绘不一定会引起回流。
      

        

  21. 常见HTTP状态码的含义
  22. 什么是防抖和节流,描述防抖的原理和节流的原理
    1. 本质上是优化高频率执行代码的一种手段;
      为了优化体验,需要对resize、scroll、keypress、mousemove 等事件进行调用次数的限制,对此我们就可以采用 防抖(debounce) 和 节流(throttle) 的方式来减少调用频率
      防抖: n 秒内只运行一次,若在 n 秒内重复触发,只有一次生效
      节流: n 秒后在执行该事件,若在 n 秒内被重复触发,则重新计时
      

        

  23. 什么是事件循环
  24. call、apply、bind的区别
  25. 什么是闭包,闭包的优缺点
  26. 简述js的垃圾回收机制
  27. 什么是内存泄露

 

 

 

9. 说一下promise

10. 说一个async await

11. promise.all 和 promise.race 的用法和区别

18. 三种本地存储的区别

19. ES6新特性

22. 说说最近最流行的一些东西吧?常去哪些网站?

23. 列举10条移动端兼容性问题

34.大文件的分割处理(大文件切片上传,断点续传)

35.如何将最终的金额,专为","逗号分隔的形式

复制代码
function numberFormate(num) { // 数字格式化为x,xxx,xxx,xxx
    // 1. 将num专为数字类型
    num = parseFloat(num);
    // 2. 判断是否是一个数字
    if (!Number.isNaN(num)) {
        // 3. 将数字按照.进行分割(主要是针对浮点数)
        let str = Math.abs(num).toString().split('.');
        // 4. 整数部分按照3个一组,看可以分为几组
        const a = Math.ceil(str[0].length / 3);
        // 5. 不够3个一组的,自动补充0
        str[0] = str[0].padStart(a * 3, '0');
        const numArr = [];
        // 6. 将数字按照3个一组进行截取
        for (let i = 0; i < a; i++) {
            numArr.push(str[0].substring(i * 3, (i + 1) * 3));
        }
        // console.log(numArr);
        // 7. 将数组中的第一个值中前面补充的0去除
        numArr[0] = parseInt(numArr[0]);
        // 8. 将数组中的数字按照逗号进行拼接,并且拼接上小数点后面的值
        const formateStr = numArr.join(',') + (str[1] ? '.' + str[1] : '');
        // 9. 判断初始值是正值还是负值,需不需要添加-
        return num < 0 ? "-" + formateStr : formateStr;
    } else {
        throw new TypeError("传入的参数必须是数字");
    }
}
console.log(numberFormate(1123456789.2234)); // 结果为1,123,456,789.2234
复制代码

 

 

34.前端常用的几种加密方法

35.前端常见的攻击手段及防御方法

36. 用类的方式编写一个b继承a的方法,描述代码实现流程

37. 了解Node么? Node的使用场景都有哪些?

38. 对于前端自动化构建工具有了解吗,简单介绍下

39. js的typeof返回哪些数据类型