手撕JS面试题大全一

Posted 三水草肃

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了手撕JS面试题大全一相关的知识,希望对你有一定的参考价值。

冒泡排序

/* 两两比较 */
function bubleSort(arr) {
    var len = arr.length
    for (let outer = len; outer >= 2; outer--) {
        for (let inner = 0; inner <= outer - 1; inner++) {
            if (arr[inner] > arr[inner + 1]) {
                [arr[inner], arr[inner + 1]] = [arr[inner + 1], arr[inner]]
            }
        }
    }
    return arr
}
console.log(bubleSort([1, 2, 5, 44, 56, 5, 85, 5]));

/* 选择排序: 遍历自身以后的元素,最小的元素跟自己调换位置 */
function selectSort(arr) {
    var len = arr.length
    for (let i = 0; i < len - 1; i++) {
        for (let j = 1; j < len; j++) {
            if (arr[i] > arr[j]) {
                [arr[i], arr[j]] = [arr[j], arr[i]];
            }
        }
    }
    return arr
}

解析URL

function parseUrl(url) {
    const urlObj = new URL(url)
    let query = {}
    for (let item of urlObj.search.slice(1).split('&').map(value => value.split('='))) {
        let name = item[0]
        let value = item[1]
        if (name.length) {
            query[name] = value
        }
    }
    urlObj.query = query
    return {
        origin: urlObj.origin,
        protocol: urlObj.protocol,
        host: urlObj.hostname,
        port: urlObj.port,
        pathname: urlObj.pathname,
        search: urlObj.query,
        hash: urlObj.hash,
    }
}
console.log(parseUrl('https://www.naodi.com/path/?a=1&b=2#/hash'));

深拷贝和浅拷贝

深拷贝


方法一:
 JSON.parse(JSON.stringfy())
 
方法二:
 function deepClone(obj) {
    let objClone = Array.isArray(obj) ? [] : {}
    if(obj && typeof obj === 'object') {
        for(key in obj) {
            if(obj.hasOwnProperty(key)) {
                if(obj[key] && typeof obj[key] == 'object') {
                    objClone[key] = deepClone(obj[key])
                }else {
                    objClone[key] = obj[key]
                }
            }
        }
    }
    return objClone
}

浅拷贝

Object.assign()

数组扁平化

方法一:
function flatten(arr) {
    return arr.reduce((prev, curr) => {
        return prev.concat(Array.isArray(curr) ? flatten(curr) : curr)
    }, [])
}
方法二:
function aaa(arr) {
    let res = []
    arr.map(item => {
        if (Array.isArray(item)) {
            res.concat(aaa(item))
        } else {
            res.push(item)
        }
    })
    return res
}

数组去重合并

function combine(){
    let arr = [].concat.apply([], arguments);  //没有去重复的新数组
    return Array.from(new Set(arr));
}

var m = [1, 2, 2], n = [2,3,3];
console.log(combine(m,n)); 
https://developer.mozilla.org/zh-

https://developer.mozilla.org/zh-CN/docs/Web/JavaScript/Reference/Global_Objects/Array/from

实现new

function myNew(fun, ...arg) {
    // 创建一个新对象,并且隐士原型指向构造原型
    let obj = {
        __proto__ = fun.prototype
    }
    fun.apply(obj, arg)
    return obj
}

new实例过程是改变this指向到构造函数

数组常用方法:

  • Array.isArray() 用于确定传递的值是否是一个 Array。
    
  • Array.of() 返回一个由参数组成的数组
    
  •  Array.from() 将数组对象转换为数组 不改变原对象 返回新数组
    
  •   pop() 删除数组最后一个元素(改变原数组) 返回被删除的元素
    
  •   shift() 删除数组的第一个元素 (改变原数组) 返回被删除的元素
    
  •  push() 向末尾添加元素(改变原数组) 返回添加后的length
    
  •   unshift() 向数组开头添加元素(改变原数组) 返回添加后数组的length
    
  •   reverse() 反转数组 改变原数组
    
  •   splice() 添加/删除/替换 当前数组改变
    
  •    sort() 数组排序 (改变原数组) 参数为规定排序的比较函数(非必填)
    
  •   copyWithin() 数组的指定位置复制[改变原数组、ES6]
    
  •   fill()数组的填充 [改变原数组、ES6]
    
  •    slice() 拷贝数组元素 [不改变原数组]
    
  •    join()将数组转换为字符串[不改变原数组]
    
  •    concat() 连接合并多个数组,返回新数组。[不改变原数组]
    
  •  toString() 方法可把数组转换为字符串,并返回结果。[不改变原数组]
    
  •   indexOf() 查找数组中某元素的第一个索引值。[不改变原数组] 如果没有就返回-1
    
  •   lastIndexOf() 逆向查找指定元素在数组中的第一个位置。[不改变原数组]
    
  •   includes() 查找数组是否包含某个元素。[不改变原数组,]
    
  •  map
    
  •  filter
    
  • reduce
    
  •   forEach
    
  • 等等等下次再详细解答~
    

以上是关于手撕JS面试题大全一的主要内容,如果未能解决你的问题,请参考以下文章

手撕前端面试题(Javascript~事件委托数组去重合法的URL快速排序js中哪些操作会造成内存泄漏......

手撕前端javascript面试题---快速排序 | 全排列 | instanceof

JavaScript手撕前端面试题:事件委托 | 判断URL是否合法 | 全排列

手撕面试题

JavaScript手撕前端面试题:手写new操作符 | 手写Object.freeze

《2w字大章 38道面试题》彻底理清JS中this指向问题 #yyds干货盘点#