我想知道for of
是如何在JS中实现的,以及它在幕后如何工作。
根据MDN,for of
在可迭代对象上循环。
我的问题是:对于具有 order 感的可迭代对象(如数组),循环时是否遵循该顺序?是否符合规格要求?如果可以按特定顺序排列元素,我可以依靠它还是应该使用for loop
。
我认为这取决于特定对象(在这种情况下为数组)对可迭代协议的实现,并且for of
只是一个使用者,但是最终我还是找不到有关是否保留订单的任何具体信息。
顺便说一句,我主要在Chrome的V8中进行了一些测试,并且在循环遍历数组时似乎保留了顺序。
答案 0 :(得分:3)
for of是在后台使用迭代器实现的。
This是一篇不错的简短文章,解释了迭代器的工作原理。
下面是一个自定义迭代器的示例,它可以帮助您了解其幕后工作原理。您需要实现一个# EMBEDDED SERVER CONFIGURATION (ServerProperties)
server.port=8080
server.address= # bind to a specific NIC
server.session-timeout= # session timeout in seconds
server.context-path= # the context path, defaults to '/'
server.servlet-path= # the servlet path, defaults to '/'
server.tomcat.access-log-pattern= # log pattern of the access log
server.tomcat.access-log-enabled=false # is access logging enabled
server.tomcat.protocol-header=x-forwarded-proto # ssl forward headers
server.tomcat.remote-ip-header=x-forwarded-for
server.tomcat.basedir=/tmp # base dir (usually not needed, defaults to tmp)
server.tomcat.background-processor-delay=30; # in seconds
server.tomcat.max-threads = 0 # number of threads in protocol handler
server.tomcat.uri-encoding = UTF-8 # character encoding to use for URL decoding
方法:
[Symbol.iterator]
您可以看到here,Array迭代器的const iterable = {
[Symbol.iterator](){
let index = -1;
const iter = {
next(){
index++;
if(index === 0) return {value: 'This is index 0', done: false}
else if(index === 1) return {value: 'This is index 1!', done: false}
else if(index === 2) return {value: 'This is index 2!!', done: false}
else if(index === 3) return {value: 'This is index 3!!!', done: false}
return {value: 'end', done: true};
}
}
return iter;
}
}
const iterator = iterable[Symbol.iterator]();
console.log(iterator.next()); // 0
console.log(iterator.next()); // 1
console.log(iterator.next()); // 2
console.log(iterator.next()); // 3
console.log(iterator.next()); // end
方法是通过以下伪代码实现的: