我有以下javascript -
var trim = intsAsJSArray.replace(/[\[\]]/g, "");
var data = trim.split(",");
data = data.map(function (d) {
return +d;
});
然而,这在IE中失败并出现错误 -
Error: Object doesn't support property or method 'map'
这很混乱,因为它适用于Chrome和FireFox。这是为什么?
答案 0 :(得分:4)
IE8 doesn't support大多数ES5阵列方法 - 包括Array.map
。因此,您必须使用扩展Array.prototype
的{{3}},或者切换到附加到自己对象的ES5方法的库 - 例如jQuery(ES5 shim)和Underscore({ {3}})。
当您使用jquery
标记标记您的问题时,您很可能已经使用了一个,所以只需更改您的代码就足够了:
var data = $.map(trim.split(","), Number);
答案 1 :(得分:2)
Array#map
。 IE8在ES5规范完成之前问世,并且不包括大多数ES5功能(包括map
)。 IE9有Array#map
和大多数(但不是全部)其他ES5添加; IE10 +具有完整的ES5功能。 Here's a rundown of ES5 support in various browsers
如果您搜索“es5 shim”,您会找到各种选项来添加可追溯添加到旧环境(包括Array#map
)的内容。
由于您已标记了问题jquery
,因此可以使用the $.map
function jQuery supplies。
答案 2 :(得分:0)
IE8 doesn't support map
,因为它已添加到ES5中。
如果您想为其添加垫片,请查看此polyfil from the MDN website:
if (!Array.prototype.map) {
Array.prototype.map = function (fun /*, thisArg */ ) {
"use strict";
if (this === void 0 || this === null)
throw new TypeError();
var t = Object(this);
var len = t.length >>> 0;
if (typeof fun !== "function")
throw new TypeError();
var res = new Array(len);
var thisArg = arguments.length >= 2 ? arguments[1] : void 0;
for (var i = 0; i < len; i++) {
// NOTE: Absolute correctness would demand Object.defineProperty
// be used. But this method is fairly new, and failure is
// possible only if Object.prototype or Array.prototype
// has a property |i| (very unlikely), so use a less-correct
// but more portable alternative.
if (i in t)
res[i] = fun.call(thisArg, t[i], i, t);
}
return res;
};
}
否则只需编写自己的函数来创建一个具有输入值的新对象。