1.var、let、const的区别
1. var 可以变量提升,const 、let 不存在变量提升。
(1 )var 代码
console .log (a);
var a = 100 ;
(2 )let 、const 代码
console .log (b);
const /let b = 100 ;
2. var 不存在暂时性死区,const 、let 存在暂时性死区,只有等声明的那一行代码出现,才可以获取该变量的值。例子同上。
3. var 不存在块级作用域,const 、let 存在块级作用域。
(1 )
{
var a = 100 ;
}
console .log (a);
(2 )
{
let /const b = 100 ;
}
console .log (b);
4. var 可以重复生命,const 、let 不允许重复声明。
(1 )
var a = 100 ;
var a = 10 ;
console .log (a);
(2 )
const /let b = 100 ;
const /let b = 1000 ;
console .log (b);
5. var 、let 可以修改变量的值,const 不能改变。
(1 )
var /let a = 100 ;
a = 10 ;
console .log (a);
(2 )
const b = 100 ;
b = 1000 ;
console .log (b);
2. ES6中新增的Set、Map两种数据结构怎么理解?
1. 共同点:集合、字典都可以存储不重复的值。
2. 不同点:集合是以[值,值]的形式存储元素,字典是以[键,值]的形式存储。
3. Set 只有值,元素不可重复且自动排序,Map 是以键值对的方式存储。
4. 例子
(4.1 )
const objSetList =
[
{
id : 1 ,
name : "skam"
},
{
id : 2 ,
name : "skam2"
}
];
const objMapList =
[
['key' , 'value' ],
['任意类型' , { id : 1 , name : "skam" }]
];
const SetList = new Set (objSetList);
const MapList = new Map (objMapList);
console .log (SetList );
console .log (MapList );
3.怎么理解ES6中 Promise的?使用场景有哪些?
1. 是一种异步编程方式,用来解决回调地狱,优点(链式操作减低了编码难度、代码可读性明显增强)
2. 三种状态(peeding、fulfilld、rejected)和种实例方法(then、catch 、finally )
const Promise = function ( ) {
new Promise ((resolve, reject ) => {
axios.get (url,...)
}).then (res => {
console .log (res);
}).catch (err = > {
console .log (err);
}).finally (() => {
console .log ("不管状态如何,我都会执行" )
})
}
Promise ();
3. Promise .all () -> const p = Promise .all ([p1, p2, p3]);
接受一个参数(数组),只有数组中所有都resolve都通过了, p.then ()才会执行,只要有一个reject, 改错误就会执行单个错误请求的
reject, 不会触发Promise .all ()的catch 方法。
4. Promise .race () -> 同上
只要p1、p2、p3之中有一个实例率先改变状态,p的状态就跟着改变,率先改变的 Promise 实例的返回值则传递给p的回调函数。
5. 使用场景?
(5.1 )图片的加载。
(5.2 )图片的请求超时
4.怎么理解ES6中 Generator的?使用场景有哪些?
1. 是一种异步编程解决方案,执行Generator 函数会返回一个遍历器对象,可以依次遍历 Generator 函数内部的每一个状态。
2. 特征:
(2.1 )function 关键字与函数名之间有一个星号
(2.2 )函数体内部使用yield 表达式,定义不同的内部状态
(2.3 )函数执行返回一个generater对象,函数体里面任何代码不会执行。
(2.4 )每次执行next (),遇到yield 就会终止,再次next直到遇到return 为止,把return 后语句返回,如果没有return ,value为 undefnied。
(2.5 )将异步任务同步化
3. 使用
(3.1 )
function * generater (b ){
let a = 100 ;
console .log (a * 1 );
yield console .log (a * 1 );
yield console .log (a * 1 );
return console .log (a * 4 );
}
const y = generater ()
console .log (y);
console .log (y.next ());
console .log (y.next ());
console .log (y.next ());
console .log (y.next ())
(3.2 )
function * foo ( ) {
yield 1 ;
yield 2 ;
yield 3 ;
yield 4 ;
yield 5 ;
return 6 ;
}
for (let v of foo ()) {
console .log (v);
}
4. 使用场景
(4.1 )Generator 是异步解决的一种方案,最大特点则是将异步操作同步化表达出来
function * loadUI ( ) {
showLoadingScreen ();
yield loadUIDataAsynchronously ();
hideLoadingScreen ();
}
var loader = loadUI ();
loader.next ()
loader.next ()
(4.2 )利用Generator 函数,在对象上实现Iterator 接口
function * iterEntries (obj ) {
let keys = Object .keys (obj);
for (let i=0 ; i < keys.length ; i++) {
let key = keys[i];
yield [key, obj[key]];
}
}
let myObj = { foo : 3 , bar : 7 };
for (let [key, value] of iterEntries (myObj)) {
console .log (key, value);
}
5. symbol 有什么用处?应用场景?
1. 新的原始数据类型Symbol ,表示独一无二的值。
2. 细节
let obj = {
[Symbol ("name" )]: "一斤代码" ,
age : 18 ,
title : "Engineer" ,
}
Object .getOwnPropertySymbols (obj);
Reflect .ownKeys (obj);
3. 应用场景
使用了一个他人提供的对象,但又想为这个对象添加新的方法(mixin 模式),新方法的名字就有可能与现有方法产生冲突,那么就使用
Symbol 创建一个独一无二的对象名。
6.箭头函数和普通函数有啥区别?箭头函数能当构造函数吗?
1. 箭头函数与普通函数的区别
(1 )语法更加简洁、清晰
(2 )箭头函数不会创建自己的this
(2.1 )官方解释 箭头函数不会创建自己的this ,所以它没有自己的this ,它只会从自己的作用域链的上一层继承this 。
(2.2 )箭头函数中this 的指向在它被定义的时候就已经确定了,之后永远不会改变
(3 )箭头函数继承而来的this 指向永远不变
(4 ).call ()/.apply ()/.bind ()无法改变箭头函数中this 的指向
(5 )箭头函数没有自己的arguments
(6 )箭头函数没有原型prototype
(7 )箭头函数不能用作Generator 函数,不能使用yeild关键字
2. 箭头函数能当构造函数吗?
构造函数的new 都做了些什么?
(1 )JS 内部首先会先生成一个对象
(2 )再把函数中的this 指向该对象
(3 )然后执行构造函数中的语句
(4 )最终返回该对象实例
因为箭头函数没有自己的this ,它的this 其实是继承了外层执行环境中的this ,且this 指向永远不会随在哪里调用、被谁调用而改变,所 以箭头函数不能作为构造函数使用,或者说构造函数不能定义成箭头函数,否则用new 调用时会报错!
7.common.js和es6中模块引入的区别?
1. CommonJS 模块输出的是一个值的拷贝 <--> ES6 模块输出的是值的引用
2. CommonJS 模块是运行时加载 <--> ES6 模块是编译时输出接口
3. CommonJs 是单个值导出 <--> ES6 Module 可以导出多个
4. CommonJs 是动态语法可以写在判断里 <--> ES6 Module 静态语法只能写在顶层
5. CommonJs 的this 是当前模块 <--> ES6 Module 的this 是undefined
6. CommonJS 模块的require ()是同步加载模块 <--> ES6 模块的import 命令是异步加载,有一个独立的模块依赖的解析阶段
8.谈谈 Object.defineProperty 与 Proxy 的区别
1. Object .defineProperty (obj, prop, descriptor)
(1.1 ) 不能监听数组的变化 Vue2 .x 中解决数组监听的方法是将能够改变原数组的方法进行重写实现(比如:push、 pop、shift、 unshift、splice、sort、reverse)
(1.2 ) 必须遍历对象的每个属性 --> 通过 Object .keys () 来实现
(1.3 ) 必须深层遍历嵌套的对象 --> 通过递归深层遍历嵌套对象,然后通过 Object .keys () 来实现对每个属性的劫持
2. Proxy
(2.1 ) Proxy 针对的整个对象,Object .defineProperty 针对单个属性,这就解决了 需要对对象进行深度递归(支持嵌套的复杂对象 劫持)实现对每个属性劫持的问题
(2.2 ) Proxy 解决了 Object .defineProperty 无法劫持数组的问题
(2.3 ) 比 Object .defineProperty 有更多的拦截方法,对比一些新的浏览器,可能会对 Proxy 针正对性的优化,有助于性能提升
9. object.assign和扩展运算法是深拷贝还是浅拷贝,两者区别是什么?
1. 都是浅拷贝。
2. 区别
(2.1 )Object .assign ()方法接收的第一个参数作为目标对象,后面的所有参数作为源对象。然后把所有的源对象合并到目标对象中。它 会修改了一个对象,因此会触发 ES6 setter。
(2.2 )扩展操作符(…)使用它时,数组或对象中的每一个值都会被拷贝到一个新的数组或对象中。它不复制继承的属性或类的属性,但是 它会复制ES6 的 symbols 属性
10. ES6有哪些新特性?
1. 解决原有语法上的一些不足
比如let 和 const 的块级作用域
2. 对原有语法进行增强
比如解构赋值、展开运算符(...)、参数默认值、模板字符串(`` )
3. 全新的对象、全新的方法、全新的功能
比如promise、proxy、object的assign、is
4. 全新的数据类型和数据结构
比如symbol、set、map
11. 说说对 ES6 中rest参数的理解
1. 什么是rest参数 --> function fn (...rest ) {}
2. 举例
function fn (...rest ) {
console .log (rest)
console .log (...rest)
console .log (rest.length )
}
fn (1 , 2 , 3 , 4 )
3. rest 参数之后不能再有其他参数(即只能是最后一个参数),否则会报错。
function fn2 (...rest, a ) {}
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· DeepSeek 开源周回顾「GitHub 热点速览」
· 物流快递公司核心技术能力-地址解析分单基础技术分享
· .NET 10首个预览版发布:重大改进与新特性概览!
· AI与.NET技术实操系列(二):开始使用ML.NET
· 单线程的Redis速度为什么快?