JS类型你不知道的哪些事

172 阅读4分钟
  • Undefined与Null

Undefined表示类型未定义,比如说类型没有被赋值、方法没有返回任何东西都是undefined,而Null是定义了值,但是这个值就是Null,其实说到这里大家都知道了他们两者的区别,但是其实还有一个细节那就是Undefined为什么是变量呢?

这是因为设计的问题不做深究,其实在es3环境等一些低版本浏览器里undefined是可以被更改



看到没我已经对他进行更改了,如果这种低版本中,最好用void 0来表示undefined,或者不对他赋值为undefined



这样就解决这个问题,而如今的浏览器早已解决这个问题


不会被赋值成功

  • String

String中的最大长度是什么?最大长度取决于编码长度

Note:现行的字符集国际标准,字符是以 Unicode 的方式表示的,每一个 Unicode 的码点表示一个字符,理论上,Unicode 的范围是无限的。UTF 是 Unicode 的编码方式,规定了码点在计算机中的表示方法,常见的有 UTF16 和 UTF8。 Unicode 的码点通常用 U+??? 来表示,其中 ??? 是十六进制的码点值。 0-65536(U+0000 - U+FFFF)的码点被称为基本字符区域(BMP)。


  • Number

简单的来说数字,和其他语言一样还是有精度限制,举一个简单的例子

let a = 35464653473767432

这个貌似没啥问题,但是在做前后端交互的时候后台返回这种id,我前端传递的时候会被转换一道,有一次我就比较纳闷,后端说这个id根本不存在,因为被转换成了35464653473767430

因为精度问题被转换了,我当时解决方式是转成字符串,解决了这个问题,字符串更长就不会被转换

再举一个例子

0.1 + 0.2 == 0.3 //false
0.3 + 0.2 == 0.5 //true

当浮点数无法精确表达时就会发生精度问题这里面涉及到底层二进制运算,64双精度浮点类型的底层计算,感兴趣的小伙伴可以研究下

这里提供下怎么解决这个问题的方案

Math.abs(0.1 + 0.2 - 0.3) <= Number.EPSILON
左右两边差的绝对值是否小于最小精度

  • Symbol

水平有限了解不多欢迎小伙伴交流一下


  • 装箱与拆箱

谈到这儿,如果接触过java的同学们就应该知道

装箱就是将基本数据类型转换成对应类型的包装类;
拆箱就是将应用类型转换成基本数据类型;

javascript高级程序设计一书曾写道

每当读取一个基本类型的时候,后台就会创建一个对应的基本包装类型对象,从而让我们能够调用一些方法来操作这些数据。

let s= "123";
s.substr(0,1);

这就是为什么像字符串、数字可以有方法进行调用

  1. 隐式装箱
每当读取一个基本类型的值时,后台会创建一个该基本类型所对应的对象。在这个基本类型上调用方法,其实是在这个基本类型对象上调用方法。这个基本类型的对象是临时的,它只存在于方法调用那一行代码执行的瞬间,执行方法后立刻被销毁。
let s= "123";
s.substr(0,1);
//上方代码在后台的真正步骤为
    var c = new String(123);
    c.substr(2);    c = null;
  1. 创建一个 Number 类型的实例。
  2. 在实例上调用方法。
  3. 销毁实例。
显示装箱

通过内置对象 Boolean、Object、String 等可以对基本类型进行显示装箱

let a= new String("11")

2.拆箱

拆箱与装箱相反,把对象转变为基本类型的值。拆箱过程内部调用了抽象操作 ToPrimitive 。该操作接受两个参数,第一个参数是要转变的对象,第二个参数 PreferredType 是对象被期待转成的类型。第二个参数不是必须的,默认该参数为 number,即对象被期待转为数字类型。有些操作如 String(obj) 会传入 PreferredType 参数。有些操作如 obj + " " 不会传入 PreferredType。

具体转换过程是这样的。默认情况下,ToPrimitive 先检查对象是否有 valueOf 方法,如果有则再检查 valueOf 方法是否有基本类型的返回值。如果没有 valueOf 方法或 valueOf 方法没有返回值,则调用 toString 方法。如果 toString 方法也没有返回值,产生 TypeError 错误。

PreferredType 影响 valueOf 与 toString 的调用顺序。如果 PreferrenType 的值为 string。则先调用 toString ,再调用 valueOf。