js面试题总结

135 阅读3分钟

一,数据类型

  • 原始值类型「值类型/基本数据类型」

    • number 数字
    • string 字符串
    • boolean 布尔
    • null 空对象指针
    • undefined 未定义
    • symbol 唯一值
    • bigint 大数
  • Symbol 创建一个唯一值

    • 1,给对象设置“唯一值”的属性名
    • 2, 字符串
    • 3,Symbol类型
    • 4,Map新的数据结构:可以允许属性名是对象
  • BigInt 大数类型 Number.MAX_SAFE_INTEGER 9007199254740991 JS中的最大安全数 Number.MIN_SAFE_INTEGER -9007199254740991 最小安全数 超过安全数后,进行运算或者访问,结果会不准确!!!

解决方案:

  1. 服务器返回给客户端的大数,按照“字符串”格式返回!
  2. 客户端把其变为 BigInt ,然后按照BigInt进行运算
  3. 最后把运算后的BigInt转换为字符串,在传递给服务器即可

console.log((90071992547409912446579n).toString());
     Symbol.asyncIterator/iterator/hasInstance/toPrimitive/toStringTag...是某些JS知识底层实现的机制
  • 在派发行为标识统一进行管理的时候,可以基于symbol类型的值,保证行为标识的唯一性
  • 对象类型「引用数据类型」

    • 标准普通对象 object
    • 标准特殊对象 Array、RegExp、Date、Math、Error……
    • 非标准特殊对象 Number、String、Boolean……
    • 可调用/执行对象「函数」function
typeof检测数据类型

所有的数据类型值,在计算机底层都是按照“64位”的二进制值进行存储的!

  • typeof 是按照二进制进行检测类型的 二进制的前三位是0,认为是对象,然后再去看有没有实现call方法,如果实现了,返回‘function’,没有实现,则返回‘object’
    • 000 对象
    • 1 整数
    • 010 浮点数
    • 100 字符串
    • 110 布尔
    • 000000…. null 64个0
    • -2^30 undefined
    • ……
  • 怎么解决精度问题?
    • 将数字转成整数(扩大系数)
    • 三方库:Math.js decimal.js big.js ...
  • 0.1+0.2为什么不等于0.3 js中有关于小数(浮点数)的计算会出现精准度丢失的问题
    • js中所有值在计算机中都是以2进制在计算机底层进行存储的(浮点数转为二进制,可能出现无限循环的情况)
    • 在计算机底层存储的时候,最多存储64位(舍弃了一些值,值本身就失去了精准度 )
  • 浮点数计算的解决方案:
    • tofixed保留小数点后面N位,他自己会四舍五入
    • 扩大系数法

12fec5fbddcc578e7cd1fc28f5c0ffa.png 全局上下文中 基于var function 声明的变量,并没有放在Vo(G)中直接存储到GO中,作为window的一个成员 基于let/const 声明的变量,存储在VO(G)中的 console.log(a) 先看VO(G),再看GO,如果GO中也没有,则报错 a is not defined console.log(window.a)直接去GO找,如果没有不会报错,值是undefined

  • 函数是一种特殊的对象(可执行对象):函数(普通函数、构造函数)、对象
  • 创建函数
    • 1,堆内存空间(16进制地址)
    • 2,存储信息,创建函数的时候,就声明了其作用域,在哪个上下文中创建的,其作用域就是谁(宿主环境)
    • 把函数体中的代码当做字符串存储起来
    • 看做普通对象,存储键值对,name函数名length形参个数 prototype 原型对象