js数据类型以及各个类型的区别
- js总共有八种数据类型
undefindnullstringbooleanobjectnumberbigIntsymbol symbole是为了创建独一无二且不可更改的数据类型,为了解决全局变量冲突问题bigInt可以安全的存储和操作较大的整数,即使这个数字超过了number的范围- 分为原始类型和引用类型两种
如何区分数据类型
typeof对原始类型的判断是准确的,对引用类型只能判断出functioninstanceof对引用类型的判断是准确的,对原始类型失败;constractor访问构造函数,判断类型,如果改变了构造函数,那么就不准了。Object.prototype.toString.call()调用了Object原型上toSting 的方法
null 和 undefind 的区别
undefind是声明了但是没有定义,null的意思是给那些可能返回对象的变量做初始化undefind不是保留字,可以是变量名,一般使用void 0获取安全的undefind值- 使用
typeof检测null会返回object类型,历史遗留问题
手写一个instanceof
;
Object.is() 和 ‘==’ ‘===’ 的区别
==如果类型不同,会先进行类型强制转换再比较===类型不同会直接判断为不相等Object.is(n1,n2)功能类似于===只不过NaN === NaN+0 !== -0;
js 的包装类型
js 的基本类型没有属性和方法,为了便于操作基本类型的值,js会在调用基本类型属性和方法时隐式的将基本类型转换为对象;
const 定义的对象的属性值可以修改吗
const 定义保证的是基本类型不能修改,保证引用类型的指针不被修改,但是可以修改指针所指对象的属性
new 操作符做了什么
- 定义一个新对象
- 将构造函数的作用于赋给新对象(
newObj.__proto__ = Function.prototype) - 绑定
this,将构造函数的this指向该对象,也就是给这个对象添加该构造函数的属性和方法 - 返回这个对象
this 的指向问题
()=>{}箭头函数没有属于自己的this,定义的时候捕获上下文的this;function()的this在被调用的时候确定, 谁真实调用了该函数,函数的this就指向谁
使用proxy 实现一个数据劫持
以上便实现了简单的数据响应式,如果是在vue3.x 中,vue 需要在 get 函数中收集以来,在set 函数中派发更新, 使用 Proxy 不需要再循环各个属性
js脚本的延迟加载
defer属性,脚本加载与文档解析同步,文档加载完成后再执行脚本不阻塞页面,多个defer原则上顺序执行,可是实际在浏览器往往不是;async属性,脚本会异步加载,不会阻塞文档渲染,但是当脚本加载完成会立即执行,这时会阻塞页面;多个async执行的顺序不可预测;- 动态的创建
<script>,在文档加载完成后; - 使用
setTimeout定时器延迟; - 把js写在文档的底部,尽可能的最后来执行脚本
说一下 DOM / BOM
DOM (document object module)文档对象模型,把文档转变成js可以操作的对象,定义了处理文档内容的方法和接口BOM (bower object module)浏览器对象模型,把浏览器当作对象处理,也就是window,window担任了双重的角色,既是js 访问浏览器窗口的一个接口,又是一个全局对象,document也是window的一个子对象
说一下ajax 的理解,实现一个ajax
- ajax是通过 js 的异步通信,从服务器获取xml文档中解析出数据,更新到页面的对应部分,而不需要刷新整个页面的技术
- 实现一个 ajax