全网前端面试题汇总(4)JS
1. ES6新特性
(1)let const > https://www.cnblogs.com/hasaki-wang/p/15632298.html
(2)字面量 `${}`
(3)解构 let p = {name:1,val:2}; let {name,val} = p;
(4)引入class calss Student = { name:1,val:2 }; let stu = new Student(); console.log(stu.name);
(5)ES Modules export import
(6)箭头函数 =>{}
(7)函数参数支持设置默认值 fn(name=1){console.log(name)}
(8)延展操作符... Spresd/Rest 将数组或对象展开/合并为对象或数组
(9)对象属性缩写 let name = 1,val = 2; let p = {name,val}
(10)for of
(11)Set数组去重 let arr = [1,2,3,1]; let list = new Set(arr);
(12)新的基本类型Symbol
(13)Promise let fun = new Promise((resolve,reject)=>{resolve(1)}).then(){}.catch(){}
(14)async await async f(){await fun();}
2. 原型、原型链
> https://www.cnblogs.com/hasaki-wang/p/15624104.html
3. JS数据类型
JS基本数据类型
String,Boolean,Number,Object,Null,Undefined,Symbol(ES6),BigInt(Chrome);
引用类型
Object,其中包含Date,Array,Function , Null(空对象引用)
4. 闭包
定义在一个函数内部的函数,这个函数有权访问外部函数作用域内的变量;
function a(){
var i = 1;
function b(){
console.log(i);
}
}
var c = a();
c(); //当函数a内部的函数b被a外的一个变量引用时就创建了一个闭包;i不被回收
c = null; //i被回收
闭包特性:
(1)函数嵌套函数
(2)内部函数可以引用外部函数的参数和变量
(3)参数和变量不会被JS回收机制GC回收(闭包会使变量始终保存在内存中,如果不当使用会增大内存消耗)
JS垃圾回收机制:
(1)对象不再被引用会被回收;
(2)两个互相引用的对象不再被第三者引用会被回收
- JS遍历数组
while , do while,for,for in(会遍历原型链),for of,forEach
几种遍历并做处理的方式:filter、map、reduce、sort
6. new创建对象的过程
fun(){
this.name = 1;
}
let a = new fun();
(1)创建一个内存空间(空对象)let obj = new Object();
(2)将该对象的_proto_指向构造函数的protoType,obj._proto_ = fun.prototype;
(3)将构造函数的this绑定这个新对象,将构造函数的属性和方法挂载在新对象上,obj = this;
(4)返回这个新对象,return obj;
6. 防抖和节流
短时间连续触发的事件,如拖动滚动条输出高度;
防抖:
第一次触发事件时不立即执行函数,而是设置一个时间间隔,此间隔内没有再次触发事件则执行,若有则重新开始计时;
节流:
函数执行一次后在某个事件范围内失效,过了这段时间再次激活;
7. 深拷贝、浅拷贝
JS中,基本数据类型如number、string的值是直接存在栈里的,而一些复杂的数据类型如object、array是在栈中存地址,堆中对应的地址存值;
对于这种数据,在进行拷贝时,例如:
let a = [1,2,3,4];
let b = a;
是将a在栈内存的地址赋值给b,当b的内容发生改变时,a的内容也会随之变化,这种拷贝方式就是浅拷贝;
如果通过某种方式将a的内容赋值给b,当b的内容发生改变时,a的内容不随之变化,这种拷贝方式就是深拷贝;
深拷贝的几种实现方式:
(1)JSON.stringify和JSON.parse
(2)Jquery.extend(true,b,a)
(3)手写递归实现 > https://www.cnblogs.com/hasaki-wang/p/15633154.html
Onject.assign和slice()方法不是深拷贝,只能对第一层的拷贝生效,未考虑第二层,如[1,2,3,{val:4}];
8. AMD、CMD、CommonJS、UMD、ES Modules模块化
AMD:使用requireJS define('./index.js',function(code){});浏览器端
CMD:使用seaJS define(function(require,export,module){var code = require('./index.js')}); 浏览器端
CommonJS:node.js中自带的模块化 var code = require('./index.js');服务端
UMD:兼容AMD和CommonJS语法;跨平台解决方案
ES Modules:ES6中的模块化 import code from './index.js'; 跨平台解决方案

浙公网安备 33010602011771号