JavaScript 核心原理解析
周爱民
《JavaScript 语言精髓与编程实践》作者,南潮科技(Ruff)首席架构师
32699 人已学习
新⼈⾸单¥59
登录后,你可以任选3讲全文学习
课程目录
已完结/共 28 讲
开篇词 (1讲)
JavaScript 核心原理解析
15
15
1.0x
00:00/00:00
登录|注册

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

出现的新语言和函数式编程
继承和多态的争议
局部保存、保护和隐藏
数据和行为
有迭代器的对象替代索引数组的场合
展开语法的作用
抽象层面的认识
对象和数组的关系
展开语法的作用
对象和数组的相互转换
对象和数组的相互转换
对象和数组的赋值模板
解构赋值的语法
JavaScript中的对象和数组的关系
索引数组和关联数组
数据结构的抽象层次
面向对象的争议
面向对象的核心概念
面向对象技术的发展历程
思考题
知识回顾
两种数据结构的统一
解构
两种数据结构
对象的前生后世
JavaScript对象
JavaScript对象本质

该思维导图由 AI 生成,仅供参考

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

对象的前生后世

要知道,面向对象技术并不是与生俱来、顺理成章就成为了占有率最高的编程技术的。
在早期,面向对象技术其实并不太受待见,因为它的抽象层级比较高,也就意味着它离具体的机器编程比较远,没有哪种硬件编程技术(在当时)是需要所谓的面向对象的。最核心的那部分编程逻辑通常就是写寄存器、响应中断,或者是发送指令。这些行为都是面向机器逻辑的,与什么面向对象之类的都无关。
最早,大概是 1967 年的时候,艾伦(Alan Kay)提出了这么一个称为“对象”的抽象概念和基于它的面向对象编程(object-oriented programming),这也成为他所发明的 Smalltalk 这个语言中的核心概念之一。
然而,回顾这段历史,这个所谓的“对象”的抽象概念中,只包含了数据行为两个部分,分别称为状态保存消息发送,再进一步地说,也就是我们今天讲的“属性”和“方法”。并且,在这个基础上,有了这些状态(或称为数据)的局部保存、保护和隐藏等概念,也就是我们现在说的对象成员的可见性问题
确认放弃笔记?
放弃后所记笔记将不保留。
新功能上线,你的历史笔记已初始化为私密笔记,是否一键批量公开?
批量公开的笔记不会为你同步至部落
公开
同步至部落
取消
完成
0/2000
荧光笔
直线
曲线
笔记
复制
AI
  • 深入了解
  • 翻译
    • 英语
    • 中文简体
    • 中文繁体
    • 法语
    • 德语
    • 日语
    • 韩语
    • 俄语
    • 西班牙语
    • 阿拉伯语
  • 解释
  • 总结

JavaScript中的对象本质是一个数据结构,而解构赋值则是从封装的对象中抽取数据。文章回顾了面向对象技术的发展历程,指出最初的对象概念只包含数据和行为两个部分,即属性和方法。然而,近年来新语言的兴起以及函数式编程的流行导致面向对象的生存环境进一步恶化。函数式语言不考虑数据封装问题,而函数自身强调“无副作用”,这使得面向对象的封装特性受到挑战。文章强调了对象本质是一个数据结构,而解构赋值则是从这个结构中抽取数据的过程。文章以简洁的语言和深刻的见解,帮助读者快速了解了JavaScript对象的本质及其在编程语言发展中的地位。文章还介绍了数据结构的抽象层次和解构的概念,强调了对象是一种关联数组,而解构赋值则是从对象中提取值的过程。通过对赋值模板和赋值过程的解释,读者可以更好地理解解构赋值的语法和语义。整体而言,本文深入浅出地阐述了JavaScript对象和解构赋值的核心概念,为读者提供了对这一技术特点的全面了解。文章通过讲解对象和数组的统一性,以及对象和数组之间的相互转换行为,展示了展开语法作为两种数据类型之间的桥梁的重要性。同时,文章提出了一个思考题,引导读者思考“有迭代器的对象”在哪些场合中可以替代“索引数组”,为读者提供了进一步思考和练习的机会。

仅可试看部分内容,如需阅读全部内容,请付费购买文章所属专栏
《JavaScript 核心原理解析》
新⼈⾸单¥59
立即购买
登录 后留言

全部留言(10)

  • 最新
  • 精选
  • 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
    11
  • 穿秋裤的男孩
    [a, b] = Object.values({a, b}) 这个并不能确定a一定等于obj.a吧

    作者回复: 是的,不确定

    2020-01-08
    2
    2
  • Elmer
    [a, b] = {a, b}如果从可执行角度可以这样理解吗 本身是个赋值表达式,右侧是个对象字面量,左侧是一个可执行结构?

    作者回复: 不能的呢。左侧在语法解析阶段就会被理解为“数据模板的‘语法’”,它不是一个动态执行的东西。 在语法形式上,下面的代码必须有一个单一的、明确的语义: ``` var a = 100, b = 200; [a, b] = new Object; ``` 如果左侧被解释成“表达式”,那么它一定是一个数组,但这并不成立。左侧必须是一个“赋值模板(语法)”,才能让上述代码成立。不可能让左侧存在二义性的解释,它“既能执行”,又“不是表达式”,这个在语义上是不成立的。

    2020-01-07
    1
  • 青史成灰
    老师,有2个问题想问下: ①:对于这段话的描述>而”名字“对应于“找到块”这一目的本身,表达为一个可计算的函数“f()”... 对于这段话,感觉对象(关联数组)和数据结构中的散列表很像,不知道js中的对象和散列表有什么关系? 但是数据接口中的散列表通过hash函数将一个key散列到数值中的索引,底层还是使用数组来实现,也就是说它还是一种连续的数据结构。但是通过文章和老师在评论中的回答,貌似这是一种不连续的数据结构,请问老师这要作何理解? ②:从> Astrogladiator的评论中描述看,老师说索引数组的连续性意义不大。但是在连续的数据结构对于查找效率和缓存都是很友好的,请问老师这又要作何理解?

    作者回复: 1、同一个东西。 2、抽象概念上叫散列表或关联数组,并不意味着它一定要在连续存储中实现。索引数组与关联数组存在“连续/不连续”的概念,也只是在逻辑层面上说明它们是否是顺序的,或者有序的,而并不表明当它们实现在物理层面上时,“必须是”连续存储。 3、就好象JavaScript中的索引数组,在概念上它的确是连续的,但它的实现,却是用非连续索引的、非连续存储的关联数组来做到的,并不矛盾。 4、对于JavaScript的数组(Array)来说,意义不大。不过为了解决你说的问题,JavaScript中有类型化数组(TypedArray),这就是连续存储的了,并且,索引+连续在它的应用中就有很重要的价值。 5、不要死学。理解原理,比理解它的应用重要。但是,在应用中还是要“因地制宜”,不同的引擎/环境/语言等等,对不同的“概念”的实现并不一样,要活用。

    2020-01-18
  • 墨灵
    这绝对是我今年看过最难的专栏,但也是我顿悟最多的专栏。
    2020-03-20
    9
  • 孜孜
    我最近在读一本书,Structure and Interpretation of Computer Programs(sicp),突然感觉和这本课不知道哪里有很多相似。
    2022-08-09归属地:辽宁
  • 小炭
    https://juejin.im/post/6844903715078406151 私有字段 我们来看看这个提案中最具争议的部分。 它是如此有争议: 1. 尽管事实上,它已经在Chrome Canary中实现,并且默认情况下公共字段可用,但是私有字段功能仍需额外开启; 2. 尽管事实上,原始的私有字段提案与当前的提案合并,关于分离私有和公有字段的issue一再出现(如:140,142,144,148); 3. 甚至一些委员会成员(如:Allen Wirfs-Brock和Kevin Smith)也反对它并提供替代方案,但是该提案仍然顺利进入stage 3; 4. 该提案的issue数量最多——当前提案的GitHub仓库为131个,原始提案(合并前)的GitHub仓库为96个(相比BigInt提案的issue数量为126个),并且大多数issue持反对观点; 5. 甚至创建了单独的issue,以便统计总结对它的反对意见; 6. 为了证明这一部分的合理性而创建了单独的FAQ,然而不够强力论据又导致了新的争论(133,136);
    2020-11-10
  • kkxue
    化繁为简,程序原本已成宝典
    2020-08-02
  • 水木年华
    周老师关于对象和数组的描述,让我恍然大悟。
    2020-01-05
  • 许童童
    当需要遍历一个数组的时候,比如for of时,但对其遍历的顺序不是特别敏感时,是可以用可迭代的对象来替代索引数组的。
    2019-12-22
收起评论
显示
设置
留言
10
收藏
沉浸
阅读
分享
手机端
快捷键
回顶部