JScript/WindowsScriptHost 是否缺少 Array.forEach()?

use*_*950 3 jscript

我编写了 JScript 并使用 WindowsScriptHost 运行它。但是,它似乎缺少 Array.forEach()。

['a', 'b'].forEach(function(e) {
    WSH.Echo(e);
});
Run Code Online (Sandbox Code Playgroud)

因“test.js(66, 2) Microsoft JScript 运行时错误:对象不支持此属性或方法”而失败。

不可能吧?它真的缺少 Array.forEach() 吗?我真的必须使用 for 循环变体之一吗?

roj*_*ojo 5

JScript 使用IE8 中存在的 JavaScript 功能集。即使在 Windows 10 中,Windows 脚本宿主也仅限于 JScript 5.7。这个MSDN 文档解释了:

从 JScript 5.8 开始,默认情况下,JScript 脚本引擎支持 5.7 版中存在的语言功能集。这是为了保持与早期版本引擎的兼容性。要使用 5.8 版的完整语言功能集,Windows 脚本接口主机必须调用IActiveScriptProperty::SetProperty

......最终手段,因为cscript.exewscript.exe没有开关允许你调用该方法,Microsoft建议您编写自己的脚本宿主解锁查克拉引擎。

不过,有一个解决方法。您可以调用htmlfileCOM 对象,强制它与 IE9(或 10 或 11 或 Edge)兼容,然后导入您希望的任何方法——包括Array.forEach()、JSON 方法等等。下面是一个简短的例子:

var htmlfile = WSH.CreateObject('htmlfile');
htmlfile.write('<meta http-equiv="x-ua-compatible" content="IE=9" />');

// And now you can use htmlfile.parentWindow to expose methods not
// natively supported by JScript 5.7.

Array.prototype.forEach = htmlfile.parentWindow.Array.prototype.forEach;
Object.keys = htmlfile.parentWindow.Object.keys;

htmlfile.close(); // no longer needed

// test object
var obj = {
    "line1" : "The quick brown fox",
    "line2" : "jumps over the lazy dog."
}

// test methods exposed from htmlfile
Object.keys(obj).forEach(function(key) {
    WSH.Echo(obj[key]);
});
Run Code Online (Sandbox Code Playgroud)

输出:

敏捷的棕色狐狸
跳过了懒惰的狗。

还有一些其他的方法在这个答案证明- JSON.parse()String.trim()Array.indexOf()