js 中 0.1+0.2 !=0 .3

我的理解:JS 表达数字类型遵循 IEEE754 标准 通过64位来表示一个数字,其中小数部分52位(JS有53位)。计算机无法计算十进制的数字 所以要转成二进制,但是0.1 和0.2用二进制表示均出现无限循环,所以只保留了前53位,但是这中截取后的二进制数字再转换成十进制时候,就不是原来的0.1和0.2了。

弱引用

弱引用与强引用相对,是指不能确保其不被垃圾回收机制回收,假如一个对象只被弱引用所引用,则认定其不可被访问,并且因此可能在任何时候被回收。

比如:const obj = {},创建一个对象,只有手动将obj = null才会被垃圾回收机制回收。如果是弱引用对象,则垃圾回收机制会自动回收

promise 在.then()中捕获异常

then方法可以接受两个参数,第一个对应resolve的回调,第二个对应reject的回调。

  1. a = new Promise(
  2. (resolve,reject)=>{
  3. 1>2?resolve(1234):reject(5678)
  4. }
  5. )
  6. a.then(res=>{
  7. console.log(res)
  8. },err=>{
  9. console.log(err)
  10. })

[] == ![] 返回true

  1. ![]返回false,因为boolean转换只有’’,NaN,undefined,null,false,0,-0为false,其他都为true
  2. 相当于 [] == false
  3. 显然两边类型不一样且右边为基础类型,左边需要进行隐式转换(.ToPrimitive()函数)
  4. 先[].valueOf(),为[]引用数据类型,再[].toString()为 ‘’ 为基础数据类型
  5. ‘’进行boolean为false 所以 [] == ![] 返回true

在构造函数中return其他对象

会返回其他对象,无法继承构造函数原型链 ,无法获取通过原型链获取构造函数。

  1. function fn(){
  2. this.some = 'aaa'
  3. return [1,2,3,4,5]
  4. }
  5. b = new fn() // [1, 2, 3, 4, 5]
  6. b.__proto__ == fn.prototype //false

Vue为什么不能检测数组变动

Vue 中是通过对每个键设置 getter/setter 来实现响应式的,开发者使用数组,目的往往是遍历,此时调用 getter 开销太大了,Vue 没有对数组每个键设置响应式的过程。