客户端|金三银四难道可以不知道这些?( 二 )

instanceof无法判断基本数据类型
答:instanceof的判断一个对象是否在其原型链原型构造函数的属性 , 基本数据类型是没有原型链的 , 所以不能正确的判断 。 正因为instanceof的判断机制 , 所以使用instanceof判断引用数据类型才有意义
constructor 方式可以判断JS的基本数据类型和引用数据类型 , 但是有一个致命的缺陷 , 使用constructor判断null或者undefined 会导致代码报错 , 会直接导致代码无法执行 。
Object.prototype.toString.call() 方式使用对象上的原型方法(toString())方法进行数据类型判断 , 可以正确的判断基本数据类型和引用数据类型 。
null 和 undefined 的区别undefined的含义是未定义 , 通常用于基本数据类型的初始值
null的含义是空对象 , 通常用于object的初始值
浮点数精度问题 , 你有遇到过吗?是如何解决的?浮点数精度问题是由于计算机是通过二进制的方式储存数据的 , 对于JS来说 , 是变量初始十进制 , 再转化为二进制 , 再进行加减乘数预算 , 最后再转化为十进制 。 对于二进制来说 , 部分整数其实是无限不循环小数 , 所以就会导致浮点数精度问题的出现 。
解决方式

  • toFixed() 方式
  • 引入成熟的第三方库:big.js
== 与 === 有什么区别?== 把比较的两个值转换成相同的数据类型 , 在进行比较值 。
=== 对比较的两个值 进行类型和值得校验 。 校验相对来说更严谨
let const var 有什么区别
  • 块级作用域:let const 具有块级作用域 。 var不具有块级作用域
  • 变量提升: var 具有变量提升的特性 , 可以先使用后声明 , const let 不具有变量提升的特性
  • 重复声明:var可以重复声明一个变量 , 后声明的会覆盖之前声明的变量 。
  • 初始值 var let 声明的变量可以不具备初始值 , 但是const声明的变量必须具备初始值
  • 暂时性死区 一个变量被声明之前是不可以使用的 , 在语法上被称为暂时性死区 , 但是var是可以的
new 一个函数 , 都会发生什么
  • 创建对象
  • 使该新对象的prototype指向构造函数的prototype
  • 改变创建对象的this指向
  • 如果构造函数返回一个对象 , 则返回该对象 , 否则返回新创建的对象
箭头函数和普通函数的区别
  • 箭头函数没有自己的this , 如果在箭头函数中使用this , 会指向上层作用域中this的指向
  • 箭头函数没有自己的原型对象
  • 箭头函数的写法更简洁
  • 箭头函数没有自己的arguments
扩展用算符平常你用吗?扩展运算符是ES6新增的语法特性 , 我们经常会使用扩展运算符 , 合并对象 , 合并数组 , 也会根据使用场景 , 去通过扩展运算符 , 实现深拷贝一个对象 , 或者深拷贝一个数组
深拷贝和浅拷贝有什么区别?深拷贝是在内存中去额外开辟了一个堆 , 存放新的数据 , 改变新数据是不会对原本的数据造成影响的 。
浅拷贝仅仅是拷贝了原数据的储存地址 , 改变数据后 , 原数据也会受到影响 。
可以说一下你对解构的理解吗解构是ES6新增的语法 , 我们通常是使用解构从对象中解构出一个变量 , 如果这个变量在对象中不存在 , 会返回一个undefined , 如果存在将会返回正确的值