大家好!
昨天的小测验,有没有全部答对呢?
我们进入今天的主题吧!
昨天我们提到的 字面建构式
和 关键字+建构式
都是建立物件的方法,举例一下:
([]); // []
({}); // {}
(/\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'}
有必要这样吗?真是太不合群了!
其实不是不合群啦,还记得昨天提到的原始型别和物件型别吗?
- 原始型别:
BigInt
、Boolean
、Null
、Number
、String
、Symbol
和Undefined
- 物件型别:使用
字面建构式
和关键字+建构式
建立的物件
没错,Boolean
、Number
和 String
正是原始型别,Array
、Object
、RegExp
和 Function
则是物件型别。
也就是说,前者建立的会是纯值,後者建立的则是物件。
如果觉得太抽象也没关系,接下来会开始说明这两者的差异。
既然相同型别回传的值都会相等,那麽相同型别之间的比较会不会也全等呢?
先来测试物件型别:
([]) === ([]); // 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 决定购买标示
1000GB
和1TB
的硬碟各一个。
关键句:
1000GB
和 1TB
的储存容量1000GB
和 1TB
的硬碟各一个第一句的 1000GB
和 1TB
是不是一样呢?
是。因为储存容量是一种量测值,不需要考量其他因素就能直接比较,因此只要换算後的值相等,就代表全等,这就是原始型别的体现:
('s' + 't' + 'r') === 'str'; // true
第二句的两个硬碟会不会一样呢?
否。因为硬碟出厂时都会附有一组产品序号(唯一识别码),因此就算是相等储存容量的硬碟,也绝对不会全等,这就是物件型别的体现:
new RegExp('\\' + 'w') === new RegExp('\\w'); // false
这样的解释有比较容易理解资料型别的差异吗?
想当初在学习的时候,幸好有将资料型别实体化,否则可能早就放弃了。
差不多也到尾声了。
如果对文章有任何疑问,欢迎於下方提问和建议!
我是 Felix,我们明天再见!
近年来,前後端都可以看到 JavaScript 的踪影,Node.js 的诞生让 JavaScrip...
大家好,我是第一次参加铁人赛,主要是想透过这个活动纪录自己的学习笔记。 因为是以学习纪录为主,所以就...
上一篇提到了gradient的放置与多图片的放置方法 今天来更深入了解一下gradient渐层怎麽设...
Piggybacking Network Functions on SDN Reactive Rou...
哈罗大家好~ 过去23天,跟大家分享了一些 Microsoft 365 的应用以及一些小案例,让大家...