javaScripit的数据类型
基本数据类型:number、bigint、string、null、undefined、boolean、symbol
引用数据类型:array、object、function 本质上都是object
js的引用数据类型和基本数据类型的区别
1.存储位置不同
基本数据类型:直接存储在栈(stack)中的简单数据段
引用数据类型:以 地址:数据 的映射关系来进行存储,地址存放在栈内存中。数据实体存放在堆内存中。
什么是栈?什么是堆?
栈是一种线性数据结构,遵循先进后出的原则,用于存储简单数据结构。
堆是一种用于动态内存分配的数据结构,用于存储复杂的数据结构和对象。
js如何判断数据类型?
1.typeof
typeof主要用来检测一个变量是不是基本数据类型(null除外, typeof null的结果是object)
如果用typeof检测引用数据类型基本判断的都是object,typeof function判断的结果是function。
2.instanceof:通过查找原型链来检测某个变量是否为某个类型数据的实例
1 | const a = [0, 1, 2]; |
3.Object.prototype.toString.call()方法来揭示类型
每种引用类型都会直接或间接继承自Object类型,因此它们都包含toString()函数。不同数据类型的toString()类型返回值是不一样的,所以通过toString()函数可以准确判断值的类型。
Es6新增的语法
- 1.模版字符串
- 2.解构赋值
- 3.let和const
- 4.默认参数
- 5.扩展运算符
- 6.类(class)
- 7.模块化 (export关键字导出模块,import关键字导入模块)
- 8.promise
- 9.Generator
- 10.箭头函数
- 11.for of
let、const、var的区别
- 1.var声明的变量存在变量提升,let和const没有(在声明前使用会报错)
- 2.var声明的变量可以多次声明,后面声明的会覆盖前面的,let和const不允许在相同作用域重复声明
- 3.let和const是块级作用域(只要块级作用域内存在let命令,这个区域不受外包影响),var是受外部影响的。
- 4.var和let可以修改声明的变量,const不行,但对于引用数据类型,可以修改其里面的属性值,内存地址是无法修改的
箭头函数this指向
1.所有函数在执行时,会创建一个函数执行上下文,普通函数的执行上下文中会有一个变量this,而箭头函数不会创建自己的this对象只会继承在自己作用域的上一层的this
2.箭头函数没有自己的this,所以箭头函数中的this的指向在它定义时就已经确定了,之后不会改变。
数组常用方法
1 | arr.push() 向数组末尾添加 |
数组迭代方法
1 | arr.forEach() 遍历数组,每次循环中执行传入的回调函数 |
字符串的方法
1 | str.concat(str2,str3) 连接字符串 |
对象常用的实例方法
1 | Object.create(pro,obj) : 创建一个对象 |
object.defineProperty和Proxy都是怎么实现数据代理的
Object.defineProperty()方法可以用来定义一个对象的属性,并为其设置一个getter或setter函数。当访问或修改该属性时,会自动调用这些函数。通过这种方式,可以实现对数据的读取和修改进行控制。
Proxy对象可以用来创建一个代理对象,该代理对象会拦截对原始对象的读取和修改操作,并将其转发到原始对象上。通过这种方式,可以实现对数据的读取和修改进行控制。
怎么理解promise的
promise是异步编程的一种解决方案
promise仅有三种状态:pending(进行中)、rejected(失败)、fulfilled(成功)
promise的使用:
1 | promise |
promise.all()
Promise.all()
方法用于将多个 Promise
实例,包装成一个新的 Promise
实例
实例p
的状态由p1
、p2
决定,分为两种:
- 只有
p1
、p2
的状态都变成fulfilled
,p
的状态才会变成fulfilled
,此时p1
、p2
、p3
的返回值组成一个数组,传递给p
的回调函数 - 只要
p1
、p2
之中有一个被rejected
,p
的状态就变成rejected
,此时第一个被reject
的实例的返回值,会传递给p
的回调函数
注意,如果作为参数的 Promise
实例,自己定义了catch
方法,那么它一旦被rejected
,并不会触发Promise.all()
的catch
方法
1 | const p1 = new Promise((resolve, reject) => { |
promise.race()
promise.race()方法同样是将多个promise实例,包装成一个新的promise实例,只要其中一个实例状态变化就跟着改变,例如设置图片超时时间
1 | //请求某个图片资源 |
bind()、call()和apply()
- 三者都可以改变函数的
this
对象指向 - 三者第一个参数都是
this
要指向的对象,如果如果没有这个参数或参数为undefined
或null
,则默认指向全局window
- 三者都可以传参,但是
apply
是数组,而call
是参数列表,且apply
和call
是一次性传入参数,而bind
可以分为多次传入 bind
是返回绑定this之后的函数,apply
、call
则是立即执行
事件循环
js里的所有任务都可以分为同步任务和异步任务,同步任务一般会直接进入主执行栈中,异步任务则是进入一个任务队列中,当主线程里的同步任务执行完了,会去任务队列里读取异步任务推入主线程执行。异步任务队列不只有一个,分为宏任务和微任务,当主线程来读取异步任务队列时,会先将所有微任务依次执行完,再去执行宏任务,期间有其他任务进入也是按上面规则,如此循环形成事件循环
常见的微任务:promise.then(),promise.catch(),process.nextTick
常见的宏任务:setTimeOut等定时器事件、postMessage
原型和原型链
原型:每个函数都有一个特殊的属性叫做原型prototype,该原型prototype有一个自有属性construct,这个属性指向该函数。还有一个_proto_属性,该属性指向的是构造函数的原型。
原型链:当在实例化的对象中访问一个属性时,首先会在该对象内部(自身属性)寻找,如找不到,则会向其__proto__指向的原型中寻找,如仍找不到,则继续向原型中__proto__指向的上级原型中寻找,直至找到或Object.prototype.__proto__为止(值为null),这种链状过程即为原型链。
js中如何实现继承的
js中常见的继承方式:
原型链继承、构造函数继承(call)、组合继承、原型式继承(Object.creat()实现的是浅拷贝)、寄生组合继承
e56中extends
的语法糖和寄生组合继承的方式基本类似