美文网首页
javascript你必须知道的常见面试题(上)

javascript你必须知道的常见面试题(上)

作者: 小薇同学v | 来源:发表于2024-01-11 15:29 被阅读0次

1.什么是闭包?举例说明。它有哪些优缺点?有什么使用场景?

闭包是有权访问另一个函数内的变量的函数

function A(){
   let a=10;
   window.B=function(){
      console.log(a);
   }
}
B();//10

函数B就是闭包。
优点:创建私有变量避免全局变量的污染;让这些变量的值始终保持在内存中。
缺点:滥用闭包会导致大量变量不会被垃圾回收机制回收,内存消耗很大,会造成网页卡顿等性能问题;内存泄漏。
使用场景:

  • 创建私有变量,防止全局作用域中的变量被意外修改。
  • 用于创建模块,将一组相关的函数和变量组织在一起,避免污染全局命名空间。
  • 用于创建工厂模式。用户维护函数执行的上下文。
  • 用于在定时器和异步操作中保存变量的状态。

2.什么是回调函数?举例说明。有哪些使用场景?

作为参数传递给另一个函数的函数,并在被调用函数执行完毕后被调用。
使用场景:

  • 事件处理:鼠标点击,键盘输入。
  • 异步操作:读取文件,下载文件。
  • 数据处理:对数组排序,过滤。
  • 插件开发。

3.什么是原型?什么是原型链?

原型:在js中,每个函数都有一个prototype属性,它会指向一个对象,这个对象就是原型。
原型链:在访问对象的属性或方法时,首先会从自身找,找不到就会往原型上去找,若原型上找不到,则会往原型外的原型上去找,形成了链式结构,叫做原型链。

4.什么是事件循环(event loop)?

事件循环是一种机制,用于处理异步任务和事件处理程序。

5.什么是模块?什么是模块导出?

模块:将代码分离到多个文件中,一个文件就是一个模块。指令:import和export
模块导出:通过export关键字向外导出想要导出的对象。将js文件中的变量,常量,函数,对象等向外导出以方便外部的js文件引用和调用。

6.什么是箭头函数?它有什么特点?有哪些使用场景?

箭头函数是es6新增的函数表达式。通过=>来定义函数。
特点:

  • 语法简洁;
  • 隐式返回;
  • 当箭头函数只有一个参数,可以省略括号;
  • 没有自己的this,会继承父级作用域的this值,this指向的是定义该函数的上下文。

使用场景:

  • 回调函数;
  • 不需要自己的this:定时器,事件监听器。

7.什么是变量提升(Hoisting)?为什么要变量提升?

将变量/函数的声明部分提升到所有代码的最前面。变量被提升后,会被设置默认值undefined。
理由:提高性能;容错性更好,使一些不规范的代码正常执行。

8.什么是 promise?有哪些状态?

promise是es6新增的一种用于处理异步操作的机制,用于解决回调地狱问题。
三个状态:pending(进行中);fulfilled(已完成);rejected(已失败)

9.什么是async/await?

async/await是es7新特性,用于处理异步操作,让我们可以用一种更简洁的方式写出基于promise的异步行为。
async返回一个promise对象,使用await会阻塞后续代码执行。

10.什么是map和set?它们有什么不同?

map和set都是数据结构,主要应用于数据重组数据储存
set集合是es6新特性,是以[value,value]的形式存储元素。
map字典是以[key,value]的形式存储。

11.什么是生成器(generator)?

生成器是es6新的数据类型,看着像函数,但是可以返回多次。

function *name(){
   Yield 'hello';
}

可以随时暂停,可以在任意时候恢复。

const gen=name();
gen.next();

12.什么是继承?如何实现继承?

继承就是指一个子类继承父类的属性和方法,使得子类对象具有父类的属性和方法。
实现继承:原型链继承;构造函数继承;组合式继承;原型式继承;寄生式继承;寄生组合式继承;es6的class继承。

13.什么是垃圾回收机制?

程序运行会产生垃圾,垃圾回收是一种内存管理机制,如果不及时回收,会导致内存泄漏。

14.什么是严格模式?如何开启严格模式?

严格模式使js在更为严格的条件下运行。use strict。

  • 消除js语法的不合理,不严谨之处,减少怪异行为;
  • 消除代码的不安全之处,保证代码运行的安全;
  • 提高编译器效率,增加运行速度。

15.什么是事件委托(事件代理)?为什么要使用它?有哪些使用场景?

事件委托将事件处理程序绑定给父元素,当子元素触发某个事件时,该事件被传递给父元素,父元素再根据触发事件的具体子元素执行相应的操作。
原理:事件冒泡
优点:提高程序的性能
使用场景:列表/表格的事件处理;动态元素的事件处理;性能优化。

16.什么是事件冒泡和事件捕获?如何阻止事件冒泡?

事件冒泡和事件捕获是事件传播的两种方式。
事件冒泡:从触发事件的目标元素开始,逐级向上冒泡直到根元素。element.addEventListener(eventType,handler,false)
阻止事件冒泡:stopPropagetion()
事件捕获:从最外层元素逐级向下传播直到触发事件的目标元素。
element.addEventListener(eventType,handler,true)

17.函数声明和函数表达式有什么区别?

函数声明:function name(){};执行代码之前,js引擎会将函数声明提升到当前作用域的顶部;具有一个函数名;只能在顶层代码或函数体内部进行声明,不能在条件语句,循环语句中进行声明。
函数表达式:const FunName=function(){};不会被提升;可以是匿名函数;可以在任何允许表达式的地方进行声明。

18.如何创建对象?有几种方式?

  • 构造函数模式
  • 原型模式
  • 组合模式
  • 工厂模式
  • 字面式创建对象
  • new操作符+object创建对象

19.什么是防抖和节流?它们有什么应用场景?

防抖:在一定时间内多次触发,只执行最后一次。
应用场景:搜索框搜索输入,搜索联想;手机号,邮箱验证输入监测。
节流:在一定的时间间隔内,只执行一次。
应用场景:懒加载,滚动加载;表单提交。

20.什么是函数作用域和块级作用域?

函数作用域:在函数内部定义的变量和函数只能在函数内部被访问。
块级作用域:在代码块内定义的变量和函数只能在该代码块内被访问。

21.什么是跨域?如何解决跨域问题?什么是CORS?什么是JSONP?

跨域问题本质就是浏览器的同源策略造成的。
同源策略:协议,域名,端口三者必须一致。
解决方法:

  • jsonp(仅限get请求)
  • cors(简单请求和复杂请求)
  • 代理(在服务器端设置代理)
  • websocket
  • 跨文档消息通信

CORS:
CORS通过在服务器端设置一些HTTP头来允许在一个域上的Web应用程序从另一个域请求资源。这些头信息包括Access-Control-Allow-Origin、Access-Control-Allow-Methods、Access-Control-Allow-Headers等。
JSONP:
JSONP的基本原理是利用<script>标签的跨域特性,通过在请求的URL中添加一个回调函数的名称,服务器将返回的数据包裹在这个回调函数中,从而实现数据传递。

22.什么是回调地狱(Callback Hell)?如何解决回调地狱?

在异步编程中,层层嵌套的回调函数导致代码结构深度增加,难以理解和维护。
解决方法:

  • promise
  • async/await

23.什么是深拷贝和浅拷贝?如何实现深拷贝和浅拷贝?

深拷贝和浅拷贝都是复制数据结构的两种方式。
浅拷贝:只复制数组或对象的第一层,不会复制嵌套的数组或对象。浅拷贝后的新对象和原对象共享内部的引用类型数据,修改其中一个对象的引用类型数据会影响另一个。
深拷贝:会递归复制数组或对象的所有层级,包括嵌套的对象或数组。
不共享内部的引用类型数据,修改其中一个对象的引用类型数据不会影响另一个。
实现浅拷贝:

  • 使用对象展开运算符const shallowCopy={...originalobject}
  • 使用Object.assign const shallowCopy=Object.assign({},originalobject)
  • Array.from(仅适用于数组)
  • Array.slice(仅适用于数组)
  • 使用扩展运算符实现数组的浅拷贝 const shallowCopy=[...originalobject]

实现深拷贝:

  • 使用JSON.parse和JSON.stringify
  • 使用递归实现

24.什么是模板字符串?如何使用?

模版字符串是es6新引入的一种字符串的表示方式。使用反引号包裹字符串,可以包含变量,表达式和换行符,${name},提供了更直观、更灵活的字符串拼接方式。

25.什么是解构赋值?如何使用?

解构赋值是es6引入的一种语法,用于从数组或对象中提取值,并赋予给对应的变量。
数组解构赋值:

const numbers=[1,2,3];
const [a,b,c]=numbers;
console.log(a);//1

对象解构赋值:

const person={name:"bob",age:23}
const name=person;
console.log(name);//bob

相关文章

网友评论

      本文标题:javascript你必须知道的常见面试题(上)

      本文链接:https://www.haomeiwen.com/subject/ijptodtx.html