JavaScript Day 5. 型别辨识 typeof

偶尔程序也会碰到需要辨别变数的状态,有时候是用於防止使用者输入奇怪的文字,有时候是帮助自己确认变数的型别,使程序能顺利执行,而 typeof 在使用方面也非常的简单,只要这样 typeof 变数

typeof,就是帮忙判断参数的型别,简单使用的方式在上面有提到,这里再给一个比较完整的范例:

// Numbers
typeof 37 === 'number';

// Strings
typeof "" === 'string';

// Booleans
typeof true === 'boolean';

// Undefined
typeof undefined === 'undefined';

// Objects
typeof {a:1} === 'object';

// Functions
typeof function(){} === 'function';

typeof 主要能辨识的型态有:NumberStringBooleanobjectfunctionundefinedsymbolbigint。在一般的状态下,都会正确的回传型别,唯独 null。

typeof null === 'object';

至於为什麽 null 无法回传正确的型别,这部分我比较无法用自己的话去解释清楚,因此我们引用MDN的句子,比较不容易使人混乱:

自从 JavaScript 一开始出现, JavaScript 的值就总以型别标签跟着一个值的方式表示。物件的型别标签是 0,而 null 这个值是使用 NULL 指标 (在大部份平台上是 0x00) 来表示,因此 null 看起来像是一个以 0 为型别标签的值, 并使得 typeof 传回不甚正确的结果。

另外还有一个有趣的地方,如果我们用 typeof 辨识阵列,会发现它回传的不是阵列,而是 object:

var d = [];
console.log(typeof d);  //  object

如果要避免这个问题,可以这麽写

var d = [];
console.log(typeof d);  //  object
console.log(Object.prototype.toString.call(d)); //  [object Array]

关於这个部分解释起来大概是这样,JavaScript 定义资料型别分为「基本型别」和「物件型别」两种,「基本型别」包含 boolean、null、字串,除了这几种以外,其余都算是「物件型别」,阵列也是「物件型别」。

另外在查找资料的时候,也看到另一个与 typeof 放在一起的小工具 instanceof。这个要解释起来比较复杂,如果不太懂「原型链」的观念,大概只能稍微猜测它会在何时使用到。

instanceof 可以判断 A 是否为 B 的实例(A 是否在 B 的原型链上),如果是则回传 true,反之则回传 false。

function Person(a) {
	this.a = a;
}
var b = new Person('c');
console.log(b instanceof Person); // true

这个简单的范例可以看到,b 指向 person,b 为 person 的实例,因此会回传 true。

instanceof 是通过使用一个物件的原型来判断例项关系。

关於 instanceof 在原型上的观念,我听了同学的建议去找了影片来看,大致上可以理解到他拥有继承的概念。关於原型的解释,其实可以是一篇文章了,所以我在这边就尽量的简单解释,假设今天我们要执行两件事,透过原型的概念,我们可以以一个与这两件事相关的物件当作基础并向外做延伸,这样的作法可以减少重复,降低记忆体空间。

以生活上的例子来说,譬如今天有 A 跟 B 两个人,他们的目的地都是去超市买菜,他们都是走路去超市,此时以原型的概念来说,「走路」可以是一个基础,以这个基础向外做延伸,A 买菜 B买肉两种不同选择则是延伸。

在这边我是粗略的解释了一下原型的概念,但是 instanceof 的部分则要再更深入的去探讨原型中 new 这个方法是如何运作的, 这部分就留着有时间研究的更完整再补上了。(下台一鞠躬


<<:  DAY1 机器学习(ML)、深度学习(DL)与NLP

>>:  Spring Framework X Kotlin Day 9 Rest Repository

Day 28-ASP.NET & SQL资料库制作留言板(上)

-前集提要- 当将form里面的资料post回server端,且处理这个form的资料的URL,都由...

map结构的遍历

QVector<Item_Statistics> ItemManager::getAll...

用ffprobe列出mp4 关键帧的时间

列出所有的关键帧时间 ffprobe.exe -v error -select_streams v:...

Day20 AR抬头显示器(HUD)与一般的差异 你是5岁就抬头还是3岁才抬头的呢?

这期要介绍抬头显示器(HUD)的一些功能和种类,让我们马上开始。 抬头显示器可用於汽车上。它将讯息投...

用Firebase Web的小功能分享 (2)

上传档案後制作超连结下载档案 - 抓档案名字跟下载的URL code 因为抓档案名字用forEac...