zoukankan      html  css  js  c++  java
  • 前端中容易让人忽略的知识点

    1、null

    对于null有一个历史存留的 bug,null是对象类型吗?虽然我们使用 typeof 检测null是对象类型,这其实是一个 bug。

    1.1 原因是什么

    因为 JS 最初的版本是 32 位系统的,为了将性能将用低位存储变量类型信息,000 开头表示代表的是对象,此时null表示全零,所以系统就错误的将null判断为对象类型。虽然 JS 内部判断代码已经更改,但是这个 bug 一直留存下来。

    2、symbol

    有关symbol使用的比较少,但是它的存在是有原因的。

    2.1 symbol 是什么

    symbol表示独一无二的值,因为由于对象的属性都是字符串类型,我们避免不了相同字符串冲突的问题。所以为了防止对象的属性都是字符串类型而冲突引入的。

    2.2 symbol 的使用

     // 通常参数是字符串类型,如果为对象类型,就会调用 toString 方法
     let s1 = Symbol(参数);// 这个参数可以认为是 Symbol 实例的一个描述,用于区分
     
     // 第一种写法
     let a = {};
     a[s1] = 'Hello!';
     
     // 第二种写法
     let a = {
        [s1] = 'Hello';
    }
    

    3、为什么 0.1 + 0.2 != 0.3

    0.1 + 0.2 __ 0.3呢?为什么会出现不相等的情况呢?面试该如何回答面试官?

    3.1 是什么导致了这种情况

    原因很简单,JS 采用的是双精度版本,这个版本就存在精度问题,就导致了上边这种情况。

    3.2 内部的原理是什么

    我们计算机的信息全部转化为二进制进行存储的,那么0.1的二进制表示的是一个无限循环小数,该版本的 JS 采用的是浮点数标准需要对这种无限循环的二进制进行截取,从而导致了精度丢失,造成了0.1不再是0.1,截取之后0.1变成了 0.100...001,0.2变成了0.200...002。所以两者相加的数大于0.3。

    那好,既然0.1不等于0.1了,那为什么我在控制台上输出console.log(0.1)还等于0.1呢?

    因为在输入内容进行转换的时候,二进制转换成十进制,然后十进制转换成字符串,在这个转换的过程中发生了取近似值,所以打印出来的是一个近似值。

    //可以通过原生的取近似值(四舍五入)的方法解决就可以了。 
    parseFloat((0.1 + 0.2).toFixed(10))
    

    待补充。。。
    参考文章:https://juejin.im/post/5d9e932ff265da5bb065db1f

  • 相关阅读:
    IO流遍历文件夹下所有文件问题
    java异常处理和自定义异常利用try和catch让程序继续下去(回来自己再写个例子试运行下)
    IO流读取文件内容时,出现空格的问题(未找到原因)
    查看程序运行时间的例子
    OOP和
    java语言的特点
    java三大版本解析
    关于培训的一些文章
    Android-自定义开关(ViewGroup版)
    Android-自定义开关(升级版)
  • 原文地址:https://www.cnblogs.com/rope/p/11654160.html
Copyright © 2011-2022 走看看