为什么我不能覆盖字符串实例的迭代器而不是String.prototype?

这段代码允许使用扩展运算符来分割句子的单词,正如预期的那样:

String.prototype[Symbol.iterator] = function* () {
  yield* this.split(' ');
}

const result = [...'The quick brown fox jumped over the lazy dog.'];

console.log(result);

回答

因为字符串原语不是字符串对象。相反,当您对它们使用方法(或访问它们的属性)时,就好像它们首先被转换为对象。(在松散模式下,实际上创建了一个对象,但是当方法返回时该对象被丢弃,除非某些东西保留对它的引用。)这意味着这段代码修改了一个永远不会保存的临时对象(不是字符串原语;字符串原语是不可变的):

sentence[Symbol.iterator] = function* () {
  yield* this.split(' ');
}
sentence[Symbol.iterator] = function* () {
  yield* this.split(' ');
}

由于它从未保存过,以后当您使用迭代器时,您将获得默认值。

您可以改为创建一个字符串对象:

您可以words在字符串上定义自己的方法:

const sentence = new String('The quick brown fox jumped over the lazy dog.');
// ??????????????^^^^^^^^^^^???????????????????????????????????????????????^

sentence[Symbol.iterator] = function* () {
    yield* this.split(' ');
};

const result = [...sentence];

console.log(result);

强烈反对修改库或类似库中的内置原型,但如果您意识到未来命名冲突等的危险,您可以在自己的页面或应用程序上进行。

或者正如VLAZ 指出的那样,只需编写一个将字符串传递给的函数。:-)


以上是为什么我不能覆盖字符串实例的迭代器而不是String.prototype?的全部内容。
THE END
分享
二维码
< <上一篇
下一篇>>