字符串何时成为可迭代对象?for..of会将原始字符串转为包装对象吗
问题核心答疑
你对for..of会触发原始字符串转包装对象的理解是正确的,具体逻辑可以拆解为以下几点:
- 可迭代能力的定义是对象实现了
Symbol.iterator方法,ECMAScript 从 ES6 版本开始就将该方法内置到了String.prototype上,所有字符串都可以通过原型链访问到这个方法。 - 原始类型的字符串本身不是对象,无法直接持有方法,当
for..of遍历字符串时,会先触发**自动装箱(boxing)**操作:将原始字符串临时转为对应的String对象包装器,调用这个临时对象的Symbol.iterator方法生成迭代器,逐次调用迭代器的next()方法拿到每一个字符完成遍历,遍历结束后临时包装对象会被引擎自动回收。 - 你可以通过下面的代码验证这个逻辑:
// 验证String原型上存在迭代器方法 console.log(String.prototype.hasOwnProperty(Symbol.iterator)); // 输出 true const rawStr = 'hello'; // 原始值调用迭代器方法会触发临时装箱 const strIterator = rawStr[Symbol.iterator](); console.log(strIterator.next()); // 输出 {value: 'h', done: false}
- 额外补充:除了
for..of之外,所有需要消费可迭代对象的语法都会触发同样的装箱操作,比如展开运算符[...rawStr]、数组解构const [firstChar] = rawStr等,都走的是同一套逻辑。
内容的提问来源于stack exchange,提问作者Ivan
相关产品推荐
相关产品推荐

