天天看点

怎么理解 JS 基本引用类型?

JavaScript 高级程序设计第 4 版(后简称高程4),相较于第 3 版,增加了 ES6 至 ES10 的全新内容,删除了旧版过时的内容,并在原有基础上充实了更加翔实的内容。

中文译版于 2020 年发售,妥妥的“新鲜出炉”,你要是问本瓜:当今学 JavaScript 哪家强,我只能说:红宝书第 4 版最在行。

怎么理解 JS 基本引用类型?

于是乎,借着更文契机,本瓜将开启一个小系列,带你重看一遍高级程序设计4(先前只是跳着跳着看),将抽取精华,用最简单的话解释核心点、尽量把握全局、快速过一遍的同时,记录与工友们分享~~

正文

第五章 —— 基本引用类型,这是本瓜最不理解的 JavaScript 语法设定之一!

为什么已经有了::Boolean、Number 和 String 基本类型,还要来一个::Boolean、Number 和 String 原始值包装类型??

let s1 = "some text";
s1.color = "red";
console.log(s1.color); // undefined

let s1 = new String("some text");
s1.color = "red";
console.log(s1.color); // red      

神不神奇?

这样做的目的就是:让原始值拥有对象的行为。。。

let falseValue = false
result = falseValue && true
console.log(result) // false

let falseObject = new Boolean(false);
console.log(falseObject) // Boolean {false}
console.log(falseObject&&true) // true      

所以,一切通过 new 关键字创建的,都是对象!!

对象被认为是某个特定引用类型的实例。新对象通过使用 new 操作符后跟一个构造函数(constructor)来创建。构造函数就是用来创建新对象的函数;

上面的 String()、Boolean() 都是构造函数,都是用来构造引用类型的对象的!!

以下代码可以充分说明以上观点:

let s1 = new String("some text")
console.log(s1.__proto__===String.prototype) //true      
let s1 = new String("some text")
let s2 = s1
s1.color='red'
console.log(s2) // String {'some text', color: 'red'}

let s1 = "txt"
let s2 = s1
s1='red'
console.log(s2) // txt      

书归正传,Date()、RegExp() 自带的引用类型构造函数就不多说了,有机会专题写写;

5.4 讲到:单例内置对象:Global、Math

具体使用,就不展开了;

需要强调的是:当代码开始执行时,全局上下文中会存在两个内置对象:Global 和 Math。其中,Global 对象在大多数 ECMAScript 实现中无法直接访问。不过,浏览器将其实现为 window 对象。所有全局变量函数都是 Global 对象的属性。Math 对象包含辅助完成复杂计算的属性和方法。

小结

此一章,最有意思的,还是对于:原始值包装类型 的理解;

JavaScript 可以实现面向对象编程,但是它实际上是没有“类”的,我们通过构造函数来实力对象,其实是变相在实现“类”的继承能力;至于具体的实现,包括原型链这些,后面再聊。

继续阅读