问题汇总:
var、let、const区别(延伸:变量提升、函数提升)
let、const是ES6新增的命令,用于声明变量;
let、const只在块级作用域生效,var声明变量是全局的;
var存在变量提升,let、const不存在变量提升;romis
var可以重复声明,let、const在同一块作用域内不能重复声明;
let、const的区别:const不能更改存放在栈区里的基本数据类型和引用数据类型的指针,声明后不能再更改。
存在暂时性死区
for、forEach 、for...in、for...of 循环的区别
相同点:都可以遍历数组;
区别:
for:缺点:不能直接遍历对象。
forEach():缺点:不能直接遍历对象,循环不能跳出。
for...in:优点:可以直接遍历对象,循环原型链的所有对象,缺点:消耗性能;保存的是键名,返回序列号 0 1 2 3
for...of【最优】:可遍历array,object,string,map,set等,可以跳出循环;保存的是键值,返回 arr1 arr2 arr3
缺点:不适用于处理原有的原生对象。
解决for、forEach、for...of不能直接遍历对象的问题:将对象转为数组;
参考:https://www.cnblogs.com/goule/p/13630915.html
ES5和ES6的区别:
ECMAScript 是 JS 的核心,ES6 相对于 ES5 在向下兼容的基础上提供大量新特性,如:
块级作用域
关键字 let, 常量 const、
箭头函数
promise
this指向问题
类Class
对象字面量的属性赋值简写、
字符串模板、
Iterators(迭代器)、
Modules、
Proxies、
Map+Set+WeakMap+WeakSet 四种集合类型、
ES6文档:https://es6.ruanyifeng.com/#docs/let
ES版本更新:https://www.jianshu.com/p/824f255c2dd8
数据类型检测
typeof:检测基本数据类型,返回结果是字符串 typeof string
* 缺点:不能细分对象,不能区别数组和对象 * 原理:所存的值在内存都是按二进制储存
instanceof:检测是否是某个类的实例 arr instanceof Array
constructor:检测构造函数 arr.constructor === Array
Object.prototype.toString.call:检测数据类型是数组,对象,函数
Object.prototype.toString.call(obj)
Array.isArray:检测数组Array.isArray(arr)
如何区分是数组还是对象
Array.isArray():ES6语法
constructor:
Object.prototype.toString.call():
Object.prototype的toString():
基于Object.prototype.isPrototypeOf()
基于getPrototypeOf()
https://www.cnblogs.com/woniubushinide/p/11231646.html
axios ajax fetch区别
axios是一种对ajax的封装,fetch是一种浏览器原生实现的请求方式,跟ajax对等
ajax:是对原生XHR的封装,增添了对JSONP的支持
* var ajax = new xmlHttpRequest * ajax.readystatus === 2
fetch:ES6版本的ajax,基于标准 Promise 实现,支持 async/await。
Axios:是基于原生XHR, Promise封装、用于浏览器和 node.js 的HTTP客户端;
Axios:支持 http拦截器
创建对象的方法
通过字面量创建
通过object方式创建
使用工厂模式创建对象
使用构造函数模式创建对象
使用原型模式创建对象
https://m.html.cn/qa/javascript/11183.html
变量提升的题
变量提升:带var会提前声明
函数提升:(旧版IE10及以下)带function会提前声明和定义
(新版)块级作用域会提前声明,不定义
函数声明会优先被提升
https://blog.csdn.net/qq_35895679/article/details/105904369
OOP面向对象编程
解释:面向对象的编程方法OOP是九十年代才流行的一种软件编程方法。它强调对象的“抽象”、“封装”、“继承”、“多态”。我们讲程序设计是由“数据结构”+“算法”组成的。从宏观的角度讲,OOP下的对象是以编程为中心的,是面向程序的对象。
三大特点:封装 继承 多态
* 封装:指能够把一个实体的信息、功能、响应都装入一个单独的对象中的特性。 * 继承:优点:继承的方法允许在不改动原程序的基础上对其进行扩充,这样使得原功能得以保存,而新功能也得以扩展。这有利于减少重复编码,提高软件的开发效率。
对象的产生有两种基本方式:
* 一种是以原型(prototype)对象为基础产生新的对象。 * 一种是以类(class)为基础产生新对象。
类(class):
* 1) 私有成员(private):缺省情况下,一个类中的所有成员都是私有的。私有成员只能被类本身的成员函数访问。能够被继承但是被继承的私有成员不能够使用。 * 2) 公有成员(public):公有成员可以被类成员函数和外部函数使用。 * 3) 保护成员(protected):类的保护成员能被类及其派生类的成员函数和友元函数使用,具有继承性。
类(Class)用来描述具有相同的属性和方法的对象的集合。它定义了该集合中每个对象所共有的属性和方法。对象是类的实例。
https://www.jianshu.com/p/b2dcf206cf87
ES5如何继承
原型链继承
借用构造函数继承
组合式继承
原型式继承
寄生式继承
寄生组合式继承
https://www.jianshu.com/p/c6f36b3a5408
ES6 class(类)
通过class关键字,可以定义类。
ES6 的类,可以看作构造函数的另一种写法。类的数据类型就是函数,类本身就指向构造函数。
类必须使用new调用,否则会报错。这是它跟普通构造函数的一个主要区别,后者不用new也可以执行。
类的内部所有定义的方法,都是不可枚举的(non-enumerable)。
https://es6.ruanyifeng.com/#docs/class
作用域,闭包,原型链
说一下三者的概念
作用域:ES5全局作用域,函数作用域,ES6块级作用域
闭包:指的是能够访问另一个函数作用域的变量的函数。
原型链:构造函数,原型prototype,constructor组成
原型链有什么用处
怎么实现原型链继承
ES5: User.call(this, )改变this指向。
ES6: class extends
你项目中什么地方用到了闭包?为什么要用闭包?闭包的原理是什么?
es6
项目中有用到哪些es6的特性
(他重点想让你说出箭头函数和promise,毫无疑问他还准备了this相关的问题)
箭头函数,
promise
let,const,
class extends
模块化
说下es5和es6箭头函数中this的指向
es5 this指向执行的上下文,apply、call、bind可以改变this指向。
es6箭头函数:this始终指向函数声明时所在作用域的this的值。
有哪些办法可以改变this
apply、call、bind可以改变this指向。
使用 ES6 的箭头函数。
promise怎么使用?它解决了什么问题?
Promise 是异步编程的一种解决方案,比传统的异步解决方案【回调函数】和【事件】更合理、更强大。
promise.then
Promise.all
怎么中断promise?
(可以返回一个空的promise,既无resolve也没有reject)
CommonJS 输出一组变量
exports require
[object Object]
调用Object.prototype的toString()方法,返回数据类型是Object;
关于this:
关于this: https://zhuanlan.zhihu.com/p/23804247
this指向
普通函数的this是调用的地方
箭头函数的this是声明的地方
call apply bind ,改变this指向
call、apply、bind这三个方法其实都是继承自Function.prototype中的,属于实例方法;
call、apply、bind的作用是改变函数运行时this的指向;
call()可以将实参在对象之后依次传递,apply()需要将实参封装到一个数组中统一传递
bind返回对应函数, 便于稍后调用; apply, call则是立即调用。
在 ES6 的箭头函数下, call 和 apply 将失效
this、super
Object.setPrototypeOf
指定一个对象的原型:Object.setPrototypeOf(obj, prototype)
this、global、globalThis
在浏览器中,可以在程序的顶层使用this关键字来引用全局对象
在Node.js中,可以使用global关键字访问全局对象
- globalThis旨在通过定义一个标准的全局属性来整合日益分散的访问全局对象的方法
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用
。你还可以使用@
来通知其他用户。