-
-
Notifications
You must be signed in to change notification settings - Fork 118
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
对象解构可以应用在数组上 #20
Comments
补充一个带默认值: |
@jjvein 其实上面这些用法一点都不神奇,数组本身就是魔改版本的对象;而且,数组具有对象(Object)的所有方法,可以通过下面的方式验证: > Object
ƒ Object() { [native code] }
> Array.prototype.__proto__ === Object.prototype
true 从上面的代码可知,Object 上所有的方法都存储在其原型(Object.prototype)上;Array.prototype 对象的 索引JavaScript 中并不存在 “真正的数组”,现有的数组是魔改版本的对象,其索引(下标)其实就是不同的属性名称;所以,通过数组的索引(下标)对数组进行解构时,可以看作是取对象对应索引的属性的值。 length> []
[]
length: 0 将上面的代码放在控制台中运行,输出包括三部分: 我们知道,length 是“数组对象”的一个特殊属性,该属性的值通常由引擎在执行增/删数组元素的时候自行维护。所以当数组被放在解构表达式的右边时,数组是被当成一个对象来处理的,所以 不只是
|
@Tao-Quixote 写的不错,分析的很深入。
这个有点那啥了。 按这个逻辑,JavaScript 就没有真正的数组、函数、……了。
大家都是魔改版本的对象。 我再补充一下规范: 至于对象解构为什么可以作用于数组,我们看规范吧 Runtime Semantics: DestructuringAssignmentEvaluation。 其中 ObjectAssignmentPattern 是对象解构,ArrayAssignmentPattern 是数组解构。
第一步是先转换为对象 RequireObjectCoercible ( argument )
所以我们可以试试 > let {__proto__: n} = 1
> n
Number {0, constructor: ƒ, toExponential: ƒ, toFixed: ƒ, toPrecision: ƒ, toString: ƒ, …} Undefined 和 Null 抛出异常 > let {__proto__: n} = null;
Uncaught TypeError: Cannot destructure property `__proto__` of 'undefined' or 'null'. |
1、获取数组的长度:
2、还可以使用此技巧获取数据最后一个元素:
只是
rest
变成了对象{0: 1, 1: 2}
。3、将数组转换为对象:
The text was updated successfully, but these errors were encountered: