IDC

字节跳动最爱考的前端面试题:JavaScript 基础

作者:admin 2021-06-15 我要评论

注意:每道题前面出现的 (xx) 数字代表这道题出现的频次,此 JS 基础是基于 30+ 篇前端面经整理出的问题和对应的回答、参考链接等。 (2)问:0.1 + 0.2 === 0.3 ...

在说正事之前,我要推荐一个福利:你还在原价购买阿里云、腾讯云、华为云服务器吗?那太亏啦!来这里,新购、升级、续费都打折,能够为您省60%的钱呢!2核4G企业级云服务器低至69元/年,点击进去看看吧>>>)

注意:每道题前面出现的 (xx) 数字代表这道题出现的频次,此 JS 基础是基于 30+ 篇前端面经整理出的问题和对应的回答、参考链接等。

(2)问:0.1 + 0.2 === 0.3 嘛?为什么?

JavaScirpt 使用 Number 类型来表示数字(整数或浮点数),遵循 IEEE 754 标准,通过 64 位来表示一个数字(1 + 11 + 52)

  • 1 符号位,0 表示正数,1 表示负数 s
  • 11 指数位(e)
  • 52 尾数,小数部分(即有效数字)

最大安全数字:Number.MAX_SAFE_INTEGER = Math.pow(2, 53) - 1,转换成整数就是 16 位,所以 0.1 === 0.1,是因为通过 toPrecision(16) 去有效位之后,两者是相等的。

在两数相加时,会先转换成二进制,0.1 和 0.2 转换成二进制的时候尾数会发生无限循环,然后进行对阶运算,JS 引擎对二进制进行截断,所以造成精度丢失。

所以总结:精度丢失可能出现在进制转换和对阶运算中

参考链接

https://juejin.im/post/5b90e00e6fb9a05cf9080dff

(4)问:JS 数据类型

基本类型:Number、Boolean、String、null、undefined、symbol(ES6 新增的),BigInt(ES2020) 引用类型:Object,对象子类型(Array,Function)

参考链接

  • https://juejin.im/post/5b2b0a6051882574de4f3d96
  • https://developer.mozilla.org/zh-CN/docs/Web/JavaScript/Data_structures

问:JS 整数是怎么表示的?

通过 Number 类型来表示,遵循 IEEE754 标准,通过 64 位来表示一个数字,(1 + 11 + 52),最大安全数字是 Math.pow(2, 53) - 1,对于 16 位十进制。(符号位 + 指数位 + 小数部分有效位)

问:Number() 的存储空间是多大?如果后台发送了一个超过最大自己的数字怎么办

Math.pow(2, 53) ,53 为有效数字,会发生截断,等于 JS 能支持的最大数字。

(4)写代码:实现函数能够深度克隆基本类型

浅克隆:

  1. function shallowClone(obj) { 
  2.   let cloneObj = {}; 
  3.    
  4.   for (let i in obj) { 
  5.     cloneObj[i] = obj[i]; 
  6.   } 
  7.    
  8.   return cloneObj; 

深克隆:

  • 考虑基础类型
  • 引用类型

RegExp、Date、函数 不是 JSON 安全的

会丢失 constructor,所有的构造函数都指向 Object

破解循环引用

  1. function deepCopy(obj) { 
  2.   if (typeof obj === 'object') { 
  3.     var result = obj.constructor === Array ? [] : {}; 
  4.      
  5.     for (var i in obj) { 
  6.       result[i] = typeof obj[i] === 'object' ? deepCopy(obj[i]) : obj[i]; 
  7.     } 
  8.   } else { 
  9.     var result = obj; 
  10.   } 
  11.    
  12.   return result; 

问:事件流

事件流是网页元素接收事件的顺序,"DOM2级事件"规定的事件流包括三个阶段:事件捕获阶段、处于目标阶段、事件冒泡阶段。首先发生的事件捕获,为截获事件提供机会。然后是实际的目标接受事件。最后一个阶段是时间冒泡阶段,可以在这个阶段对事件做出响应。虽然捕获阶段在规范中规定不允许响应事件,但是实际上还是会执行,所以有两次机会获取到目标对象。

  1. <!DOCTYPE html> 
  2. <html lang="en"
  3. <head> 
  4.     <meta charset="UTF-8"
  5.     <title>事件冒泡</title> 
  6. </head> 
  7. <body> 
  8.     <div> 
  9.         <p id="parEle">我是父元素    <span id="sonEle">我是子元素</span></p> 
  10.     </div> 
  11. </body> 
  12. </html> 
  13. <script type="text/javascript"
  14. var sonEle = document.getElementById('sonEle'); 
  15. var parEle = document.getElementById('parEle'); 
  16.  
  17. parEle.addEventListener('click'function () { 
  18.     alert('父级 冒泡'); 
  19. }, false); 
  20. parEle.addEventListener('click'function () { 
  21.     alert('父级 捕获'); 
  22. }, true); 
  23.  
  24. sonEle.addEventListener('click'function () { 
  25.     alert('子级冒泡'); 
  26. }, false); 
  27. sonEle.addEventListener('click'function () { 
  28.     alert('子级捕获'); 
  29. }, true); 
  30.  
  31. </script> 

本文转载自网络,原文链接:https://mp.weixin.qq.com/s/tQVVS8B-xwp8G-vp0lndWw

版权声明:本文转载自网络,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。本站转载出于传播更多优秀技术知识之目的,如有侵权请联系QQ/微信:153890879删除

相关文章
  • 【活动回顾】Edge X Kubernetes,探索

    【活动回顾】Edge X Kubernetes,探索

  • 云端赛车-Amazon DeepRacer 的前世今生

    云端赛车-Amazon DeepRacer 的前世今生

  • 云原生时代,企业多活容灾体系构建思路

    云原生时代,企业多活容灾体系构建思路

  • 如何帮用户管好云账本?阿里云数据库助

    如何帮用户管好云账本?阿里云数据库助