javaScript 那些事

199 阅读3分钟

js数据类型以及各个类型的区别

  1. js总共有八种数据类型undefind null string boolean object number bigInt symbol
  2. symbole是为了创建独一无二不可更改的数据类型,为了解决全局变量冲突问题
  3. bigInt可以安全的存储和操作较大的整数,即使这个数字超过了number的范围
  4. 分为原始类型引用类型两种

如何区分数据类型

  1. typeof 对原始类型的判断是准确的,对引用类型只能判断出function
  2. instanceof 对引用类型的判断是准确的,对原始类型失败;
  3. constractor 访问构造函数,判断类型,如果改变了构造函数,那么就不准了。
  4. Object.prototype.toString.call()调用了Object原型上toSting 的方法

null 和 undefind 的区别

  1. undefind是声明了但是没有定义,null 的意思是给那些可能返回对象的变量做初始化
  2. undefind不是保留字,可以是变量名,一般使用void 0获取安全的undefind
  3. 使用typeof 检测 null 会返回 object 类型,历史遗留问题

手写一个instanceof

;

Object.is() 和 ‘==’ ‘===’ 的区别

  1. == 如果类型不同,会先进行类型强制转换再比较
  2. === 类型不同会直接判断为不相等
  3. Object.is(n1,n2)功能类似于===只不过NaN === NaN +0 !== -0;

js 的包装类型

js 的基本类型没有属性和方法,为了便于操作基本类型的值,js会在调用基本类型属性和方法时隐式的将基本类型转换为对象;

const 定义的对象的属性值可以修改吗

const 定义保证的是基本类型不能修改,保证引用类型的指针不被修改,但是可以修改指针所指对象的属性

new 操作符做了什么

  1. 定义一个新对象
  2. 将构造函数的作用于赋给新对象(newObj.__proto__ = Function.prototype
  3. 绑定this,将构造函数的this指向该对象,也就是给这个对象添加该构造函数的属性和方法
  4. 返回这个对象

this 的指向问题

  1. ()=>{}箭头函数没有属于自己的this,定义的时候捕获上下文的this;
  2. function() 的this在被调用的时候确定, 谁真实调用了该函数,函数的this就指向谁

使用proxy 实现一个数据劫持

以上便实现了简单的数据响应式,如果是在vue3.x 中,vue 需要在 get 函数中收集以来,在set 函数中派发更新, 使用 Proxy 不需要再循环各个属性

js脚本的延迟加载

  1. defer 属性,脚本加载与文档解析同步,文档加载完成后再执行脚本不阻塞页面,多个defer原则上顺序执行,可是实际在浏览器往往不是;
  2. async 属性,脚本会异步加载,不会阻塞文档渲染,但是当脚本加载完成会立即执行,这时会阻塞页面;多个async执行的顺序不可预测;
  3. 动态的创建<script>,在文档加载完成后;
  4. 使用setTimeout定时器延迟;
  5. 把js写在文档的底部,尽可能的最后来执行脚本

说一下 DOM / BOM

  1. DOM (document object module) 文档对象模型,把文档转变成js可以操作的对象,定义了处理文档内容的方法和接口
  2. BOM (bower object module) 浏览器对象模型,把浏览器当作对象处理,也就是windowwindow担任了双重的角色,既是js 访问浏览器窗口的一个接口,又是一个全局对象,document也是window的一个子对象

说一下ajax 的理解,实现一个ajax

  1. ajax是通过 js 的异步通信,从服务器获取xml文档中解析出数据,更新到页面的对应部分,而不需要刷新整个页面的技术
  2. 实现一个 ajax