js⽤递归遍历多维数组_js⾯试题更新之40
1、数组⽅法pop() push() unshift() shift()
push 后⾯添加元素,个数不限,返回新数组的长度
pop 从后⾯删除⼀个元素,返回那个元素
unshift 从前⾯添加元素,个数不限,返回新数组的长度
shift 从前⾯删除⼀个元素,返回那个元素
2、javascript的typeof返回哪些数据类型
Object number function Boolean underfind
(注意这⾥没有null,null是⼀个空对象,是Object的类型。undefined隐形转换数字为NaN,不是任何值,不等于NaN本⾝。null隐形转换数
字⽂0。强制转化都为NaN。)
3、split() join() 的区别
split() 字符串的⽅法,把字符串分割成数组 split(“,”)
join() 数组的⽅法,把数组连接成字符串 join(“--”)
4、输出的值是什么:
var arr = [1, 2, 3, 4, 5, 5] for (var i = 0; i setTimeout(function(){ console.log(i) }) //输出6次6。setTimeout()是异步操作。var定义变量是for (let i = 0; i setTimeout(function(){
console.log(i) }) } //输出0 1 2 3 4 5 。let不存在变量提升,可以形成块级作⽤域
for (var i = 0; i setTimeout(function(){ console.log(arr[i]) }) } //输出6次undefined
for (let i = 0; i setTimeout(function(){ console.log(arr[i]) }) } //输出 1 2 3 4 5 5
5、前端有哪⼏种本地存储⽅式,简述各⾃的特点(请描述⼀下cookies,sessionStorage和localStorage的区别?)
前端有三种本地存储的⽅式:cookie、localStorage 、 sessionStorage
cookie---最⼤数据量为4kb左右,存储量⼩,可以设置有效期,默认为会话级别。是基于http的。
localStorage---有效期永久,存多了,不主动删除,会造成浏览器很卡。同源可以修 改localStorage的数据。
sessionStorage:有效期顶层窗⼝关闭钱,数据在页⾯会话结束的时候会被清除,属 于临时保存同⼀窗⼝的数据。最⼤容量有5M左右。
6、简述常见的http状态码
200 请求成功
304 服务器已经执⾏了请求,当⽂件没有变化 ,简单讲有缓存了。
404 Not Found
500 服务端错误
7、从输⼊URL到页⾯加载发⽣了什么?
1、DNS解析 (把域名解析为相应的ip地址)
2、TCP连接 (三次握⼿的过程)
3、发送HTTP请求
4、服务器处理请求并返回HTTP报⽂
5、浏览器解析渲染页⾯
6、连接结束 (断开连接过程是四次挥⼿的过程)
8、Promise构造函数是同步执⾏还是异步执⾏,那么 then ⽅法呢?
Promise构造函数是同步执⾏的,then⽅法是异步执⾏的
9、setTimeout、Promise、async/await 的区别?
事件循环(Event Loop)中分为宏任务队列和微任务队列
setTimeout的回调函数放到宏任务队列⾥,等到执⾏栈清空以后执⾏
promise.then⾥的回调函数会放到相应宏任务的微任务队列⾥,等宏任务⾥⾯的同步代码执⾏完再执⾏
async函数表⽰函数⾥⾯可能会有异步⽅法,await后⾯跟⼀个表达式。async⽅法执⾏时,遇到await会⽴即执⾏表达式,然后把表达式后
⾯的代码放到微任务队列⾥,让出执⾏栈让同步代码先执⾏
补充:promise 是es6新增⼀种异步编程的⽅案
async/await是es7中新增的异步编程的⽅案。
经典案例:今⽇头条的⾯试题,执⾏的顺序
async function async1 () { console.log('async1 start') // 2 await async2(); console.log('async1 end') //7}async function async2 () { console.log('async2') //3} 10、forEach、for in、for of三者区别
forEach:⽤来遍历数组,对数组中的每个元素执⾏⼀次提供的函数,不改变原数组,⽆返回值,undefined。
for in ⼀般常⽤来遍历对象或json。
for of数组对象都可以遍历。其中遍历对象使⽤Object.keys()
例:arr.forEach(function(value,index,arr){代码段})
例:let obj={a:1,b:2} for(let o in obj){ console.log(o) //a b }
例:let arr=[‘China’,’korea’] let obj={a:1,b:2}
for(let o of arr){console.log(o) // China Korea}
for(let o of Object.keys(obj)){ //直接写for(let o of obj)报错
console.log(o) } // a b 对象中的键
11、⼿写⼀个 Promise(中⾼级必考)什么是promise?promise是⽤来⼲啥的?解决了什么问题?
Promise是异步编程的⼀个解决⽅案,主要⽤来解决两个问题:1、解决异步的问题,2、解决回调地狱的,就是第⼀个函数的输出是第⼆
个函数的输⼊的这种现象。
let promise=new Promise((resolve,reject)=>{If(异步操作成功){resolve(value);}else{reject(error); //操作失败}})promise.then(function(value){ //success },function(err Promise 对象的三种状态:pending(正在进⾏)、fulfilled(成功)、rejected(失败)。
状态只能pending到fulfilled或者pending到rejected,状态⼀旦改变不能再变。
12、对象、数组的深拷贝浅拷贝
浅拷贝:就是流于表⾯的拷贝⽅式,浅拷贝只拷贝的对象的地址,也就是说两个对象指向的是同⼀地址,修改其中的⼀个对象的属性,另⼀
个对象的属性也会修改。
深拷贝:完全拷贝,拷贝之后新旧数据完全分离,不再共⽤对象类型的属性值,不会相互影响。
13、⼿写⼀个js深拷贝 (先理解什么是深拷贝)
乞丐版:
01、var newObj=JSON.parse(JSON.stringify(obj))⽆法复制函数,丢失原型链,对于多维数组也有效02、var newArr=arr.slice() 或者at() 只能实现⼀维数组的⾯试够⽤版(判断是数组还是对象,新建⼀个数组或者对象,通过for in循环数组对象,完成深拷贝) 递归拷贝
function deepCopy(obj){ //判断是否是简单数据类型if(typeof obj == "object"){ //复杂数据类型 var result = structor == Array ? [] : {}; for(let i in o 14、数组去重⼿写
利⽤es6中Set去重
var arr = [1,2,2,23,23,undefined,undefined]; var newarr = Array.from(new Set(arr)) console.log(newarr) // [1, 2, 23, undefined]补充:ES6提供了⼀个新的数据结双重for循环+splice()⽅法
function single(arr){ for(var i=0;i for(var j=i+1;j if(arr[i]==arr[j]){ arr.splice(j,1); j--; //arr的长度变了 } }} return arr;}var arr = [1,2,2,23,23,undefined,und 利⽤indexOf去重
var arr = [1,2,2,23,23,undefined,undefined]; var newapp=[];for(var i=0;iif(newapp.indexOf(arr[i])===-1){newapp.push(arr[i])}} console.log(newapp) // [1, 2, 23, u 新建⼀个空数组,for循环判断新数组中是否存在原数组中元素,如果有相同的值则跳过,不相同push到新数组。
15、冒泡排序和选择排序
冒泡排序:相邻两个元素⽐较
相邻两个元素进⾏⽐较,将⼀个数组中数字使⽤循环进⾏升序或排序的
arr = [1, 2, 3, 4] for (var j = 0; j < arr.length; j++) { for (var i = 0; i < arr.length; i++) { if (arr[i] < arr[i + 1]) { var a = arr[i] 选择排序:先值
这种排序⽅式先最⼤的,排在最左侧,然后第⼆个往左靠。。。。
arr = [1, 2, 3, 4] for (var i = 0; i < arr.length - 1; i++) { for (var j = i + 1; j < arr.length; j++) { if (arr[i] < arr[j]) { tmp = arr[i]; 冒泡排序和顺序排序(划重点)。
(1)冒泡排序是⽐较相邻位置的两个数,⽽选择排序是按顺序⽐较,最⼤值或者最⼩值;
(2)冒泡排序每⼀轮⽐较后,位置不对都需要换位置,选择排序每⼀轮⽐较都只需要换⼀次位置;
(3)冒泡排序是通过数去位置,选择排序是给定位置去数;
总结:⼀般选择排序优于冒泡排序。因为每次排序只需要交换⼀位置。冒泡排序⽐较耗性能。
16、 浅谈async/await
1、async声明⼀个异步async function fun(){….}
⾃动将常规的函数转换成Promise ,返回值也是⼀个Promise对象。
只有async函数内部的异步操作执⾏完,才会执⾏then⽅法指定的回调函数。
异步函数内部可以使⽤await
2、await 等待异步功能执⾏ var result=await new Promise()
放置在Promise调⽤之前,await强制其他代码等待,直到Promise完成并返回结果
只能与Promise⼀起使⽤,不适于回调。
只能在async函数内部使⽤。
17、事件循环
function printing() { console.log(1); setTimeout(function() { console.log(2); }, 1000); setTimeout(function() { console.log(3); }, 0); console.log(4
理解:javascritpt是⼀门单线程的语⾔。
js分为同步任务和异步任务。事件循环分为宏任务和微任务。
同步任务在主线程上执⾏,形成⼀个执⾏栈,主线程之外,事件触发线程管理着⼀个任务队列,只要异步任务有了运⾏结果,就在任务队列
中放置⼀个事件。
⼀旦执⾏栈中的所有同步任务执⾏完毕,系统就会读取任务队列,将可执⾏的异步任务添加到执⾏栈中,开始执⾏。
执⾏顺序:执⾏栈中的任务----事件循环中宏任务------事件循环中的微任务
同步任务交给主线程,主线程之外事件触发线程管理⼀个任务队列,为异步任务。
18、ajax请求的时候get 和post⽅式的区别
1、get请求会将参数跟在url后⾯进⾏参数传递,⽽post请求则是作为http消息的实体内容发送给web服务器。
2、get提交的数据⼤⼩有限制,这个限制是url的整体长度⽽不是参数的长度。post提交没有这个限制。
3、get请求的数据会被浏览器缓存起来,带来严重的安全问题,⽽post相对来说可以避免这些问题。
4、⼀般情况下。Get请求⽤来请求数据,post请求⽤来提交数据。
19、Javascript垃圾(GC)回收机制
Javascript垃圾回收机制原理:为了防⽌内存泄漏,垃圾回收机制会定期的清理哪些不再⽤到内存变量,然后释放其内存。
现在各⼤浏览器的通常采⽤的垃圾回收机制的两种⽅法:标记清除、引⽤计数
javascript全局数组
Js最常⽤的垃圾回收⽅式是标记清除,当变量进⼊环境时,将这个变量标记为“进⼊环境”,当这个变量离开环境时标记“离开环境”。标记为‘离开环境’的就回收内存。
20、闭包是什么,有什么特性,对页⾯有什么影响
闭包是指有权访问另—个函数作⽤域中变量的函数。创建闭包的最常见的⽅式就是在—个函数内创建另—个函数,通过另—个函数访问这个函数的局部变量,利⽤闭包可以突破作⽤链域,将函数内部的变量和⽅法传递到外部。
闭包的特性:
1.函数内再嵌套函数
2.内部函数可以引⽤外层的参数和变量
3.参数和变量不会被垃圾回收机制回收,使变量私有化,容易造成内存的泄漏。
21、”==”和“===”的不同
前者会⾃动转换类型,再判断是否相等,后者不会⾃动类型转换,直接去⽐较
22、函数声明与函数表达式的区别?
定义函数的三种⽅式1、函数声明 2、函数表达式3、new Function构造函数。
在Javscript中,解析器在向执⾏环境中加载数据时,对函数声明和函数表达式并⾮是⼀视同仁的,解析器会率先读取函数声明(函数提升),并使其在执⾏任何代码之前可⽤(可以访问),⾄于函数表达式,则必须等到解析器执⾏到它所在的代码⾏,才会真正被解析执⾏。
hello()
function hello(){
console.log(“函数的声明”)
}
fun() //这⾥会报错!
var fun=function(){
console.log(“函数表达式”)
}
23、null和undefined的区别?
null是⼀个表⽰"⽆"的对象,转为数值时为0;undefined是⼀个表⽰"⽆"的原始值,转为数值时为NaN。当声明的变量还未被初始化时,变量的默认值为undefined。null⽤来表⽰尚未存在的对象
undefined表⽰"缺少值",就是此处应该有⼀个值,但是还没有定义。典型⽤法是:
(1)变量被声明了,但没有赋值时,就等于undefined。
(2)调⽤函数时,应该提供的参数没有提供,该参数等于undefined。
(3)对象没有赋值的属性,该属性的值为undefined。
(4)函数没有返回值时,默认返回undefined。
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论