javascript – 如果对象不是可迭代的,它如何传播?
内容导读
互联网集市收集整理的这篇技术教程文章主要介绍了javascript – 如果对象不是可迭代的,它如何传播?,小编现在分享给大家,供广大互联网技能从业者学习和参考。文章包含2868字,纯文字阅读大概需要5分钟。
内容图文
我正在学习传播的新用途.我意识到对象传播是一个ES2018提案.它以下列方式在节点10.5中工作:
const oldObj = {name:"doug", age:34};
const newObj = {...oldObj};
console.log(newObj); // { name: 'doug', age: 34 }
传播的一个有趣用途是将迭代转换为数组.它适用于Maps,例如,为您提供一组值对数组
const mappie = new Map().set("name", "doug").set("age", 234).set("profession", "seeker of Cthulhu");
const arr1 = [...mappie];
console.log(arr1); // [ [ 'name', 'doug' ], [ 'age', 234 ], [ 'profession', 'seeker of Cthulhu' ] ]
但我不能在一个对象上使用它
const obj = {
name: "doug",
age: 234,
profession: "seeker of Chthulhu"
};
const arr2 = [...obj];
console.log(arr2);
给我
TypeError: obj is not iterable
好的,我理解该对象不可迭代(目前).但物体是否会传播某种不同的生物而不是可迭代的传播?也就是说它会在某些情况下起作用而不是在其他情况下起作用,而且应该只知道对象只能扩散到对象中,而你不能将它们扩展到数组中?还是我错过了大局?我试图理解传播的新用途,任何启示都赞赏….
解决方法:
But is object spreading some kind of different creature than iterable spreading?
是.财产价差根本不使用迭代.它是新的主要语法,其运行时语义定义为by the spec,而不是迭代/迭代:
PropertyDefinition:…AssignmentExpression
- Let exprValue be the result of evaluating AssignmentExpression.
- Let fromValue be ? GetValue(exprValue).
- Let excludedNames be a new empty List.
- Return ? CopyDataProperties(object, fromValue, excludedNames).
属性扩展专门用于对象属性,没有像迭代扩展一样的额外泛化. (也不会立即明白将如何.:-))
对于你的const arr2 = [… obj];用例,你可能想要Object.entries:
const arr2 = Object.entries(obj);
例:
const obj = {
name: "doug",
age: 234,
profession: "seeker of Chthulhu"
};
const arr2 = Object.entries(obj);
console.log(arr2);
…或Object.keys如果您只想要属性名称,或Object.values如果您只想要值.
当然,如果你愿意,你可以使一个对象可迭代:只需给它一个迭代器.例如:
const obj = {
name: "doug",
age: 234,
profession: "seeker of Chthulhu",
* [Symbol.iterator]() {
return yield* Object.entries(this);
}
};
const arr2 = [...obj];
console.log(arr2);
并且您可以通过为它们定义适当的迭代器并在原型上提供Symbol.iterator命名的属性来创建您可以迭代的任何类的实例:
class ExampleList {
constructor() {
this.head = this.tail = null;
}
add(value) {
const entry = {value, next: null};
if (!this.tail) {
this.head = this.tail = entry;
} else {
this.tail = this.tail.next = entry;
}
}
* [Symbol.iterator]() {
for (let current = this.head; current; current = current.next) {
yield current.value;
}
}
}
const list = new ExampleList();
list.add("a");
list.add("b");
list.add("c");
for (const value of list) {
console.log(value);
}
That is it will work in some circumstances but not others…
嗯,一般来说,传播符号也是如此.属性扩展仅在对象初始值设定项中定义,并且仅在操作数是某种对象时才有效. (它的对应物,新的属性休息符号,在解构赋值模式中定义.)可迭代扩展仅在数组初始值设定项和函数参数列表中定义,并且仅在其操作数是某种可迭代时才有效. (和它的对应物,可迭代的休息符号,在创建数组的解构分配模式中定义.)
内容总结
以上是互联网集市为您收集整理的javascript – 如果对象不是可迭代的,它如何传播?全部内容,希望文章能够帮你解决javascript – 如果对象不是可迭代的,它如何传播?所遇到的程序开发问题。 如果觉得互联网集市技术教程内容还不错,欢迎将互联网集市网站推荐给程序员好友。
内容备注
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 gblab@vip.qq.com 举报,一经查实,本站将立刻删除。
内容手机端
扫描二维码推送至手机访问。