前言
继续学习。。
正文
1.已知如下数组:
var arr = [ [1, 2, 2], [3, 4, 5, 5], [6, 7, 8, 9, [11, 12, [12, 13, [14] ] ] ], 10];
编写一个程序将数组扁平化去并除其中重复部分数据,最终得到一个升序且不重复的数组
自己的实现
var arr = [ [1, 2, 2], [3, 4, 5, 5], [6, 7, 8, 9, [11, 12, [12, 13, [14] ] ] ], 10]
let set = new Set()
function s(arr){
console.log('a');
for(let i=0;i<arr.length;i++){
aa(arr[i])
console.log(arr[i]);
}
}
function aa(arr){
if(Array.isArray(arr)){
s(arr)
}
else{
set.add(arr)
}
}
let a = Array.from(set).sort((a,b)=>a-b)
console.log(a);
别人实现:
var arr = [ [1, 2, 2], [3, 4, 5, 5], [6, 7, 8, 9, [11, 12, [12, 13, [14] ] ] ], 10]
let a= Array.from(new Set(arr.flat(Infinity))).sort((a,b)=>{return a-b})
console.log(a);
关键在于flat函数将数组递归的解析出来
2.Promise执行顺序
const promise = new Promise((resolve, reject) => {
console.log(1)
resolve()
console.log(2)
})
promise.then(() => {
console.log(3)
})
console.log(4)
结果:1 2 4 3
结论: promise构造函数是同步执行的,then方法是异步执行的
3. new 的实现
// 实现一个new
var Dog = function(name) {
this.name = name
}
Dog.prototype.bark = function() {
console.log('wangwang')
}
Dog.prototype.sayName = function() {
console.log('my name is ' + this.name)
}
let sanmao = new Dog('三毛')
sanmao.sayName()
sanmao.bark()
new 的作用
创建一个新对象obj
把obj的__proto__指向Dog.prototype 实现继承
执行构造函数,传递参数,改变this指向 Dog.call(obj, …args)
最后把obj赋值给sanmao
var _new =function _new(fn,...args) {
const obj = Object.create(fn.prototype)
const ret = fn.apply(obj,arg)
return ret instanceof Object ? ret : obj
}
var simao = _new(Dog, 'simao')
simao.bark()
simao.sayName()
console.log(simao instanceof Dog) // true
总结
本文源自github上的前端试题,贴出链接。
github 搜索Advanced-Frontend