解释一下原型和原型链
原型:函数都有prototype属性,称为原型,也是称为原型对象
原型可以放一些属性和方法,共享给实例对象使用
原型可以做继承
原型链:对象都有_proto_属性,这个属性指向它的原型对象,原型对象也是个对象,也有 _proto_这个属性,指向原型对象的原型对象,这样一层一层形成的链式结构成为原型链,最顶层找不到就返回 null?
JS的基本数据类型
引用数据类型:Object
基本数据类型:Number、String、Boolean、Null、?Undefined、Symbol(ES6),这些类型可以直接操作保存在变量中的实际值。
面向对象的三要素:?
封装 继承 多态
封装:把一些重复性高的;用得多的属性和方法 放到对象中包裹起来;
继承:原型链继承、构造继承、组合继承
多态:多种状态 传入不同参数 执行不同方法
js如何实现继承?
一.什么是变量提升?
定义:变量提升是当栈内存作用域形成时,JS代码执行前,浏览器会将带有var, function关键字的变量提前进行声明declare(值默认就是 undefined),定义 defined(就是赋值操作),这种预先处理的机制就叫做变量提升机制也叫预定义。
二. 带 var 和不带 var 的区别
全局作用域中不带var声明变量虽然也可以但是建议带上 var声明变量,不带 var 的相当于给window对象设置一个属性罢了。
私有作用域(函数作用域),带 var 的是私有变量。不带 var 的是会向上级作用域查找,如果上级作用域也没有那么就一直找到 window 为止,这个查找过程叫作用域链。
全局作用域中使用 var 申明的变量会映射到 window 下成为属性。
三. 闭包是什么
闭包:就是能够读取外层函数内部变量的函数。
闭包需要满足三个条件:
访问所在作用域;
函数嵌套;
在所在作用域外被调用 。
优点: 可以重复使用变量,并且不会造成变量污染 。
缺点: 会引起内存泄漏
四. 什么是事件冒泡和事件捕获
事件冒泡是指当一个元素触发某个事件时,该事件会从该元素开始向父级元素一直传递,直到传递到 document 对象。而事件捕获则是相反的过程,即从 document 对象开始向下传递,直到传递到触发该事件的元素。DOM 标准规定,首先按照捕获的方式处理事件,然后再按照冒泡的方式处理事件。不过,可以通过 stopPropagation 和 preventDefault 方法来停止事件的传递和默认行为。
五. 什么是异步编程,如何实现异步编程
异步编程是指在程序执行过程中不会阻塞其他代码的执行,而是在后台执行。在 JavaScript 中,异步编程主要通过回调、Promise、async/await 等机制来实现。其中,回调是最早也是最简单的实现方式,但由于回调函数嵌套层级深、错误处理难以维护等问题,推出了 Promise 和 async/await 两种更为高级的异步编程方案。
六. 如何实现数组去重
利用 Set 数据结构去重; 利用对象属性名不能重复的特性去重 ;利用 Array.filter() 方法去重;利用 Array.reduce() 方法去重
七. var、let、const区别
1var存在变量提升,而let、const没有
2let、const有块级作用域,而var没有
3var 在同一块作用域可以重复声明多个相同的变量,后者覆盖前者,let、const重复声明会报错
4let、var声明变量后可以进行改变值,const声明不能修改([对象、数组]的属性和方法可以改变
八. null和undefined的区别
作者在设计js的都是先设计的null
null会被隐式转换成0,很不容易发现错误。
先有null后有undefined,出来undefined是为了填补之前的坑。
具体区别:JavaScript的最初版本是这样区分的:null是一个表示"无"的对象(空对象指针),转为数值时为0;undefined是一个表示"无"的原始值,转为数值时为NaN。
十. Js的事件委托是什么,原理是什么
事件委托就是利用事件冒泡,只指定一个事件处理程序,就可以管理某一类型的所有事件。
原理:事件委托是利用事件的冒泡原理来实现的,何为事件冒泡呢?就是事件从最深的节点开始,然后逐步向上传播事件。
十一.??介绍一下你了解的Promise?
Promise是ES6中的一个内置对象,实际是一个构造函数;Promise 是异步编程的一种解决方案,Promise对象代表一个异步操作,
有三种状态:pending(进行中)、resolved(已成功)和rejected(已失败)。?
十一.?Promise构造函数是同步执行还是异步执行,那么 then 方法呢?
promise构造函数是同步执行的,then方法是异步执行的
1. 什么是作用域
作用域是在运行代码中某些特定部分中变量、函数和对象的可访问性。也就是说,作用域决定了代码区块中变量和其他的可访问性。
ES6之前JavaScript没有块级作用域,只有全局作用域和局部作用域。ES6的到来,为我们提供了块级作用域,可通过命令let和const来体现。
1. 对 SPA 单页面应用的理解,优缺点是什么?