您的位置:首页 > Web前端

前端面试前必备的深浅拷贝和排序知识

2020-03-29 12:37 363 查看

今年的大环境有点艰难,上周去参加面试,正巧遇到了这样的面试题,现在分享给大家,希望有所帮助。

对象的深浅拷贝@TOC

说深浅拷贝之前,我们必须了解js的数据类型分为基本类型和引用类型,基本类型就没有深浅拷贝之说,只有引用类型才有,怎么理解呢

用基本数据类型A拷贝出一份基本数据类型B,那么A和B都是单独存在的,改变B,A不会有任何变化,通俗理解就像是生物上的克隆。

引用数据类型的深浅拷贝究竟有什么区别?
简单来说,区分深/浅拷贝,就是假设B复制了A,当修改A时,如果B也跟着变了,说明这是浅拷贝,如果B没变,那就是深拷贝。

对象的拷贝我知道的以下几种:

  1. ES6的assign方法
  2. js的concat和slice
  3. JSON方法
  4. 递归
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

  1. 快排
  2. 选择排序
  3. 冒泡排序
  4. 插入排序

快排

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);
  • 点赞
  • 收藏
  • 分享
  • 文章举报
需求分析师 发布了6 篇原创文章 · 获赞 0 · 访问量 325 私信 关注
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: