js数据类型 基本数据类型:null、number、string、undefined、boolean 引用数据:array、object 区别: 基本数据类型保存在栈空间,空间大小一定 引用数据类型保存在堆空间,大小不定,然后将堆空间的地址指针存放在栈空间,变量里存放的是引用地址
数据类型检测的方式
typeof 只能检测基本数据类型,无法检测引用数据类型 instanceof 用于检测对象是否为某个对象的实例,无法检测基本数据类型 constrator 用于检测对象是否为某个构造函数的原型 Object.toString.call() 用于检测数据类型,通用型
null和undefined的区别
null和undefined都是表示当前没有值 null其实是对象的空引用,常用来对象初始化的占位 undefined常用来初始化变量但未赋值
如何安全的获取undefined的值
undefined不是保留字符,所以可以用来当变量名,可以通过void 0 来获取安全值
Object.is() 与比较操作符 == 和 === 的区别
===和== 操作符用来判断左右两边的数值是否相等,但是== 操作符会进行隐式类型转换,但=== 不会,且NaN都不会相等,但-0等于+0 Object.is经过处理,可以用于判断NaN相等,且-0不等于+0
js中的包装类型
定义基本数据类型时,会被隐式的进行类型包装,变成对象,所以string数据有length等属性
为什么又BigInt提案
因为当前的js有最大值和最小值,若超过这个值,精度会不准
怎么判断一个对象为空对象
JSON.stringfiy({})==='{}' Object.keys().length ===0
const对象属性可以修改吗
基本数据类型不行,但引用数据类型可以改变内部的值,即不能修改指针地址
new 一个箭头函数会怎样
- 首先会创建一个空对象
- 其次将this的指针指向这个对象
- 将构造函数的原型对象的引用地址拷贝一份到对象的__proto__上
- 之后向这个对象添加属性
- 返回新对象
箭头函数的this指向
箭头函数没有自己的this,他的this指向当前定义的上下文
proxy
对JSON理解
js脚本延迟加载的方式
- 使用defer进行异步加载,但脚本下载完毕后不会立即执行,而是等待html解析完毕后执行,多个defer会按顺序执行
- 使用async进行异步加载,但脚本下载完毕后阻塞html解析,等到js解析执行完毕后,才继续html解析,多个async执行顺序不定,谁先下载完毕先执行谁
- 通过js动态创建script标签
- 将js的script标签放在最后
- 定时器延迟加载js脚本
什么是DOM和BOM
DOM是文档对象模型,主要用于操作dom元素的,document对象 BOM是浏览器对象模型,主要用于浏览器交互,window,且document为window的一个属性
ajax理解,实现一个ajax
什么是尾调用,有什么好处
尾调用指在函数执行完毕时又调用了另一个函数 好处:优化后的尾调用,会销毁当前函数的上下文,即节省了内存消耗,但存在支持兼容
es6模块和commonjs模块的异同
es6模块采用export export default和import来实现变量、函数导出导入 commonjs采用module.exports 和require来实现 es6是对模块的引用,commonjs是对模块的浅拷贝 es6暴露的变量类似于const定义的变量,不能更改地址 commonjs可以修改
for..in和for..of的区别
forin是es3的方法,用于遍历对象,但会遍历对象的原型 forof是es6的方法,可以用于遍历iteator对象/数组,只遍历当前对象,不遍历原型
对原型、原型链的理解
通过构造函数创建对象时,实例对象会自动关联到构造函数的.prototype对象,这个对象成为构造函数的原型,原型实质是一个对象,所以也可以当成一个构造函数的实例,故此他也有个__proto__关联到另一个原型。
当我们使用对象的一个属性时,会先在对象自身上查找是否有这个对象,若没有,则沿着原型链依次往上找,直到找到原型为null时,则表示这个对象没有这个属性
对作用域、作用域链的理解
js代码的执行是在渲染主线程的执行栈中执行,当运行js代码时,会创建一个执行栈,这个栈采用先进后出原则,首先创建一个全局上下文进行压栈,