JavaScript 高级程序设计第 4 版(后简称高程4),相较于第 3 版,增加了 ES6 至 ES10 的全新内容,删除了旧版过时的内容,并在原有基础上充实了更加翔实的内容。
中文译版于 2020 年发售,妥妥的“新鲜出炉”,你要是问本瓜:当今学 JavaScript 哪家强,我只能说:红宝书第 4 版最在行。
于是乎,借着更文契机,本瓜将开启一个小系列,带你重看一遍高级程序设计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 可以实现面向对象编程,但是它实际上是没有“类”的,我们通过构造函数来实力对象,其实是变相在实现“类”的继承能力;至于具体的实现,包括原型链这些,后面再聊。