地平线前端实习一面复盘(加深对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基础非常重要。和大家共勉!