javascript面试中的手写面试题

119 阅读5分钟

jym大家好,如果以下代码大家觉得有问题或者不懂,欢迎jym在评论区评论!第一次更文,可能文章格式各方面布局的不是很好,还请各位海涵,谢谢!

数组去重很多方法都差不多,但我还是写出来了,主要是想练习一下数组遍历方法.

写这篇文章的原因,是想把js中一些常见的手写题目分享给大家,当然还有很多没写,后续如果有jy需要的话,我也会写出来,分享给大家,谢谢!

1.数组的冒泡排序

const arr = [1, 9, 8, 5, 2, 98, 6, 3, 486, 25, 585, 56, 2, 6]
for (let i = 0; i < arr.length - 1; i++) {
    for (let j = 0; j < arr.length - i - 1; j++) {
        if (arr[j] > arr[j + 1]) {
            let a = arr[j]
            arr[j] = arr[j + 1]
            arr[j + 1] = a
        }
    }
}
console.log(arr)

2.数组的简单排序

const arr = [1, 9, 8, 5, 2, 98, 6, 3, 486, 25, 585, 56, 2, 6, 4]
for (let i = 0; i < arr.length - 1; i++) {
    for (let j = i + 1; j < arr.length; j++) {
        if (arr[i] > arr[j]) {
            let a = arr[i]
            arr[i] = arr[j]
            arr[j] = a
        }
    }
}
console.log(arr)

3.数组的快速排序

const arr = [1, 9, 8, 5, 2, 98, 6, 3, 486, 25, 585, 56, 2, 6, 4]

function fn(arr) {
    if (arr.length <= 1) {
        return arr
    }
    let index = Math.floor(arr.length / 2)
    let flag = arr.splice(index, 1)[0]
    let left = []
    let right = []
    for (let i = 0; i < arr.length; i++) {
        if(arr[i]>flag){
            right.push(arr[i])
        }else{
            left.push(arr[i])
        }
    }
    return fn(left).concat(flag,fn(right))
}
const newArr = fn(arr)
console.log(newArr)

4.手写防抖

<input type="text">
const ipt = document.querySelector('input')

function handler(a,b) {
    console.log('手写防抖')
    console.log(this,a,b)
}


function debounce(fn, time) {
    let timerId = 0
    return function () {
        clearTimeout(timerId)
        timerId = setTimeout(() => {
            fn()
        }, time)
    }
}
ipt.addEventListener('keyup', debounce(handler.bind(ipt,10,20), 3000))

5.手写节流,标记法

<input type="text">
const ipt = document.querySelector('input')

function handler(a,b) {
    console.log('手写节流呀')
    console.log(this,a,b)
}

function throttle(fn, time) {
    let flag = true
    return function () {
        if (flag) {
            flag = false
            setTimeout(() => {
                fn()
                flag = true
            }, time);
        }
    }
}
ipt.addEventListener('keyup', throttle(handler.bind(ipt,10,20), 3000))

6.手写节流,时间戳法

<input type="text"> 
const ipt = document.querySelector('input')

function handler(a,b) {
    console.log('手写节流')
    console.log(this,a,b)
}

function throttle(fn, time) {
    let prevDate = new Date()
    return function () {
        let nowDate = new Date()
        if (nowDate - prevDate > time) {
            fn()
            prevDate = new Date()
        }
    }
}
ipt.addEventListener('keyup', throttle(handler.bind(ipt,10,20), 3000))

7.手写实现new关键字功能

function Person(name, age) {
    this.name = name
    this.age = age
    return null
}
Person.prototype.study = function () {
    console.log('好好学习,天天向上')
}

function myNew(constructor, name, age) {
    // 1.在堆结构里面开辟一块空间
    const obj = {}
    // 2.将构造函数中的this指向这块空间
    const re = constructor.call(obj, name, age)
    console.log(re)
    // 3.将Person的显示原型指向的这块空间赋值给obj的隐式原型
    obj.__proto__ = Person.prototype
    // 4.判断构造函数的返回值
    if (typeof re === 'object' && re !== null || typeof re === 'function') {
        return re
    }
    return obj
}
const p = myNew(Person, '小花', 18)
console.log(p)

7.手写实现call方法

function Person(name,age){
    this.name = name
    this.age = age
    console.log(this)
}
const obj = {
    name:"小花"
}
Function.prototype.myCall = function(context,...rest){
    if(context === null || context === undefined){
        context = window
    }
    if(typeof context !== 'object' || typeof context !== 'function'){
        context = Object(context)
    }
    const sym = Symbol()
    // 1.修改Person中的this指向为obj
    context[sym] = this
    // 2.调用函数Person
    let re = context[sym](...rest)
    delete context[sym]
    // 3.返回函数的返回值
    return re
}
const p = Person.myCall(obj,'小李',18)
console.log(p)

8.手写实现apply方法

function Person(arg){
    this.name = arg[0]
    this.age = arg[1]
    console.log(this)
}
const obj = {
    name:"小花"
}
Function.prototype.myApply = function(context,arg){
    if(context === 'null' || context === 'undefined'){
        context = window
    }
    if(typeof context !== 'object' || typeof context !== 'function'){
        context = Object(context)
    }
    let sym = Symbol()
    context[sym] = this
    let re = context[sym](arg)
    delete context[sym]
    return re
}
const p = Person.myApply(obj,['小李',18])
console.log(p)

9.数组对象的递归深拷贝

let arr = [1, 9, 3, 5, [9, 6, 4, [96, 8, 3, 14, 2], 56, 3, 4]]

function deepCopy(arr) {
    if (typeof arr !== 'object') {
        return 
    }
    let newArr = arr instanceof Array ? [] : {}
    for (let i in arr) {
        if (arr.hasOwnProperty(i)) {
            newArr[i] = arr[i] instanceof Array ? deepCopy(arr[i]) : arr[i]
        }
    }
    return newArr
}
const newArr = deepCopy(arr)
newArr[4][1] = 100
newArr[3] = 13
console.log(arr)
console.log(newArr)

10.数组去重 原生方法 计数法

var arr = [1, 3, 7, 6, 3, 8, 9, 8, 7, 3, 9, 8, 9, 8, 3]
var newArr = []
for (var i = 0; i < arr.length; i++) {
    var num = 0
    for (var j = i + 1; j < arr.length; j++) {
        if (arr[i] == arr[j]) {
            num++
        }
    }
    if (num < 1) {
        newArr[newArr.length] = arr[i]
    }
}
console.log(newArr)

11.数组去重 原生方法 标记法

var arr = [1, 3, 7, 6, 3, 8, 9, 8, 7, 3, 9, 8, 9, 8, 3]
var newArr = []
for (var i = 0; i < arr.length; i++) {
    var flag = true
    for (var j = i + 1; j < arr.length; j++) {
        if (arr[i] == arr[j]) {
            flag = false
        }
    }
    if (flag) {
        newArr[newArr.length] = arr[i]
    }
}
console.log(newArr)

12.数组去重 indexof 方法

// 利用数组的 indexof 方法 原始 for 循环遍历
// 原理 返回值 下标,找不到返回-1
var arr = [1, 3, 7, 6, 3, 8, 9, 8, 7, 3, 9, 8, 9, 8, 3]
var newArr = []
for (var i = 0; i < arr.length; i++) {
    if (newArr.indexOf(arr[i]) == -1) {
        newArr.push(arr[i])
    }
}
console.log(newArr)

13.数组去重 includes 方法

// 利用数组的 includes 方法 原始 for 循环遍历
// 原理 返回值 存在返回true 不存在返回false
var arr = [1, 3, 7, 6, 3, 8, 9, 8, 7, 3, 9, 8, 9, 8, 3]
var newArr = []
for (var i = 0; i < arr.length; i++) {
    if (!newArr.includes(arr[i])) {
        newArr.push(arr[i])
    }
}
console.log(newArr)

14.数组去重 indexof 方法 原始 for in 循环遍历

// 利用数组的 indexof 方法 原始 for in 循环遍历
// 原理 返回值 下标,找不到返回-1
var arr = [1, 3, 7, 6, 3, 8, 9, 8, 7, 3, 9, 8, 9, 8, 3]
var newArr = []
for (var i in arr) {
    if (newArr.indexOf(arr[i]) == -1) {
        newArr.push(arr[i])
    }
}
console.log(newArr)

15.数组去重 includes 方法 原始 for in 循环遍历

// 利用数组的 includes 方法 原始 for in 循环遍历
// 原理 返回值 存在返回true 不存在返回false
var arr = [1, 3, 7, 6, 3, 8, 9, 8, 7, 3, 9, 8, 9, 8, 3]
var newArr = []
for (var i in arr) {
    if (!newArr.includes(arr[i])) {
        newArr.push(arr[i])
    }
}
console.log(newArr)

16.数组去重 indexof 方法 数组方法 forEach 遍历

// 利用数组的 indexof 方法 数组方法 forEach 遍历
// 原理 返回值 下标,找不到返回-1
var arr = [1, 3, 7, 6, 3, 8, 9, 8, 7, 3, 9, 8, 9, 8, 3]
var newArr = []
arr.forEach(function (item) {
    if (newArr.indexOf(item) == -1) {
        newArr.push(item)
    }
})
console.log(newArr)

17.数组去重 includes 方法 数组方法 forEach 遍历

// 利用数组的 includes 方法 数组方法 forEach 遍历
// 原理 返回值 存在返回true 不存在返回false
var arr = [1, 3, 7, 6, 3, 8, 9, 8, 7, 3, 9, 8, 9, 8, 3]
var newArr = []
arr.forEach(function (item) {
    if (!newArr.includes(item)) {
        newArr.push(item)
    }
})
console.log(newArr)

18.数组去重 ES6 中的扩展运算符和 Set 构造函数

// 利用ES6 中的扩展运算符和 Set 构造函数
var arr = [1, 3, 7, 6, 3, 8, 9, 8, 7, 3, 9, 8, 9, 8, 3]
console.log([...new Set(arr)])

19.数组扁平化 flat 方法

// 数组扁平化 将多维数组转化为一维数组
// ES6 中的 flat 方法
var arr = [[1],[2,3,5],[[2,9,7,6]],[9,8,75,6],[[[[8,9,63,8]]]]]
var newArr = arr.flat(Infinity)
console.log(newArr)

20.数组扁平化 递归

// concat 合并数组 递归
var arr = [[1],[2,3,5],[[2,9,7,6]],[9,8,75,6],[[[[8,9,63,8]]]]]
function fn(arr){
    var newArr = []
    arr.forEach(function(el){
        if(Array.isArray(el)){
            newArr = newArr.concat(fn(el))
        }else{
            newArr.push(el)
        }
    })
    return newArr
}
var newArr = fn(arr)
console.log(newArr)

21.数组扁平化 扩展运算符

// 扩展运算符
// 实现原理 先判断是否是数组,如果是数组,则进行解构赋值

var arr = [[1],[2,3,5],[[2,9,7,6]],[9,8,75,6],[[[[8,9,63,8]]]]]
function fn(arr) {
    while (arr.some(
            function (item) {
                return Array.isArray(item)
            }
        )) {
        arr = [].concat(...arr)
    }
    return arr
}
var Arr = fn(arr)
console.log(Arr)