web前端面试第三天(20220114)

线下面试,没有录音,真糟糕。内容忘光光。

html 就不说了 ,聊聊 js,厚礼蟹

1、for 和 forEach 的区别?

1.for循环可以使用break跳出循环,但forEach不能。

2.for循环可以控制循环起点(i初始化的数字决定循环的起点),forEach只能默认从索引0开始。

3.for循环过程中支持修改索引(修改 i),但forEach做不到(底层控制index自增,我们无法左右它)

2、promise 状态

有三种状态
Pending(进行中,初始状态,既不是成功,也不是失败状态。)
Resolved(已完成,又称 Fulfilled)、Rejected(已失败)

这三种状态的变化途径只有2种:
异步操作从 未完成 pending => 已完成 resolved
异步操作从 未完成 pending => 失败 rejected
状态一旦改变,就无法再次改变状态,这也是它名字 promise-承诺 的由来,一个promise对象只能改变一次

3、闭包问题

形成条件:两个函数嵌套使用,内部函数引用外部函数的变量或者变量

作用:可以读取函数内部的变量,可以让这些变量始终保持在内存中

闭包和回调地狱没有关系

回调地狱是指异步问题

4、原型链问题

原型 prototype

我们所创建的每一个函数,解析器都会向函数中添加一个prototype
这个属性对应着一个对象,这个对象就是所谓的原型对象

当函数以构造函数的形式调用时,他所创建的对象中都有一个隐含的属性
指向该构造函数的原型对象,可以通过_proto_来访问该属性

原型对象就相当于一个公共区域,所以同一个类的实例都可以访问到这个原型对象
我们可以将对象*有的内容,统一设置到原型对象中
但我们访问对象的一个属性或者方法时,他会现在自身寻找,有则使用
若无,则到原型中寻找使用

5、作用域

作用域链

一般情况下,变量取值到 创建 这个变量 的函数的作用域中取值。

但是如果在当前作用域中没有查到值,就会向上级作用域去查,直到查到全局作用域,这么一个查找过程形成的链条就叫做作用域链

6、变量提升

function test () {
    console.log(a);  //undefined
    var a = 123; 
};

如果没在下面定义a ,控制台则输出 a is no defind。

function a(){} 为函数声明,也会提升

var b = function () {} 为函数表达式

7、拷贝问题

深拷贝和浅拷贝

1、浅拷贝是b复制的是a的引用地址,当b或a改变时,a或b也会发生改变。

方法一、Object.assign方法   方法二、直接用=赋值

Object.assign 方法
var obj = {
    a: 1,
    b: 2
}
var obj1 = Object.assign(obj);
obj1.a = 3;
console.log(obj.a) // 3
= 赋值法

let a=[0,1,2,3,4],
    b=a;
console.log(a===b);
a[0]=1;
console.log(a,b);

2、深拷贝是开辟出一个新的地址b来存放和a地址一样的数据。

通过JSON对象来实现深拷贝

function deepClone2(obj) {
    var _obj = JSON.stringify(obj),
    objClone = JSON.parse(_obj);
    return objClone;
}

8、数据类型

undefined(未定义) null(空值) string(字符串) boolean(布尔) number(数字) symbol(ES6,用来定义对象的唯一属性名) bigint(比较大的整数)

9、var let const 区别

1)块级作用域:let 和 const 存在块级作用域,var不存在

2)变量提升:var 存在变量提升,let和const不存在,即只能在声明后使用,否则会报错

3)给全局添加属性:var 声明的变量为全局变量,并且将该变量添加为全局对象的属性,let 和 const 不会

4)重复声明:var定义的变量可以重复声明,let和const不可

上一篇:返回值类型是数组的操作


下一篇:Linux下利用Docker搭建MYSQL5.7