企业🤖AI智能体构建引擎,智能编排和调试,一键部署,支持私有化部署方案 广告
![#](https://img.kancloud.cn/54/4f/544fd88664d5b3e8f21814dbd5328e73_1812x1022.png) # 题1 JS 中 8 种数据类型: 布尔(Boolean)、 字符串(String)、 数字(Number)、 对象(object)、 undefined、 null、 Symbol、 BigInt。 # 题2 输出结果:555555(6个5) 原因:setTimeout 是异步的代码,异步代码最后执行,所以代码的执行顺序是1:先循环 2打印i 3 5次setTime。 第1步执行完之后 i 就已经是5了,所以后面六次打印都是 5。 # 题3 输出:501234 原因:循环中的 setTimeout 是异步的,所以最后执行,所以先循环,然后打印i,先输出5,然后每次循环中都调用一个匿名函数,并把 i 传到函数中,i在传值是是按值传递,依次传入函数中的值是 01234,所以打印出来的也是 01234。 图解: ![](https://img.kancloud.cn/14/ab/14ab770da07395084f8fad850284925b_896x772.png) 扩展:类似的面试题,以下程序输出结果是? ![](https://img.kancloud.cn/04/2f/042f8723ce05ea4aa46d1f40f7200b55_636x316.png) 答:函数外打印i 报错,剩下的输出结果是01234。 let 可以定义块级作用域,只能在循环中使用。 # 题4 typeof:查看一个变量的数据类型。返回值是:null、string、object、boolean 等数据类型 instanceof:查看一个对象是否是另一个对象的子对象(查看原型链),返回值是:boolean。 ![](https://img.kancloud.cn/b7/b1/b7b19e6968b435a56d674871c394fc89_858x962.png) # 题5 实现思路: 1. 为 body 绑定一个 `mouseover` 事件 2. 通过事件对象获取鼠标的信息(事件对象:回调函数上的参数,包含了事件的信息) 3. 设置图片为绝对定位,并设置left、top属性和鼠标位置相同 ~~~ // 先初始化图片 const img = document.createElement('IMG') img.src = 'https://img14.360buyimg.com/babel/s1180x940_jfs/t1/115462/17/8922/86672/5ed4824dE79c7d70e/fa0f1f71baa04b5b.jpg.webp' img.style.width = '100px' img.style.height = '100px' img.style.position = 'absolute' img.style.left = 0 img.style.top = 0 document.body.appendChild(img) // 写法一、DOM0级事件(只能在冒泡阶段触发) // e:事件对象 document.onmousemove = function(e) { img.style.left = e.clientX + 'px' img.style.top = e.clientY + 'px' } // 写法二、DOM2级事件 // 第三个参数:是否在捕获阶段触发,默认是 false(冒泡阶段) document.addEventListener('mousemove', function(e){ img.style.left = e.clientX + 'px' img.style.top = e.clientY + 'px' }, false) ~~~ # 题6 ~~~ // 从数组中随机抽取n个数 // 参数一、数组 // 参数二、n(随机抽取几个) // 版本:有可能重复 function randomSelect(arr, n) { // 保存最终的结果 let ret = [] // 循环 n 次 for(let i=0; i<n ; i++) { // 生成一个 [0 ~ arr.length) 的随机数 let index = Math.floor(Math.random() * arr.length) // 根据随机下标取出数 ret.push(arr[index]) } return ret } // 版本不重复 function randomSelectUni(arr, n) { // 保存最终的结果 let ret = [] // 生成一个 [0 ~ arr.length) 的随机数 let index = Math.floor(Math.random() * arr.length) // 循环 n 次 for(let i=0; i<n ; i++) { // 如果随机的这个数之前已经取过了,就重新计算随机数 // indexOf 也可以使用 includes 来判断数组中是否已经存在 while( ret.indexOf(arr[index]) !== -1 ) { index = Math.floor(Math.random() * arr.length) } // 根据随机下标取出数 ret.push(arr[index]) } return ret } ~~~ # 题7 这三个都是操作数组的函数。 - map:循环并处理数组中的每一个元素。 返回值:处理完之后的新数组。 不修改原数组。 ~~~ let a = [1,2,3,4,5,6,7] // 把 a 中的每个数扩大 10 倍,得到一个新数组 let b = a.map(v => v*10 ) ~~~ - filter(过滤) 循环数组中的每一个元素,当满一个条件时才返回,否则就过滤掉。 返回值:过滤完之后剩下满足条件的元素的新组件。 不修改原数组。 ~~~ let a = [ { id: 12, name: '手机' }, { id: 35, name: '电脑' } ] // 过滤出商品ID大于20的商品 let b = a.filter(v=>v.id>20) ~~~ - reduce(累加) 循环数组中每一个元素,将每个元素中的值累加到一起。 返回值:累加之后的结果 不修改原数组。 ~~~ let a = [ { id: 12, name: '手机', price: 213 }, { id: 35, name: '电脑', price: 435 } ] // 计算出所有商品的总价格 // 参数一、total:每次累加的结果,也是最终的返回值 // 参数二、循环时数组中的每个元素 // 0:total 累加之前的初始值 let totalPrice = a.reduce( (total, v) => total+v.price, 0) // 另一个例子 let a = [1,2,3,4,5,6,7] // 对数组中所有的元素求和 // total 是累加之后的和,初始值为0 // 每循环一次把当前值加到 total 上,结果做为下次循环的 total let sum = a.reduce( (total, v) => total+v , 0) ~~~ # 题8 异步加载:可以并发同时加载多个文件。 延迟加载:先不加载,当用到时才开始加载。 网页中加载一个资源(CSS、JS、图片等等)分为: 同步加载:加载完一个之后再加载下一个(一个一个的加载),这种加载有可能出现阻塞(某一个资源始终加载不出来就会等在这里) 异步加载:同时加载多个文件,这种不会出现阻塞。 延迟加载:先不加载,当使用到这个资源时再加载。比如:京东首面,默认只加载第一屏的商品数据,当向下滚动滚动条时才加载下一屏的商品,如果不滚动就不再加载后面的商品。 # 题9 问题一、async...await 是 ES8 中出的可以以同步的方式编写异步代码的一种技术。 问题二、它其实是 Generator(生成器) 的语法糖。 (ES6 文档上写的) 语法糖:这个语法是为了简写另一个语法而存在 的,它本身不能需要,需要先转成另一种语法 才能运行。 比如:ES6中的 class(定义类,就是一种语法糖) ~~~ // es6 中定义一个类 class People { hello() { } } // 以上是语法糖,是以下代码的语法糖(需要先转成下面这样才能运行) function People(){ } People.prototype.hello = function() { } ~~~ # 题10 1. 原生JS 使用 AJAX 调用 接口 ![](https://img.kancloud.cn/8f/36/8f36c0e2f97749a89873d253a50373e4_1394x652.png) 2. 渲染返回的数据(DOM操作) ![](https://img.kancloud.cn/69/99/699940103f195634a6a1758312b09db2_652x1128.png) 扩展:将 AJAX 封装成一个 Promise 对象的用法 ![](https://img.kancloud.cn/b1/a6/b1a63b23d772ea182409c561401c2193_1396x1240.png) 扩展:如何使用 ES8 中的 async...await ![](https://img.kancloud.cn/f4/82/f482e43afad48fefa450ec204a15cde3_1356x1036.png)