实现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())
}