问题汇总:
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
10.23-ES6~ES11
你我的项目中什么中央用到了闭包?为什么要用闭包?闭包的原理是什么?
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旨在通过定义一个规范的全局属性来整合日益扩散的拜访全局对象的办法