# 光子跃动前端面试题

# 第一题

// 请输出以下代码的执行结果
// 时间为预约面试时间
for(var i = 0; i <= 5; i++){
    setTimeout(function(){
        console.log(1,new Date(),i);
    }, i * 1000)
}
console.log(2,new Date(),i);

// 假设面试时间为2020-02-20 20:00:00,则上面代码分别输出
// 2 2020-02-20 20:00:00 6
// 1 2020-02-20 20:00:00 6
// 1 2020-02-20 20:00:01 6
// 1 2020-02-20 20:00:02 6
// 1 2020-02-20 20:00:03 6
// 1 2020-02-20 20:00:04 6
// 1 2020-02-20 20:00:05 6

# 第二题

// 请输出以下代码的执行结果
b()
function b(){
    console.log(1);
}
function b(){
    console.log(2);
}
var b = 3;
console.log(b);
console.log(a);
let a = 'a';

// 由于var关键词声明的变量会提升到作用域最顶层,所以以上代码的实际编译为
/**
var b
function b(){
    console.log(1);
}
function b(){
    console.log(2);
}
b();
b = 3;
console.log(b);
console.log(a);
所以依次输出
2
3
报错 a Cannot access 'a' before initialization
**/

# 第三题

// 请写出以下代码语句的执行结果
var a = {
    a:1,
    b:"1",
    c:[1],
    d:{
        name:"d"
    }
}
for(let key in a){
    console.log(Object.prototype.toString(a[key]));
}

// [object Object]
// [object Object]
// [object Object]
// [object Object]

# 第四题

// 请写出以下代码的执行结果
1 + "1"
2 * "2"
[1,2] + [2,1]
"a" + + "b"

// "11"
// 4
// "1,22,1"
// aNaN 第4个表达式可拆解为  ”a“ + (+"b"),由于b为非数字类型,所以得到NaN,所以最后输出aNaN


// [object Object]
// [object Object]
// [object Object]
// [object Object]

# 第五题

// 已知以下数组,编写一个程序将数组扁平化并除去其中重复部分数据,最后得到一个升序且不重复的数组
const arr = [[1,2,2],[3,4,5,5],[6,7,8,9,[11,12,[14]]],18]

// 解法1
function arrFlatUniqueSort(arr){
    if(arr && arr instanceof Array){
        let arrStr = arr.toString();
        let newArr = arrStr.split(",");
        let set = new Set(newArr);
        let uniqueArr = Array.from(set);
        return uniqueArr.map(item =>parseInt(item)).sort((a,b) =>{a - b});
    }
}

// 解法2
function arrFlatUniqueSort(arr){
    let newArr = [];
    (function rec(arr){
        if(arr && arr instanceof Array){
            arr.forEach(item =>{
                if(item instanceof Array){
                    rec(item);
                }else{
                    newArr.push(item);
                }
            });
        }
    })(arr);
    let set = new Set(newArr);
    let uniqueArr = Array.from(set);
    return uniqueArr.sort((a,b) =>{a - b});
}

// 解法3
function arrFlatUniqueSort(arr){
    if(arr && arr instanceof Array){
        let newArr = (arr) =>{
            return arr.reduce((pre,cur,index,arr) => {
                return pre.concat(Array.isArray(cur) ? newArr(cur) : cur)
            },[]);
        } 
        let set = new Set(newArr(arr));
        let uniqueArr = Array.from(set);
        return uniqueArr.sort((a,b) =>{a - b});
    }
}

arrFlatUniqueSort(arr);