JS 02 - 资料型别

大家好!

昨天的小测验,有没有全部答对呢?
我们进入今天的主题吧!


建立资料

昨天我们提到的 字面建构式关键字+建构式 都是建立物件的方法,举例一下:

([]); // []
({}); // {}
(/\w/); // /\w/
(function () {}); // function () {}

new Array(); // []
new Object(); // {}
new RegExp('\\w'); // /\w/
new Function(); // function () {}

上述方法都能建立新的物件,相同型别回传的值也都相等,按照自己的偏好择一使用就行了。
但是,总是会有几个想要独树一帜的,举例一下:

(false); // false
(0); // 0
('str'); // ''

new Boolean(); // {false}
new Number(); // {0}
new String('\\w'); // {'str'}

有必要这样吗?真是太不合群了!
其实不是不合群啦,还记得昨天提到的原始型别和物件型别吗?

  • 原始型别:BigIntBooleanNullNumberStringSymbolUndefined
  • 物件型别:使用 字面建构式关键字+建构式 建立的物件

没错,BooleanNumberString 正是原始型别ArrayObjectRegExpFunction 则是物件型别
也就是说,前者建立的会是纯值,後者建立的则是物件

如果觉得太抽象也没关系,接下来会开始说明这两者的差异。


比较资料

既然相同型别回传的值都会相等,那麽相同型别之间的比较会不会也全等呢?
先来测试物件型别:

([]) === ([]); // false
({}) === ({}); // false
(/\w/) === (/\w/); // false
(function () {}) === (function () {}); // false

new Array() === new Array(); // false
new Object() === new Object(); // false
new RegExp('\\w') === new RegExp('\\w'); // false
new Function() === new Function(); // false

([]) === new Array(); // false
({}) === new Object(); // false
(/\w/) === new RegExp('\\w'); // false
(function () {}) === new Function(); // false

怎麽会这样?明明都有相等的值,但是却不全等
再来测试原始型别:

(false) === (false); // true
(0) === (0); // true
('str') === ('str'); // true

new Boolean() === new Boolean(); // false
new Number() === new Number(); // false
new String('str') === new String('str'); // false

(false) === new Boolean(); // false
(0) === new Number(); // false
('str') === new String('str'); // false

不出所料,又是一个与众不同的结果。
其实会出现这样的结果是因为,原始型别和物件型别的传递方式不同


打个比方

如果原始型别是储存容量,那麽物件型别就是储存装置:

卖场有各式各样的硬碟,硬碟的规格也不尽相同。经过多方比较,最後 Felix 决定购买标示 1000GB1TB 的硬碟各一个。

关键句:

  1. 硬碟有 1000GB1TB 的储存容量
  2. 购买 1000GB1TB 的硬碟各一个

第一句的 1000GB1TB 是不是一样呢?
是。因为储存容量是一种量测值,不需要考量其他因素就能直接比较,因此只要换算後的值相等,就代表全等,这就是原始型别的体现:

('s' + 't' + 'r') === 'str'; // true

第二句的两个硬碟会不会一样呢?
否。因为硬碟出厂时都会附有一组产品序号(唯一识别码),因此就算是相等储存容量的硬碟,也绝对不会全等,这就是物件型别的体现:

new RegExp('\\' + 'w') === new RegExp('\\w'); // false

这样的解释有比较容易理解资料型别的差异吗?
想当初在学习的时候,幸好有将资料型别实体化,否则可能早就放弃了。

差不多也到尾声了。
如果对文章有任何疑问,欢迎於下方提问和建议!
我是 Felix,我们明天再见!


<<:  岔路上的风景 - 递回

>>:  Episode 2 - 关於 COBOL

[NestJS 带你飞!] DAY01 - 简介

近年来,前後端都可以看到 JavaScript 的踪影,Node.js 的诞生让 JavaScrip...

【Day 1】前言

大家好,我是第一次参加铁人赛,主要是想透过这个活动纪录自己的学习笔记。 因为是以学习纪录为主,所以就...

【心得】不同 gradient 使用方式-- linear-gradient()

上一篇提到了gradient的放置与多图片的放置方法 今天来更深入了解一下gradient渐层怎麽设...

SDN-Defense #Paper

Piggybacking Network Functions on SDN Reactive Rou...

【DAY 24】Microsoft 365 的方案有好多种,到底哪些适合我?(上)

哈罗大家好~ 过去23天,跟大家分享了一些 Microsoft 365 的应用以及一些小案例,让大家...