模范爸爸|「干货满满」1.5w字初中级前端面试复习总结

前言金九银十 , 又是一波跑路 。 趁着有空把前端基础和面试相关的知识点都系统的学习一遍 , 参考一些权威的书籍和优秀的文章 , 最后加上自己的一些理解 , 总结出来这篇文章 。 适合复习和准备面试的同学 , 其中的知识点包括:

  • JavsScript
  • 设计模式
  • Vue
  • 模块化
  • 浏览器
  • HTTP
  • 前端安全
JavaScript数据类型String、Number、Boolean、Null、Undefined、Symbol、BigInt、Object
堆、栈两者都是存放数据的地方 。
栈(stack)是自动分配的内存空间 , 它存放基本类型的值和引用类型的内存地址 。
堆(heap)是动态分配的内存空间 , 它存放引用类型的值 。
JavaScript 不允许直接操作堆空间的对象 , 在操作对象时 , 实际操作是对象的引用 , 而存放在栈空间中的内存地址就起到指向的作用 , 通过内存地址找到堆空间中的对应引用类型的值 。
隐式类型转换JavaScript 作为一个弱类型语言 , 因使用灵活的原因 , 在一些场景中会对类型进行自动转换 。
常见隐式类型转换场景有3种:运算、取反、比较
运算运算的隐式类型转换会将运算的成员转换为 number 类型 。
基本类型转换:
true + false// 1null + 10// 10false + 20// 20undefined + 30 // NaN1 + '2'// "12"NaN + ''// "NaN"undefined + '' // "undefined"null + ''// "null"'' - 3// -3
  • null、false、'' 转换 number 类型都是 0
  • undefined 转换 number 类型是 NaN , 所以 undefined 和其他基本类型运算都会输出 NaN
  • 字符串在加法运算(其实是字符串拼接)中很强势 , 和任何类型相加都会输出字符串(symbol除外) , 即使是 NaN、undefined 。 其他运算则正常转为 number 进行运算 。
引用类型转换:
[1] + 10// "110"[] + 20// "20"[1,2] + 20// "1,220"[20] - 10// 10[1,2] - 10// NaN({}) + 10// "[object Object]10"({}) - 10// NaN
  • 引用类型运算时 , 会默认调用 toString 先转换为 string
  • 同上结论 , 除了加法都会输出字符串外 , 其他情况都是先转 string 再转 number
解析引用类型转换过程:
[1,2] + 20// 过程:[1,2].toString() // '1,2''1,2' + 20// '1,220'[20] - 10// 过程[20].toString()// '20'Number('20')// 2020 - 10// 10取反取反的隐式类型转换会将运算的成员转换为 boolean 类型 。
这个隐式类型转换比较简单 , 就是将值转为布尔值再取反:
![]// false!{}// false!false// true通常为了快速获得一个值的布尔值类型 , 可以取反两次:
!![]// true!!0// false比较比较分为 严格比较=== 和 非严格比较== , 由于 === 会比较类型 , 不会进行类型转换 。 这里只讨论 == 。
比较的隐式类型转换基本会将运算的成员转换为 number 类型 。
undefined == null// true'' == 0// truetrue == 1// true'1' == true// true[1] == '1'// true[1,2] == '1,2'// true({}) == '[object Object]' // true
  • undefined 等于 null
  • 字符串、布尔值、null比较时 , 都会转 number
  • 引用类型在隐式转换时会先转成 string 比较 , 如果不相等然再转成 number 比较
预编译预编译发生在 JavaScript 代码执行前 , 对代码进行语法分析和代码生成 , 初始化的创建并存储变量 , 为执行代码做好准备 。
预编译过程:
  1. 创建GO/AO对象(GO是全局对象 , AO是活动对象)
  2. 将形参和变量声明赋值为 undefined
  3. 实参形参相统一
  4. 函数声明提升(将变量赋值为函数体)


    推荐阅读