hash 微信公众号开发 idea离线安装 extjs6.5 unity3d timer 逻辑端口 jar hyperlink rxjs sas vue开发文档 vue异步加载组件 vue入门 html好看的字体样式 mysql卸载重装 less的比较级 div字体加粗 python学习 python循环语句 python包 python正则匹配 java基础学习 java方法的重载 java面向对象 java安装与配置 linux镜像安装 网站后台模板 python 教程 tar文件怎么打开 两表关联查询 迅雷去广告版 skycc组合营销软件 phpword c4d挤压 ps怎么画漫画 ps去白底 现代操作系统 分屏软件 office2010免费版
当前位置: 首页 > 学习教程  > 编程学习

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

2021/1/9 2:04:48 文章标签: 深浅拷贝

今年的大环境有点艰难,上周去参加面试,正巧遇到了这样的面试题,现在分享给大家,希望有所帮助。 对象的深浅拷贝TOC 说深浅拷贝之前,我们必须了解js的数据类型分为基本类型和引用类型,基本类型就没有深浅拷…

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

对象的深浅拷贝@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);

本文链接:
http://www.dtmao.cc/news_show_1100282.shtml

附件下载

相关教程

    暂无相关的数据...

共有条评论 网友评论

验证码: 看不清楚?