地平线前端实习一面复盘(加深对var的理解+展开运算符+平拍数组)

前言

地平线的面试,有提示,很专业,体验很好。

可惜后面未收到消息,但还是要做复盘。收获还是很大的。

一,var的作用

且看下面五个题目:

// 题目1---4
function test(a) {
    a = 3
}
var a = 4
test(a)
console.log(a)

// 题目2---4
function test(a) {
    var a = 3
}
var a = 4
test(a)
console.log(a)

// 题目3---3
function test() {
    a = 3
}
var a = 4
test(a)
console.log(a)

// 题目4---4
function test() {
    var a = 3
}
var a = 4
test(a)
console.log(a)

上面这五个题目,实则是对var的考察。

且看第一题:

// 题目1---4
function test(a) {
    a = 3
}
var a = 4
test(a)
console.log(a)

为什么打印出来的是4?首先,声明了个变量a为4,调用函数,把a传进去,a为3,但是函数里面的a是局部变量。打印的时候,最外层的作用域是全局的a,所以打印出来为4。

// 题目2---4
function test(a) {
    var a = 3
}
var a = 4
test(a)
console.log(a)

第二题打印出的是4,为什么不是3?a虽然重新在函数内部被声明,但==在函数内部被声明的是局部变量。==最后打印出来的是全局变量。因此是4。

// 题目3---3
function test() {
    a = 3
}
var a = 4
test(a)
console.log(a)

第三题打印出来的是3,一开始在外层定义a为4,调用test的时候,虽然传进去了a,但是由于test并没有定义参数,所以没有接收到。函数内部给a赋值的时候,先看函数内部有没有声明a,答案是没有,于是去外层作用域寻找,最后找到了全局中的a并对其进行修改,修改为3,所以最后打印出来的值为3。

这段代码可以等价于:

function test() {
    a = 3
}
var a = 4
test()
console.log(a)

题目四

// 题目4---4
function test() {
    var a = 3
}
var a = 4
test(a)
console.log(a)

局部变量a为3,但是打印的是全局,所以是4。

有一句话很重点 :在函数内部被声明的是局部变量,局部变量可以访问全局变量,但是外层读不到局部变量。

二,展开运算符

const a = { j: 1, k: 2, m: {n: 3}}
const b = { m: { s: 4, t: 5 }}
const c = {...a, ...b}
console.log(c)

大部分时候,都是原封不动的拼接;但是遇到嵌套的结构,后面的会替代前面的:

{ j: 1, k: 2, m: { s: 4, t: 5 } }

我们可以再换一个顺序:

const a = { j: 1, k: 2, m: {n: 3}}
const b = { m: { s: 4, t: 5 }}
const c = {...b, ...a}
console.log(c)

最后的结果:

{ m: { n: 3 }, j: 1, k: 2 }

三,平拍数组

在这里插入图片描述
解法:递归算法。

var arr = [1, 2, [10, 90, 11], [50, 2, [22, 90]], [1]]
var arrChange = (arr) => {
    let arr1 = []
    arr.forEach(item => {
        // 如果是一个数组
        if(Array.isArray(item)) {
            arr1 = arr1.concat(arrChange(item))
        } else {
            arr1.push(item)
        }
    })
    return arr1;
}
console.log(arrChange(arr))

总结

本次面试面试官很友善,并且也提示我了很多。总之,算法和js基础非常重要。和大家共勉!