分析BAT等大公司的一些经典前端面试题
主要关注点是JS的一些核心技术的理解和运用
相关技术点
- 引用变量赋值传递
- 内存分析
- 作用域与作用域链
- 原型与原型链
- 变量提升与函数提升
- 变量查找与属性查找
- 闭包
- this
- IIFE
- 定时器
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>01_百度1</title>
</head>
<body>
<!--
1. 难度系数: ★★★★
2. 相关技术点:
1). 引用变量赋值
2). 内存分析
3). 函数调用传参
4). 运算符的优先级
-->
<script type="text/javascript">
/*
// 预热一
var obj = {n: 1}
var obj2 = obj
obj2.n = 2
console.log(obj.n) // ?
// 预热二
function fn1(a) {
a.n = 3
}
fn1(obj)
console.log(obj.n) // ?
// 预热三
function fn2(a) {
a = {n:4}
}
fn2(obj)
console.log(obj.n) // ?
*/
/************************************************/
console.log('----------------------------------')
var a = {n: 1}
var b = a
a.x = a = {n: 2}
console.log(a.n, b.n) // ? ?
console.log(a.x, b.x) // ? ?
</script>
</body>
</html>
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>02_腾讯1</title>
</head>
<body>
<!--
1. 难度系数: ★★★
2. 技术点:
1). 作用域与作用域链
2). 变量查找
-->
<script type="text/javascript">
var x = 10
function fn() {
console.log(x)
}
function show(f) {
var x = 20
f()
}
show(fn) // ?
</script>
</body>
</html>
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>03_美团1</title>
</head>
<body>
<!--
1. 难度系数: ★★★
2. 技术点:
1). 作用域与作用域链
2). 变量查找
-->
<script type="text/javascript">
var fn = function () {
console.log(fn)
}
fn() // ? function定义
var obj = {
fn2: function () {
// console.log(fn2)
// 想输出fn2属性的值
console.log(this.fn2) // obj.fn2也行, 但比较死
}
}
obj.fn2() // ? 报错
</script>
</body>
</html>
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>04_阿里1</title>
</head>
<body>
<!--
1. 难度系数: ★★★
2. 技术点:
1). 变量提升
2). 函数提升
3). 预处理
-->
<script type="text/javascript">
// 预热一
var a = 2
function fn() { // 预计处理:
/*
var a;
console.log(a)
a = 3
*/
console.log(a)
var a = 3
}
fn() // ?
function fn2() { // 预计处理:
console.log(a)
a = 3 // a是全局变量
}
fn2() // ?
// 预热二 预计处理是变量先还是函数先? 变量--->函数
function b() {
}
var b
console.log(typeof b) // ? // function
/***********************************************/
/*
var c
function c(c) {
console.log(c)
var c = 3
}
c = 1
console.log(c) // 1
c(2) //报错
*/
var c = 1
function c(c) {
console.log(c)
var c = 3
}
console.log(c) // ? 1
c(2) // ?
/*
1. 收集用var声明变量
2. 收集用function声明函数
函数与变量区别: 名=函数 名=非函数
*/
</script>
</body>
</html>
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>05_腾讯2</title>
</head>
<body>
<!--
1. 难度系数: ★★★
2. 技术点:
1). 变量提升
2). IIFE
3). 作用域与作用域链
4). 变量查找
-->
<script type="text/javascript">
var name = 'World!'
;(function () {
/*
var name
.....
*/
if (typeof name === 'undefined') {
var name = 'Jack'
console.log(name)
} else {
console.log(name)
}
})()
</script>
</body>
</html>
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>06_阿里2</title>
</head>
<body>
<!--
1. 难度系数: ★★★
2. 技术点
1). 定时器
2). 意外全局变量
3). 作用域与作用域链
4). 变量查找
-->
<script type="text/javascript">
var a = 6
setTimeout(function () {
console.log(0)
alert(a)
a = 666
}, 0)
console.log(1)
a = 66
/*
1 , 0 ?
*/
</script>
</body>
</html>
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>07_腾讯3</title>
</head>
<body>
<button>测试1</button>
<button>测试2</button>
<button>测试3</button>
<!--
1. 难度系数: ★★★
2. 技术点:
1). DOM事件处理
2). 闭包
-->
<script type="text/javascript">
/*
需求: 点击某个按钮, 提示"第n个"
问题: 下面的实现代码是否正确, 如果不正确, 请正确实现
*/
/*var btns = document.getElementsByTagName('button')
for(var i=0,length=btns.length;i<length;i++) { // i是一个全局变量, 遍历后是3
var btn = btns[i]
btn.onclick = function () {
alert('第'+(i+1)+'个')
}
}*/
var btns = document.getElementsByTagName('button')
for(var i=0,length=btns.length;i<length;i++) { // i是一个全局变量, 遍历后是3
(function (i) {
var btn = btns[i]
btn.onclick = function () {
alert('第'+(i+1)+'个')
}
})(i) // 使用了闭包--->内存中产生了1+3个i
}
function fn1() {
var a = 2
function fn2 () {
a++
console.log(a)
}
return fn2
}
var f = fn1()
f()
f()
</script>
</body>
</html>
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>08_阿里3</title>
</head>
<body>
<!--
1. 难度系数: ★★★
2. 技术点:
1). this
2). 闭包
-->
<script type="text/javascript">
var name = "A"
var object = {
name: "B",
getNameFunc: function () {
return function () {
return this.name // this是谁? window
}
}
}
console.log(object.getNameFunc()()) //? A
var name2 = "A"
var object2 = {
name2: "B",
getNameFunc: function () {
var that = this // 缓存this ? object2
return function () {
return that.name2
}
}
}
console.log(object2.getNameFunc()()) //? B
</script>
</body>
</html>
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>09_百度2</title>
</head>
<body>
<!--
1. 难度系数: ★★★
2. 技术点:
1). 原型与原型链
2). 对象属性查找
-->
<script type="text/javascript">
/*
测试题1
*/
function A () {
}
A.prototype.n = 1
var b = new A()
A.prototype = {
n: 2,
m: 3
}
var c = new A()
console.log(b.n, b.m, c.n, c.m) // ? ? ? ?
</script>
</body>
</html>
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>10_京东1</title>
</head>
<body>
<!--
1. 难度系数: ★★★★
2. 技术点:
1). 原型与原型链
2). 实例对象,构造函数,Object, Function的关系
-->
<script type="text/javascript">
var F = function(){}
Object.prototype.a = function(){
console.log('a()')
}
Function.prototype.b = function(){
console.log('b()')
}
var f = new F()
F.a() // ?
F.b() // ?
f.a() // ?
f.b() // ?
</script>
</body>
</html>
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>11_阿里4</title>
</head>
<body>
<!--
1. 难度系数: ★★★★
2. 技术点:
1). 变量提升
2). this
3). 运算符优先级
4). 原型与原型链
5). 全局变量污染
-->
<script type="text/javascript">
function Person() {
getAge = function () {
console.log(10)
}
return this
}
Person.getAge = function () {
console.log(20)
}
Person.prototype.getAge = function () {
console.log(30)
}
var getAge = function () {
console.log(40)
}
function getAge() {
console.log(50)
}
Person.getAge() // ?
getAge() // ?
Person().getAge() // ?
getAge() // ?
new Person.getAge() // ?
new Person().getAge() // ?
</script>
</body>
</html>
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>12_滴滴1</title>
</head>
<body>
<!--
1. 难度系数: ★★★★★
2. 技术点:
1). 闭包
2). 作用域与作用域链
3). 变量查找
-->
<script type="text/javascript">
function fun(n, o) {
console.log(o)
return {
fun: function (m) {
return fun(m, n)
}
}
}
// 测试一: undefined ? ? ?
var a = fun(0)
a.fun(1)
a.fun(2)
a.fun(3)
// 测试二: undefined ? ? ?
var b = fun(0).fun(1).fun(2).fun(3)
// 测试三: undefined ? ? ?
var c = fun(0).fun(1)
c.fun(2)
c.fun(3)
</script>
</body>
</html>