前端面试之前端基础小结

js 基本数据类型

undefined,null,boolean,number,string

ES2015 新增 symbol

js 有几种类型的值

栈:原始数据类型(基本数据类型)

堆:引用数据类型(对象,数组,函数)

两种类型的区别:存储的位置不同

js 内置对象

数据封装对象:object,array,boolean,number,string

其他对象:Function,Arguments,Math,Date,RegExp,Error

原型链

是一种基于proto向上查找的机制,当我们操作实例的某个属性或者方法的时候,首先找到自己空间中私有的属性或者方法

1.找到了,则结束查找,使用自己的私有即可

2.没有找到,则基于proto找所属类的 prototype,如果找到了就用这个公有的,如果没找到,基于原型上的proto继续向上查找,一直找到 Object.prototype 的原型为止,如果还是没有,操作的属性或者方法不存在。原型链详解

JavaScript 的继承

构造继承

(借助 call 或者 apply 把父类中的函数通过 this 指复制到子类创建的实例中)

1
function Parent(){

JavaScript 中的 call、apply、bind

参考:Call,apply,bind 最清晰的讲解

JavaScript 中的 call、apply、bind 深入理解

GET 和 POST

HTTP 协议 未规定 GET 和 POST 的长度限制

GET 的最大长度显示是因为 浏览器和 web 服务器限制了 URI 的长度

get 请求类似于查找的过程,用户获取数据,可以不用每次都与数据库连接,所以可以使用缓存。

post 不同,post 做的一般是修改和删除的工作,所以必须与数据库交互,所以不能使用缓存。因此 get 请求适合于请求缓存。

模块化

commonjs 不适用于浏览器环境,require 操作是同步的,模块放在服务器端,网速慢要等很久,module.exports 暴露,require 引入,NODE 自带的模块化

1
var fs = require('fs');

AMD 则是异步加载,require.js,依赖前置,提前执行。但是代码阅读和书写困难,依赖必须提前声明好。

1
2
3
define('./index.js',function(code){
// code 就是index.js 返回的内容
})

cmd 用于浏览器,加载是异步的,sea.js,依赖就近,延迟执行,支持动态引入依赖文件。但依赖 spm 打包,模块加载逻辑偏重

1
2
3
define(function(require, exports, module) {
var indexCode = require('./index.js');
})

ES Modules:ES6 引入的模块化,支持 import 来引入另一个 js。思想是尽量静态化,使得编译时就能确定模块依赖关系

1
import a from 'a';

commonjs 输出的是值的拷贝 只会在运行时加载一次 es6 动态引用,不会缓存值。js 引擎对脚本静态分析的时候,遇到 import 会生成一个只读引用,脚本真正执行的时候,到被加载那个模块里面去取值

创建实例

  • 字面量
  • Object 对象
  • 工厂模式
  • 构造函数

Q:写 React / Vue 项目时为什么要在列表组件中写 key,其作用是什么?

A:https://github.com/Advanced-Frontend/Daily-Interview-Question/issues/1#issuecomment-465847432 A:https://github.com/Advanced-Frontend/Daily-Interview-Question/issues/1#issue-401165995

深拷贝浅拷贝

参考 1

参考 2sf.gg

Question 1

1
2
3
4
5
6
7
8
9
10
let obj = { a: 0 };
function fun(obj) {
obj.a = 1;
obj = { a: 2 };
obj.b = 3;
console.log(obj);
}
let object = {};
fun(object);
console.log(object);

一开始,obj 和 object 都是 undefined,很好理解

第一行运行完:

第 8 行运行完,object 也变成 Object{}

当进入到 fun 函数中,object 变成不可用:

最后是:

我的理解是:刚开始 obj 也指向 object 指向的那个对象,然后 obj.a 把那个对象增加了个属性 a,然后 obj 指向了另一个对象{a:2},后面的 b 就加不到 object 指向的那个对象里了。

Donate
  • Copyright: Copyright is owned by the author. For commercial reprints, please contact the author for authorization. For non-commercial reprints, please indicate the source.
  • Copyrights © 2018-2020 Jee
  • Visitors: | Views:

如果您觉得此文章帮助到了您,请作者喝杯咖啡吧~

支付宝
微信