前端面试前必备的深浅拷贝和排序知识
2020-03-29 12:37
363 查看
今年的大环境有点艰难,上周去参加面试,正巧遇到了这样的面试题,现在分享给大家,希望有所帮助。
对象的深浅拷贝@TOC
说深浅拷贝之前,我们必须了解js的数据类型分为基本类型和引用类型,基本类型就没有深浅拷贝之说,只有引用类型才有,怎么理解呢
用基本数据类型A拷贝出一份基本数据类型B,那么A和B都是单独存在的,改变B,A不会有任何变化,通俗理解就像是生物上的克隆。
引用数据类型的深浅拷贝究竟有什么区别?
简单来说,区分深/浅拷贝,就是假设B复制了A,当修改A时,如果B也跟着变了,说明这是浅拷贝,如果B没变,那就是深拷贝。
对象的拷贝我知道的以下几种:
- ES6的assign方法
- js的concat和slice
- JSON方法
- 递归
1、Object.assign(); //浅拷贝 2、Array.concat(); //数组中的基本数据为深拷贝,复杂数据为浅拷贝 3、Array.slice(下标,结束下标);截取子字符串 //浅拷贝 4、JSON.parse(JSON.stringify()); //深拷贝,原数据不能有函数,否则为null 深拷贝 若有数组或对象,则一直取到其中的基本数据类型,就是深拷贝 判断数据类型: Object.prototype.toString.call(x);
下面是通过递归实现深拷贝
const obj = [2,3,2,5,3,[32,5,7,2]]; function deepCopy(obj) { var newObj=Array.isArray(obj)?[]:{};//创建变量是数组还是对象 if(obj && typeof obj == "object"){//判断是不是对象---数组也是对象 for(let key in obj){//取出元素 if(typeof obj[key]=='object'){//元素是不是对象 newObj[key] = deepCopy(obj[key]) }else { newObj[key] = obj[key] } } } return newObj; }
数组排序@TOC
- 快排
- 选择排序
- 冒泡排序
- 插入排序
快排
function quickSort(arr) { if(arr.length <= 1) { return arr } // 找基准值,我取中间 let midIndex = Math.floor(arr.length / 2) let mid = arr.splice(midIndex, 1)[0] let left = [] // 比它小的 let right = [] // 比它大的 for(let i=0; i<arr.length; i++) { if(arr[i]<=mid) { left.push(arr[i]) }else { right.push(arr[i]) } } return quickSort(left).concat([mid], quickSort(right)) } let arr = [1,2,3,4,1,2,5,4,1,2,4,1,12,5,4,12,2,5,45,41,2,5,4,11,456] let res = quickSort(arr) console.log(res)
选择排序
var arr=[6,2,5,8,23,56,33]; for(var i=0;i<arr.length-1;i++){//共计arr.length-1趟 var min=arr[i];//假设arr[i]为每趟的最小值 var index=i;//索引值,方便导出for循环内的索引 for(var j=i;j<arr.length;j++){//拿最小值与数组其它元素比较,将最小放i位,其它依次排序 if(arr[j]<min){//假设的最小值不是最小 min=arr[j];//将比较结果的最小值放在存储为min index=j;//将最小值的索引赋值给index } } arr[index]=arr[i];//将不是最小值的元素依次输出 arr[i]=min;//把最小值放在i位 }
冒泡排序
arr=[1,4,7,9,21,4,5,3,22,54]; //冒泡排序 for(let i=0;i<arr.length-1;i++){ for(let j=0;j<arr.length-1-i;j++){ if(arr[j]>arr[j+1]){ let mid = arr[j]; arr[j] = arr[j+1]; arr[j+1] = mid; } } } console.log(arr)
插入排序
let arr=[1,3,7,2,4,5]; for(let i=1;i<arr.length;i++){ let key=arr[i];//第二项3 let j=i-1;//第一项0 while(j>=0 && arr[j]>key){//第一项大于第二项 arr[j+1]=arr[j];//第二项等于第一项 j--;//对比之前两项 } arr[j+1]=key;//第一项等于第二项 } console.log(arr);
- 点赞
- 收藏
- 分享
- 文章举报
相关文章推荐
- 前端面试知识必备
- 前端面试基础知识,开发必备常识.
- 前端必备----CSS知识总结(一)
- web前端工程师入门须知,每个前端程序员必备的入门知识
- JVM(8):JVM知识点总览-高级Java工程师面试必备
- 深入理解 Java 多线程核心知识:跳槽面试必备
- 【转载】前端面试“http全过程”将所有HTTP相关知识抛出来了...
- python列表的修改、查询、切片、排序、翻转、深浅拷贝
- 【前端知识点】promise简书-30分钟带你搞懂promise面试必备
- Java 程序员 面试前必备知识
- 前端必备的浏览器知识(渲染过程、回流和重绘等)
- 前端JavaScript面试技巧 JS基础知识(上、中、下)JS-WEB-API
- 【笔试面试必备】Java排序汇总
- 前端面试题目搜集——理论知识篇
- Web 前端面试小知识
- 前端知识汇总【面试用】(一)
- 纯干货:CSS你必须要知道的知识 前端必备
- python基础知识9---字符串拼接,深浅拷贝,三元运算
- 深入理解 Java 多线程核心知识:跳槽面试必备
- 基础知识总结-前端面试(一)