16 | [a, b] = {a, b}:让你从一行代码看到对象的本质
该思维导图由 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-2011 - 穿秋裤的男孩[a, b] = Object.values({a, b}) 这个并不能确定a一定等于obj.a吧
作者回复: 是的,不确定
2020-01-0822 - Elmer[a, b] = {a, b}如果从可执行角度可以这样理解吗 本身是个赋值表达式,右侧是个对象字面量,左侧是一个可执行结构?
作者回复: 不能的呢。左侧在语法解析阶段就会被理解为“数据模板的‘语法’”,它不是一个动态执行的东西。 在语法形式上,下面的代码必须有一个单一的、明确的语义: ``` var a = 100, b = 200; [a, b] = new Object; ``` 如果左侧被解释成“表达式”,那么它一定是一个数组,但这并不成立。左侧必须是一个“赋值模板(语法)”,才能让上述代码成立。不可能让左侧存在二义性的解释,它“既能执行”,又“不是表达式”,这个在语义上是不成立的。
2020-01-071 - 青史成灰老师,有2个问题想问下: ①:对于这段话的描述>而”名字“对应于“找到块”这一目的本身,表达为一个可计算的函数“f()”... 对于这段话,感觉对象(关联数组)和数据结构中的散列表很像,不知道js中的对象和散列表有什么关系? 但是数据接口中的散列表通过hash函数将一个key散列到数值中的索引,底层还是使用数组来实现,也就是说它还是一种连续的数据结构。但是通过文章和老师在评论中的回答,貌似这是一种不连续的数据结构,请问老师这要作何理解? ②:从> Astrogladiator的评论中描述看,老师说索引数组的连续性意义不大。但是在连续的数据结构对于查找效率和缓存都是很友好的,请问老师这又要作何理解?
作者回复: 1、同一个东西。 2、抽象概念上叫散列表或关联数组,并不意味着它一定要在连续存储中实现。索引数组与关联数组存在“连续/不连续”的概念,也只是在逻辑层面上说明它们是否是顺序的,或者有序的,而并不表明当它们实现在物理层面上时,“必须是”连续存储。 3、就好象JavaScript中的索引数组,在概念上它的确是连续的,但它的实现,却是用非连续索引的、非连续存储的关联数组来做到的,并不矛盾。 4、对于JavaScript的数组(Array)来说,意义不大。不过为了解决你说的问题,JavaScript中有类型化数组(TypedArray),这就是连续存储的了,并且,索引+连续在它的应用中就有很重要的价值。 5、不要死学。理解原理,比理解它的应用重要。但是,在应用中还是要“因地制宜”,不同的引擎/环境/语言等等,对不同的“概念”的实现并不一样,要活用。
2020-01-18 - 墨灵这绝对是我今年看过最难的专栏,但也是我顿悟最多的专栏。2020-03-209
- 孜孜我最近在读一本书,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