JavaScript核心原理解析
周爱民
《JavaScript语言精髓与编程实践》作者,南潮科技(Ruff)首席架构师
立即订阅
3637 人已学习
课程目录
已更新 21 讲 / 共 21 讲
0/3登录后,你可以任选3讲全文学习。
开篇词 (1讲)
开篇词 | 如何解决语言问题?
免费
从零开始:JavaScript语言是如何构建起来的 (5讲)
01 | delete 0:JavaScript中到底有什么是可以销毁的
02 | var x = y = 100:声明语句与语法改变了JavaScript语言核心性质
03 | a.x = a = {n:2}:一道被无数人无数次地解释过的经典面试题
04 | export default function() {}:你无法导出一个匿名函数表达式
05 | for (let x of [1,2,3]) ...:for循环并不比使用函数递归节省开销
从表达式到执行引擎:JavaScript是如何运行的 (6讲)
06 | x: break x; 搞懂如何在循环外使用break,方知语句执行真解
07 | `${1}`:详解JavaScript中特殊的可执行结构
08 | x => x:函数式语言的核心抽象:函数与表达式的同一性
09 | (...x):不是表达式、语句、函数,但它却能执行
10 | x = yield x:迭代过程的“函数式化”
11 | throw 1;:它在“最简单语法榜”上排名第三
从原型到类:JavaScript是如何一步步走向应用编程语言的 (6讲)
12 | 1 in 1..constructor:这行代码的结果值,既可能是true,也可能是false
13 | new X:从构造器到类,为你揭密对象构造的全程
14 | super.xxx():虽然直到ES10还是个半吊子实现,却也值得一讲
15 | return Object.create(new.target.prototype):做框架设计的基本功:写一个根类
16 | [a, b] = {a, b}:让你从一行代码看到对象的本质
17 | Object.setPrototypeOf(x, null):连Brendan Eich都认错,但null值还活着
不定期加餐 (3讲)
加餐 | 捡豆吃豆的学问(上):这门课讲的是什么?
免费
加餐 | 捡豆吃豆的学问(下):这门课该怎么学?
免费
加餐 | 让JavaScript运行起来
免费
JavaScript核心原理解析
登录|注册

16 | [a, b] = {a, b}:让你从一行代码看到对象的本质

周爱民 2019-12-20
你好,我是周爱民。欢迎回到我的专栏。
接下来的两讲,我要讲的仍然是 JavaScript 中的面向对象。有所不同的是,今天这一讲说的是JavaScript 中的对象本质,而下一讲要说的,则是它最原始的形态(也通常称为原子对象)。
说回今天的话题,所谓的“对象本质”,就是从根本上来问,对象到底是什么?

对象的前生后世

要知道,面向对象技术并不是与生俱来、顺理成章就成为了占有率最高的编程技术的。
在早期,面向对象技术其实并不太受待见,因为它的抽象层级比较高,也就意味着它离具体的机器编程比较远,没有哪种硬件编程技术(在当时)是需要所谓的面向对象的。最核心的那部分编程逻辑通常就是写寄存器、响应中断,或者是发送指令。这些行为都是面向机器逻辑的,与什么面向对象之类的都无关。
最早,大概是 1967 年的时候,艾伦(Alan Kay)提出了这么一个称为“对象”的抽象概念和基于它的面向对象编程(object-oriented programming),这也成为他所发明的 Smalltalk 这个语言中的核心概念之一。
然而,回顾这段历史,这个所谓的“对象”的抽象概念中,只包含了数据行为两个部分,分别称为状态保存消息发送,再进一步地说,也就是我们今天讲的“属性”和“方法”。并且,在这个基础上,有了这些状态(或称为数据)的局部保存、保护和隐藏等概念,也就是我们现在说的对象成员的可见性问题
取消
完成
0/1000字
划线
笔记
复制
© 版权归极客邦科技所有,未经许可不得传播售卖。 页面已增加防盗追踪,如有侵权极客邦将依法追究其法律责任。
该试读文章来自付费专栏《JavaScript核心原理解析》,如需阅读全部文章,
请订阅文章所属专栏。
立即订阅
登录 后留言

精选留言(2)

  • Astrogladiator-埃蒂纳度斯
    “有迭代器的对象”在哪些场合中可以替代“索引数组”?
    正如文中老师所讲的那样, 究其根本来说,索引数组其实是关联数组的一个特例——被存取的数据所关联的名字就是它的索引。关联数组可以通过实现对象迭代器的接口去实现。所以说有迭代器的对象可以适应于那些键名是非数字的场合。但是索引数组是一组连续的数据在一块内存区间,一般会有初始大小,而用迭代器实现的关联数组是非连续的数据。Map,Set, WeakMap, WeakSet,就是这种关联数组。

    作者回复: 对于JavaScript来说,索引数组的连续性意义不大。不过也正是为了解决这个问题才引用了TypedArray。

    对于你开始的问题,其实没有太好的答案。在本文里面,这种可替代性更多的是一种尝试。真正有用的是用户自定义的Symbol.iterator,而不是直接引用Array.prototype中的。然而一旦是用户自定义,就与确定的需求和场景有关了。

    另外,事实上字符串也有这样的性质,亦即是字符串可用"...str"这样的语法。所以一个非常有趣的例子就是把一个字符串塞给Set,利用Set没有重复元素的特性来得到“字符串中的有效字符统计”。例如:
    ```
    str='abccccd';
    console.log((new Set(str)).size); // 4
    console.log(...new Set(str)); // a b c d
    ```

    所以,我想用这个例子来说明的是:很难确定地讲这个东西在“哪些场合”下有用。理解它的性质和本质,在需要的时候能找到高效的解,就可以了。

    2019-12-20
    4
  • 许童童
    当需要遍历一个数组的时候,比如for of时,但对其遍历的顺序不是特别敏感时,是可以用可迭代的对象来替代索引数组的。
    2019-12-22
收起评论
2
返回
顶部