手写JS编程题

192 阅读2分钟

实现new

function _new(con, ...args) {
    // 1.创建一个新对象
    let obj = {}
    // 2.将新建对象的原型指向改造函数的原型
    obj.__proto__ = Object.create(con.prototype)
    // 3.执行构造函数
    let res = con.apply(obj, args)
    // 4.判断res,返回结果
    return res instanceof Object ? res : obj
}

实现数组拍平

// 迭代实现
const flatten = (arr) => {
    while(arr.some(item => Array.isArray(item))) {
        arr = [...arr]
    }
    return arr 
}
// ES6解法
const flatten = (arr) => arr.reduce((acc, cur) => { Array.isArray(cur) ? [...acc, ...flatten(cur)] : [...acc, cur]}, [])

合并数组 arr1[A1, A2, B1, B2]和arr2[A, B]合并为[A1, A2, A, B1, B2, B]

let arr1 = [A1, A2, B1, B2]
let arr2 = [A, B]
arr2 = arr2.map(item => item + '3')
let result = [...arr1, ...arr2].map(item => {
    if (item.indexOf('3')) {
        return item.substr(0, 1)
    }
    return item
})

a == 1 && a == 2 && c == 3什么时候会成立 ?

// 考察隐式转换 valueOf和toString
let a = {
    value: 0,
    valueOf() {
        return ++this.value
    }
}

实现一个lazyMan

class lazyMan {
    constructor(name) {
        this.queue = []
        console.log(`I am ${name}`)
        setTimeout(() => {
            this.next()
        }, 0)
    }
    eat(type) {
        const fn = () => {
            console.log(`I am eating ${type}`)
            this.next()
        }
        this.queue.push(fn)
        return this
    }
    sleep(seconds) {
        const fn = () => {
            setTimeout(() => {
               console.log(`等待了${seconds}秒`) 
               this.next()
               return this
            }, seconds)
        }
        this.queue.push(fn)
        return this
    }
    sleepFirst(seconds) {
        const fn = () => {
            setTimeout(() => {
               console.log(`等待了${seconds}秒`) 
               this.next()
               return this
            }, seconds)
        }
        this.queue.unshift(fn)
        return this
    }
    next() {
        const fn = this.queue.shift()
        fn && fn()
    }
}

给两个数组,来计算它们的交集

let num1 = [1,2,3]
let num2 = [2,4]
let set1 = new Set(num1)
let set2 = new Set(num2)
let reuslt = new Set([...set1].filter(item => set2.has(item)))

如何把一个字符串的大小写取反,例如'Abc'变成'aBC'

str.replace(/[a-zA-Z]/g, function(item) {
    return /[a-z]/.test(item) ? item.toUpperCase() : item.toLowerCase()
})

用简洁的方式实现indexOf方法


如何设计实现无缝轮播

随机生成一个长度为10的整数类型的数组,例如[2,10,3,4,5,11,10,11,20],将其排列成一个新数组,如下[[2,3,4,5],[10,11],[20]]

function getRandomNumber(min, max) {
    min = Math.ceil(mix)
    max = Math.floor(max)
    return Math.floor(Math.random() * (max - min + 1) + min)
}
let initArr = Array.from(Math.from({length: 10}, (v) => return getRandomNumber(0, 99)))
initArr.sort((a,b) => a - b)
initArr = [...(new Set(initArr))]
let obj = {}
initArr.map(i => {
    const initNum = Math.floor(i/10)
    if (!obj[initNum]) obj[initNum] = []
    obj[initNum].push(i)
})
let result = initArr.flat(Infinity)

实现一个字符串匹配算法

const find = (S, T) => {
    if (S.length < T.length) return -1
    let len = S.length - T.length
    for (let i = 0; i < len; i++) {
        if (S.substr(i, T.length) === T) return i
    }
    return -1
}

给定一个数组,将数组中的元素向右移动k个位置

for (let i=0; i < arr.length; i++) {
    arr.unshift(arr.pop())
}