- 1.JS 有哪些数据类型?
- 2. 基本数据类型和引用数据类型有什么区别?
- 3. 判断数据类型的方法有哪些?
- 4. 与深拷贝有何区别?如何实现?
- 5. let、const 的区别是什么?
- 6. 什么是执行上下文和执行栈?
- 7. 什么是作用域和作用域链?
- 8. 作用域和执行上下文的区别是什么?
- 9. this 指向的各种情况都有什么?
- 10.如何改变 this 指针的指向?
- 11.什么是闭包?
- 12. 什么是原型、原型链?
- 13. 何为防抖和节流?如何实现?
- 14. 如何理解同步和异步?
- 15. JS 是如何实现异步的?
- 16. 什么是 AJAX?如何实现?
- 17. 实现异步的方式有哪些?
- 18. 如何理解 Promise 对象?
- 19.如何理解宏任务,微任务?
- 20. 什么是跨域?如何解决跨域问题?
- 21. 实现继承的方法有哪些?
- 22. DOM 事件模型和事件流?
- 23. EventLoop 事件循环是什么?
- 24. require/import 之间的区别?
1.JS 有哪些数据类型?
根据 JavaScript 中的变量类型传递方式,分为基本数据类型和引用数据类型两大类七种。
基本数据类型包括Undefined、Null、Boolean、Number、String、Symbol(ES6 新增)六种。
引用数据类型只有Object一种,主要包括对象、数组和函数。
判断数据类型采用typeof操作符,有两种语法:
typeof 123;//语法一 const FG = 123; typeof FG;//语法二 typeof(null) //返回 object; null == undefined //返回 true,因为 undefined 派生自 null; null === undefined //返回 false。
2. 基本数据类型和引用数据类型有什么区别?
(1) 两者作为函数的参数进行传递时:
基本数据类型传入的是数据的副本,原数据的更改不会影响传入后的数据。
引用数据类型传入的是数据的引用地址,原数据的更改会影响传入后的数据。
(2) 两者在内存中的存储位置:
基本数据类型存储在栈中。
引用数据类型在栈中存储了指针,该指针指向的数据实体存储在堆中。
3. 判断数据类型的方法有哪些?
(1) 利用typeof可以判断数据的类型;
(2) A instanceof B可以用来判断 A 是否为 B 的实例,但它不能检测null和undefined;
(3) B.constructor == A可以判断 A 是否为 B 的原型,但constructor检测Object与instanceof不一样,还可以处理基本数据类型的检测。
不过函数的 constructor 是不稳定的,这个主要体现在把类的原型进行重写,在重写的过程中很有可能出现把之前的 constructor 给覆盖了,这样检测出来的结果就是不准确的。
(4) Object.prototype.toString.call()
Object.prototype.toString.call() 是最准确最常用的方式。
4. 与深拷贝有何区别?如何实现?
浅拷贝只复制指向某个对象的指针,而不复制对象本身。浅拷贝的实现方式有:
(1) Object.assign():需注意的是目标对象只有一层的时候,是深拷贝;
(2) 扩展运算符;
深拷贝就是在拷贝数据的时候,将数据的所有引用结构都拷贝一份。深拷贝的实现方式有:
(1) 手写遍历递归赋值;
(2)结合使用JSON.parse()和JSON.stringify()方法。
5. let、const 的区别是什么?
var、let、const都是用于声明变量或函数的关键字。其区别在于:

DOM 事件流包括三个阶段事件捕获阶段、处于目标阶段、事件冒泡阶段。
23. EventLoop 事件循环是什么?
js 是一门单线程的需要,它的异步操作都是通过事件循环来完成的。整个事件循环大体由执行栈、消息队列和微任务队列三个部分组成。
同步代码会直接在执行栈中调用执行。
定时器中的回调会在执行栈被清空且定时达成时推入执行栈中执行。
promise、async异步函数的回调会被推入到微任务队列中,当执行栈被清空且异步操作完成时立即执行。
24. require/import 之间的区别?
require是 CommonJS 语法,import是 ES6 语法;require只在后端服务器支持,import在高版本浏览器及 Node 中都可以支持;require引入的是原始导出值的复制,import则是导出值的引用;require时运行时动态加载,import是静态编译;require调用时默认不是严格模式,import则默认调用严格模式.