InDesign ECMAScript:相似for循环执行结果差异问题
问题:for...in循环与普通for循环遍历文本框数组结果差异分析
我尝试将表格插入到按名称选中的文本框中,但操作未成功。调试时发现两段看似功能一致的for循环结果不同:for...in循环仅返回1个元素,普通for循环返回正确的27个对象。相关代码如下:
// change the active document app.activeDocument = newDoc; // get all existing textFrames var allTextFrames = document.textFrames.everyItem().getElements();
for (var f in allTextFrames) { allTextFrames[f].select(); $.writeln("Textframe: " + f + " Name: " + allTextFrames[f].name); } for (var t=0; t < allTextFrames.length; t++) { allTextFrames[t].select(); $.writeln("Textframe: " + t + " Name: " + allTextFrames[t].name); }
差异原因分析
对象类型本质不同
allTextFrames是InDesign脚本API返回的类数组对象,并非原生JavaScript数组。这类对象是InDesign扩展的自定义对象,除了包含索引项外,还继承了原型链上的额外可枚举属性。两种循环的遍历逻辑差异
for...in循环会遍历对象的所有可枚举属性,包括原型链上继承的属性。在这个场景中,它没有遍历到文本框的索引项,反而只捕获到了该类数组对象上的某个自定义属性(比如内部方法或元数据属性),因此仅输出1个结果。- 普通
for循环是基于索引和长度遍历:通过length属性确定遍历范围,直接访问每个索引对应的元素,完全匹配类数组对象的结构,因此能正确获取所有27个文本框对象。
- InDesign脚本的遍历建议
对于InDesign API返回的集合对象,优先使用普通for循环,或者借助原生数组方法(如Array.prototype.forEach.call(allTextFrames, function(frame) { ... }))来遍历,避免for...in带来的非预期遍历结果。
内容的提问来源于stack exchange,提问作者Oliver
相关产品推荐
相关产品推荐

