1、请简述var和let的区别?
var是es5中的定义变量的方法,let是es6中定义变量的方法。
var定义的变量存在声明提升,let定义的变量存在暂时性死区。
var定义的变量只有全局作用域和函数作用域、没有局部作用域,let定义的变量存在块级作用域
let不能重复定义,var可以重复定义。
2、请谈谈对变量声明提升和函数提升的理解?
es5使用var定义变量在程序的执行时回优先将定义变量的过程提升到最开始。
使用函数声明定义变量时,函数的声明及变量的赋值都会被提升到最开始。
当变量名和函数名相同时,因为函数声明提升还有赋值的过程,所以,优先于变量提升。
3、内存分为几个区域,各区域存储什么样的数据,特点是什么?
堆内存和栈内存、代码内存
栈内存存储的总大小比较小,存储的数据大小固定,采用后进先出的方式,访问速度快,通常用来存储值类型的数据及(内存空间、指针),执行上下文。
堆内存的存储大小比较大,存储数据大小不固定(树状结构存储),先进后出,访问速度慢。
通常用来存储引用类型(对象类型)的值。
4、函数fn分别使用call、apply、bind改变this指向obj,并传入参数1,2,3
fn.call(obj,1,2,3) fn.apply(obj,[1,2,3]) fn.bind(obj)(1,2,3)
5、什么是闭包。闭包的理解,闭包的优缺点?
广义上,所以的函数都是闭包函数。狭义上说,函数将上级作用域内的数据通过return被返回从出去,供其他作用域访问的过程叫闭包。
优点:封装且回形成单向数据流,有利于大型程序的数据流控制。
缺点:容易造成内存泄漏(内存溢出)
6、请说明this指向问题?
1、全局作用域下,this始终指向window对象
2、函数内部的this,在非严格模式下,this通常指向window对象
3、函数内部的this,在严格模式下,函数没有没有写明哪个对象调用函数,this指向未定义
4、箭头函数中没有this和arguments,与箭头函数当前作用域内的this指向相同
5、call、apply、bind可以改变this指向
6、构造函数中的this 指向new之后的对象
构造函数生成对象时,this指向生成对象的实例。
没有生成前,函数的this没有确定指向。
7、原形链中的this 指向调用它的对象
7、写出class继承的关键代码
class a{
constructor(){}
}
class b extends a{
constructor(){
super();
}
}
8、简述浅拷贝和深拷贝的区别,并说明深浅拷贝各有几种方式?
浅拷贝是只拷贝对象的引用,深拷贝是引用及数据都拷贝。
当对象的值还是对象时,拷贝的过程如果只对第一级深拷贝,之后都是浅拷贝,称为浅拷贝,
对所有级别都进行深拷贝,才叫深拷贝
浅拷贝的方式:[...arr] arr.concat([]) Object.assign({},obj1) {...obj1}
深拷贝的方式:JSON.parse(JSON.Stringify(obj))
递归 代码如下
let target = {};
cloneObj(target, obj)
console.log(target);
console.log(obj.demo == target.demo);
function cloneObj(target, source) {//target 目标对象 obj源对象
// 如何获取对象的所有属性
for (const key in source) {
// console.log(key);
// 获取属性值
// console.log(obj, source[key]);
// 判断属性值是否为基本数据类型
if ((typeof source[key] != 'object') || (source[key] == null)) {
// 处理基本数据类型
// console.log(source[key]);
target[key] = source[key];
} else {
// 处理数组和对象
// 判断是否为数组
if (source[key] instanceof Array) {
// console.log(source[key]);
// 解构赋值
// target[key] = [...source[key]]
// 将属性值对应数组中的元素取出来存在新的数组
let newArr = [...source[key]];
// 将新的数组添加到target中
target[key] = newArr;
} else {
// console.log(source[key]);
let newObj = {};
cloneObj(newObj, source[key]);
target[key] = newObj
}
}
}
}
9、npm中的package.json文件的作用,如何生成
npm init
记录了当前项目的基本信息(项目名称、作者、描述、版本)、所有需要使用的包、script运行快捷方式、browser List信息
10、Nodejs中的模块化,如何导出数据。exports和module.exports的区别
导出数据module.exports exports
导入数据Require
区别 当时module.exports exports指向同一个对象,导出时,以module.exports为准
11、es6模块化如何导出 接收数据
导出export export default
export import {} from ‘’
export default import 变量 from '' import ''
12、Es6模块化和nodejs模块化的区别
es6模块化是异步导入,nodejs模块化是同步导入。
nodejs模块化运行缓存,首次导入时,生成对象,后续导入都指向这一个对象。
es6模块化每个模块导入时都只运行一次,多个模块化导入时,每次导入都运行一下
13、简述express中间件的作用,写出一个空的中间件基本格式
express 的中间件作用是 拦截http请求,做出回应
App.use(function(req,res,next){
next();
}
14、写出加密组件crypto的基本过程
const jiami = crypto.creatHash('sha1');
jiami.update(字符串)
jiami.digest('hex')