【JS】万字整理JavaScript相关基础技术面试题总结 - 前端面试必备 - 基础知识总结 - 秋招冲鸭

【JS】万字整理JavaScript相关基础技术面试题总结 - 前端面试必备 - 基础知识总结 - 秋招冲鸭_第1张图片

文章目录

    • 1. 变量声明与类型
      • 1.1 var let const 区别
      • 1.2 数据类型
      • 1.3 值类型与引用类型的区别
      • 1.4 typeof 能判断哪些类型
      • 1.5 判断数据类型的方式
      • 1.6 `===` 与 `==`
      • 1.7 truly变量与falsely变量
      • 1.8 强制类型转换和隐式类型转换
      • 1.9 语句与表达式
    • 2. 数组字符串相关
      • 2.1 手写深拷贝
      • 2.2 手写深度比较
      • 2.3 数组的API有哪些是纯函数
      • 2.4 `split()`和`join()`的区别
      • 2.5 数组`slice`与`splice`区别
      • 2.6 手写字符串 trim
    • 3. 函数相关
      • 3.1 函数声明与函数表达式
      • 3.2 什么是JSON
      • 3.3 将URL参数解析成JS对象
    • 4. 原型与原型链
      • 4.1 解释一下原型与原型链
      • 4.2 class的原型本质
      • 4.3 new Object() 与 Object.create()的区别
      • 4.4 用class语法写一个简单的jQuery
    • 5. 作用域与闭包
      • 5.1 作用域
      • 5.2 this不同场景下如何取值
      • 5.3 手写bind
      • 5.4 闭包
      • 5.5 闭包的应用场景
    • 6. ES6新特性
    • 7. 异步相关
      • 7.1 同步与异步的区别
      • 7.2 前端使用异步的场景
      • 7.3 Promise的三种状态
      • 7.4 promise的then和catch
      • 7.5 手写promise加载图片
      • 7.6 async/await与Promise
      • 7.7 字节面试看代码题
      • 7.8 for-of 的应用场景 【异步】
    • 8. Event Loop
      • 8.1 宏任务macroTask与微任务microTask
      • 8.2 Event Loop机制
      • 8.3 event loop练习
    • 9. DOM
      • 9.1 获取节点操作
      • 9.2 标签属性 attribute
      • 9.3 对象属性 property
      • 9.4 DOM结构操作
      • 9.5 优化DOM性能
        • 9.5.1 对DOM查询进行缓存
        • 9.5.2 将频繁操作改为一次性操作
    • 10. BOM
      • 10.1 检查浏览器类型
      • 10.2 拆解URL各个部分
    • 11. 事件
      • 11.1 事件绑定、冒泡、代理
      • 11.2 写一个通用的事件绑定函数
      • 11.3 描述事件冒泡过程
      • 11.4 无限下拉的图片列表,如何监听每个图片的点击
    • 12. AJAX
      • 12.1 手写一个简单的ajax
      • 12.2 跨域解决方案
    • 13. 浏览器存储
    • 14. 页面加载
      • 14.1 资源的形式
      • 14.2 从输入url到渲染出页面的整个过程
      • 14.3 window.onload与DOMContentLoaded的区别
      • 14.4 重绘与回流
    • 15. 性能优化
      • 15.1 前端常见性能优化方案
      • 15.2 缓存
      • 15.3 SSR服务渲染
      • 15.4 图片懒加载
      • 15.5 节流与防抖
    • 16. 前端安全
      • 16.1 XSS 跨站请求攻击
      • 16.2 XSRF 跨站请求伪造
    • 17. 算法刷题

之前也总结过一些前端面试题,推荐可以一起看看

【网络】计算机网络常见面试题 - 前端面试必备 - 吐血整理

【CSS】面试题总结 - 基础知识总结 - 复习专用 - 前端面试必备 - 吐血整理

【Vue】面试题总结 - 基础知识总结 - 复习专用 - 组件相关 - Vue家族 - 源码相关

这次是关于JavaScript的面试题有题目也有答案,想深入了解,可以看我之前的一些笔记博文(狠详细)。当然,每题有相关博文的我都会放链接~

持续更新中…

1. 变量声明与类型

1.1 var let const 区别

  1. var是ES5语法,let、const是ES6的语法
  2. var有变量提升
  3. var、let是变量,可修改;const是常量,不可修改
  4. let、const 块级作用域;var函数作用域

【JS】万字整理JavaScript相关基础技术面试题总结 - 前端面试必备 - 基础知识总结 - 秋招冲鸭_第2张图片
【ES6】变量声明-var-let-const-区别与联系-总结

1.2 数据类型

值类型(7个):Undefined、Null、Number、String、Boolean、Symbol(ES6)、BigInt(ES10)
引用类型:Object:Array、Function

【JS】JavaScript-ES5数据类型-基本数据类型-引用数据类型-类型之间的转换-数据类型的判断

1.3 值类型与引用类型的区别

值类型 存在内存中,变量拿到的就是它的值
引用类型 存在内存中,变量拿到的只是它的一个引用,是它的地址

【JS】JavaScript-对象-Object-内建对象-宿主对象-自定义对象-操作对象-基本数据类型与引用数据类型区别

1.4 typeof 能判断哪些类型

  1. undefined、string、number、boolean、symbol、bigint【除了null的基本类型】
  2. function 【函数】
  3. object (typeof null === ‘object’) 【所有引用类型只能到object这里】

1.5 判断数据类型的方式

  1. typeof 【除了null的基本类型 + function】
  2. instanceof 【引用类型】【从子类到父类直到object】【顺着原型链】
  3. toString() 【任意类型】
  4. Array.isArray() 【数组】

1.6 =====

=== 严格的比较是否相等

== 会进行类型转换,再进行比较

以下都是成立的

100 == '100'
0 == ''
0 == false
fase == ''
null == undefined

有一个情况可以用下 ==

if(a == null) {
   }
// 等价于
if(a === null || a === undefined)()

1.7 truly变量与falsely变量

truly变量:!!a === true 的变量
falsely变量:!!b === false 的变量

以下是falsey变量,除了这六种情况,其余都是truely变量

!!0 === false
!!NaN === false
!!'' === false
!!null === false
!!undefined === false
!!false === false

1.8 强制类型转换和隐式类型转换

强制:parseIntparseFloattoString
隐式:if、逻辑运算、==+拼接字符串

一定要看这个,狠详细
【JS】JavaScript-ES5数据类型-基本数据类型-引用数据类型-类型之间的转换-数据类型的判断

1.9 语句与表达式

表达式:一个表达式会产生一个值,可以放在任何一个需要值的地方

a
a+b
demo(1)
x===y? 'a': 'b'

语句

if(){
   }
for(){
   }

2. 数组字符串相关

2.1 手写深拷贝

function deepClone(obj){
   
	if (typeof obj !== 'object' || obj === null){
   
		return obj
	}
	let result = Array.isArray(obj) ? []: {
   }
	for (let key in obj) {
   
		if(obj.hasOwnProperty(key)) {
   
			result[key] = deepClone(obj[key])
		}
	}
	return result
}

【JS】自定义JS工具函数库-自定义对象方法-new-instanceof-mergeObject-实现数组与对象的深拷贝与浅拷贝-封装字符串相关函数

2.2 手写深度比较

// 判断是否是对象或数组
function isObject(obj) {
   
  return typeof obj === object && obj !== null;
}

// 深度比较
function isEqual(obj1, obj2) {
   
  if (!isObject(obj1) || !isObject(obj2)) {
   
    // 值类型,直接判断【一般不会传函数,不考虑函数】
    return obj1 === obj2;
  }
  if (obj1 === obj2) {
   
    return true;
  }
  // 两个都是对象或数组,而且不相等
  // 1. 先判断键的个数是否相等,不相等一定返回false
  const obj1Keys = Object.keys(obj1);
  const obj2Keys = Objext.keys(obj2);
  if (obj1Keys.length !== obj2Keys.length) {
   
    return false;
  }
  // 2. 以obj1为基准,和obj2依次递归比较
  for (let key in obj1) {
   
    // 递归比较
    const res = isEqual(obj1[key], obj2[key]);
    if (!res) {
   
      return false;
    }
  }
  // 3. 全相等
  return true;
}

2.3 数组的API有哪些是纯函数

纯函数:①不改变原数组(没有副作用) ②返回一个新数组
concat、map、filter、slice

非纯函数:push、pop、shift、unshift、forEach、some、every、reduce

【JS】你不得不知道的JavaScript数组相关知识【全面总结】复习专用

2.4 split()join()的区别

split() 是字符串的方法
join() 是数组的方法

'1-2-3'.split('-') // [1,2,3]
[1,2,3].join('-') // 1-2-3

2.5 数组slicesplice区别

slice 切片
splice 剪接

【JS】JavaScript数组-操作方法-concat-数组强制打平-slice-splice方法使用

2.6 手写字符串 trim

String.prototype.trim = function() {
   
	return this.replace(/^\s+/, '').replace(/\s+$/, '')
}

3. 函数相关

3.1 函数声明与函数表达式

函数声明式

function fn(a, b) {
   
  return a + b;
}

函数表达式

let fun = function(a, b){
   
  return a + b;
}

3.2 什么是JSON

  • JSON是一种数据格式,本质是一段字符串
  • JSON格式与JS对象结构一致,对JS语言更友好
  • window.JSON是一个全局对象,常用的两个方法 JSON.stringifyJSON.parse

3.3 将URL参数解析成JS对象

传统方法,分析search

function queryToObj() {
   
	const res = {
   

你可能感兴趣的:(JavaScript,面试,javascript,面试)