【发布时间】:2021-04-11 13:31:04
【问题描述】:
而不是使用.split(" ") 来对这个字符串使用扩展运算符:快速的棕色狐狸跳过了懒狗。
【问题讨论】:
-
您必须修改
String.prototype[Symbol.iterator]以实现这不是一个好的做法 -
[..."STRING"]给你["S","T","R","I","N","G"]
标签: javascript
而不是使用.split(" ") 来对这个字符串使用扩展运算符:快速的棕色狐狸跳过了懒狗。
【问题讨论】:
String.prototype[Symbol.iterator] 以实现这不是一个好的做法
[..."STRING"] 给你["S","T","R","I","N","G"]
标签: javascript
您可以通过像这样覆盖 String.prototype[Symbol.iterator] 来做到这一点,但覆盖 JavaScript 的本机对象并不是一种好的做法:
String.prototype[Symbol.iterator] = function* () {
const split = this.split(' ');
for(const word of split) {
yield word;
}
}
const result = [...'The quick brown fox jumped over the lazy dog.'];
console.log(result);
最短变体(感谢@georg):
String.prototype[Symbol.iterator] = function* () {
yield* this.split(' ');
}
const result = [...'The quick brown fox jumped over the lazy dog.'];
console.log(result);
简单地从Array.prototype.values返回迭代器的其他变体:
String.prototype[Symbol.iterator] = function () {
return this.split(' ').values();
}
const result = [...'The quick brown fox jumped over the lazy dog.'];
console.log(result);
【讨论】:
async/await、类和所有这些东西都没有问题,但我还没有完全理解生成器和 yield 是什么,或者他们的目的是什么。我不明白上面这段代码到底发生了什么(但因为它正在工作,我仍然赞成:)
yield *this.split(' ')
您可以修改String.prototype[Symbol.iterator],但不推荐。
我所做的只是创建了一个数组words,方法是拆分一个空格并将变量count初始化为0。
现在我返回一个函数next(这是在迭代时调用的函数)。当此函数 next 返回一个具有属性 done 设置为 true 的对象时,迭代停止。
因此,当第一次调用next 时,下面的代码将返回{done: false, value: "The"},因此最后一次调用next 将返回{done: true},这将停止执行。
String.prototype[Symbol.iterator] = function() {
let words = this.split(" ");
let count = 0
return {
next() {
if (count < words.length) {
return {done: false, value: words[count++]}
}
return {done: true}
}
}
}
console.log([..."The quick brown fox jumped over the lazy dog"])
根据 GEORG 在 cmets 中的建议,您可以简单地返回 this.split(' ').values()。
.values() 将返回一个迭代器,而字符串将简单地使用这个迭代器。但要了解迭代器的工作原理,请查看第一个示例。
String.prototype[Symbol.iterator] = function() {
return this.split(" ").values()
}
console.log([..."The quick brown fox jumped over the lazy dog"])
【讨论】:
return this.split(' ').values() ;)
.values() 将返回一个迭代器本身。