Javascript 运算子、型别与文法 - 原始型别及物件型别

Javascript 的型别可以分为两大类,分别是 原始型别 以及 物件型别

https://ithelp.ithome.com.tw/upload/images/20210810/201405062dO9pafkZz.png

我们经常会使用这些型别各自的方法, 例如用 length 取得字串的长度。

但为什麽明明是 基本型别 却会有 属性 以及 方法 可以呼叫?

这是因为这些型别有着相对应的 包裹物件 (Primitive Wrapper),这些 包裹物件 包含了这些物件可以使用的方法,我们接着会在物件型别中做更多说明。

https://ithelp.ithome.com.tw/upload/images/20210810/20140506tTLKGZh6NM.png

原始型别

先来看关於原始型别的范例程序码:

let a, b, c, d, e;
a = 1;       //number
b = '文字';  //string
c = true;   //boolean
d = {};     //object
e = null;   //object
console.log(typeof(a));
console.log(f); // VM1420:1 Uncaught ReferenceError: e is not defined

console.log(typeof(f)); // undefined

值得注意的是:

  1. e 虽然被指派为 null,但型别却是 object,这是 js 长久以来的一个错误,没有修正是因为许多的网站也使用了这样的错误观念完成了网站。如果修正的话会造成许多的网站因此而坏掉,所以就把这个错误保留了下来。
  2. f 这个未定义的变数的型别是 undefined, 这是 typeof 保护机制,如果在没有定义 f 这个变数的情境下 console.log 的话,会出现的是 not defined

现在来看另一段范例:

let a = 'ming ';
console.log(a.length);        // 5
console.log(a.toUpperCase()); // MING 
console.log(a.trim());        // ming

上述这些方法都是针对字串所做的,但是直接 console.log(a); 也只有显示 'ming ',并没有显示那些可以用的方法,而 包裹物件 则可以做得到。

物件型别

前面提到,基本型别会有「属性」以及「方法」是因为这些型别有着相对应的包裹物件 (Primitive Wrapper)。

也就是「自动转型」赋予 StringNumberBoolean 这些神奇的功能。

在 JavaScript 这门程序语言当中,当我们尝试着要去存取 StringNumberBoolean 这三种基本型别的属性时,它就只会在「那一刻」被转型为该类别的「物件」。

let a = 'ming ';
console.log(a.length);

上面段程序码,当我们试着去读取 a.length 的时候,背後原理是这样的:

let a = new String('ming ');
a.length;

a = null;
a = 'ming ';

它会透过对应的物件建构器将 'ming ' 包装成一个 String 的「物件」,然後回传对应的属性後,即刻销毁恢复成基本型别。

我们可以透过下面这段程序码来了解 原始型别物件型别 的不同。

let a = 'ming ';

let e = new String(a);
console.log(a, e);

我们可以透过下面这段程序码来了解 原始型别 与 物件型别 的不同。

  • a 是一个原始型别为字串的变数。
  • e 是一个透过建构式建立的物件。

透过这样的方式宣告之後,来看看执行的结果:

https://ithelp.ithome.com.tw/upload/images/20210810/20140506FgJdGMc861.png

可以看到 [[prototype]] 就是 e 这个包裹物件的可以用的方法总集

同样可以套用原是型别的字串身上,所以我们刚刚用的 trim lengthto UpperCase 都在这里面喔!

然而,其实并不建议在宣告字串的时候使用字串的 包裹物件 方式宣告,这种宣告方式又称为 建构式

後续的篇章会讲到,而不建议的最大重点在於,透过建构式宣告出来的变数资料型别不会是字串,而是 物件 喔!

参考文章


<<:  Javascript 运算子、型别与文法 - 陈述式与表达式

>>:  你会用Alt + = 键吗?

这不是终点

时间过得非常快,在参加 30 天不中断的 iT 邦帮忙铁人赛,在 1/3 路程的时候,就会开始有点挣...

[Day 13] 阿嬷都看得懂的基础 CSS 选择器

阿嬷都看得懂的基础 CSS 选择器 小孩子才做选择,我全都要! -民明书房《我那被限制住的想像》 昨...

赌场也有打烊的时候 - 盘後回测

写好 tick 交易策略之後,需要回测一下当天的买卖进出点是否正确 ticks = api.tick...

给网站架设初心者:初阶观念与趋势剖析

网站,可以让你在网路世界有个发声的立足点。拥有自己的网站可以扩大影响范围,让使用者能透过浏览网站从色...

Day 30 最终章:结语与初心

各位读者大家好~我是Android工程师兼作家 小笠宏树,今天不演别人演我自己。希望大家这个系列看得...