JS 中的基本类型与引用类型

发布于 2023-10-20 17:47:59 字数 2183 浏览 33 评论 0

基本类型

  • null : 表示空值
  • undefined : 表示声明了该变量,但还未赋值
  • boolean : 布尔值,true | false
  • number : 数字类型,包含整数和浮点数
  • string : 字符串类型
  • symbol : 符号类型,可用作唯一标识符
  • bigint : 表示大数

typeof null 问题

使用 typeof 可以检测一个变量的类型,其中 typeof null 会显示 object ,这是语言层面的一个 bug,其原因是 JS 底层存储变量的时候,会有个类型标记和类型值,其中 object 对应的类型标记是 0 ,而 null 被表示为空指针 0x00 ,结果, null 的类型标记就是 0 ,所以 typeof 返回 object

0.1 + 0.2 !== 0.3

JS 中 Number 类型采用的是 IEEE 754 标准 来表示整数和浮点数,只要是采用了这个标准的语言,都会遇到 0.1 + 0.2 != 0.3 的问题。这是因为 JS 使用 64 位来存储一个浮点数,计算机底层存储数据都是二进制的,0.1 在转换为 64 位二进制的时候,就发生了 精度丢失 ,所以就导致了 0.1 不是 0.1 ,实际上是 0.0001100110011001100110011001100110011001100110011001101.... 。这时候 0.1 + 0.2 就不是 0.3 了,而是 0.3000000000 ... 实际上比 0.3 还大一丢丢,所以这个相等判断就不成立了。

解决方法:

  • parseFloat((0.1 + 0.2).toFixed(1)) === 0.3
  • Math.abs(0.1 + 0.2 - 0.3) < Number.EPSILON
  • (0.1 * 1000 + 0.2 * 1000) / 1000 === 0.3

装箱

平时使用基本类型的时候可能会疑惑,为啥一个字符串可以直接访问一些原型上才有的方法?比如下面这些代码:

'aaa'.toUpperCase()
(0.12343).toFixed(2)
...

这是因为 JS 会自动对基本类型进行 装箱 操作,才使得这些方法可以访问,否则基本类型属性是没有这些东西的。

引用类型

引用类型主要就是 ObjectFunctionDate 之类的构造函数。这里就要提一下函数的传参了。函数参数到底是按值传递还是按引用传递?按照红宝书的说法,所有函数的参数都是按值传递。但是如果是按值传递,为啥下面这段代码预期不一样呢?

var obj = {a: 1}
function foo(x) {
  x.a = 2
  console.log(x.a)  // 2
}
foo(obj)
console.log(obj.a)  // 2

说好的按值传递,怎么修改了函数形参的值,实参也被影响到了呢。再略微修改一下,就能发现端倪:

var obj = {a: 1}
function foo(x) {
  x = 2
  console.log(x)  // 2
}
foo(obj)
console.log(obj.a)  // 1

上面这两段代码,一个是直接修改形参的属性,一个是重新赋值形参,对于执行结果可以这么理解: 如果是基本类型的值,传递的是值的拷贝;如果是引用类型的值,传递的是对象引用的拷贝 。而 ”对象引用的拷贝“ 就是一个 ”值“。

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。
列表为空,暂无数据

关于作者

七分※倦醒

暂无简介

文章
评论
27 人气
更多

推荐作者

櫻之舞

文章 0 评论 0

弥枳

文章 0 评论 0

m2429

文章 0 评论 0

野却迷人

文章 0 评论 0

我怀念的。

文章 0 评论 0

    我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
    原文