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

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

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

对象的前生后世

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

    11
  • 穿秋裤的男孩
    [a, b] = Object.values({a, b}) 这个并不能确定a一定等于obj.a吧

    作者回复: 是的,不确定

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

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

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

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

  • 墨灵
    这绝对是我今年看过最难的专栏,但也是我顿悟最多的专栏。
    9
  • 孜孜
    我最近在读一本书,Structure and Interpretation of Computer Programs(sicp),突然感觉和这本课不知道哪里有很多相似。
    归属地:辽宁
  • 小炭
    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);
  • kkxue
    化繁为简,程序原本已成宝典
  • 水木年华
    周老师关于对象和数组的描述,让我恍然大悟。
  • 许童童
    当需要遍历一个数组的时候,比如for of时,但对其遍历的顺序不是特别敏感时,是可以用可迭代的对象来替代索引数组的。
收起评论
显示
设置
留言
10
收藏
沉浸
阅读
分享
手机端
快捷键
回顶部