我有兴趣查找或编写伪填充程序以允许Array.prototype.slice支持非数组(在浏览器中以相同的方式工作)。
我知道有NamedNodeMap,HTMLCollection等接口可以转换,例如在Firefox中,但不能转换为IE< = 8。
两个问题:
Array.prototype.slice.call()
时,我可以使用哪种类型的鸭子来全面支持某些浏览器支持的所有非数组类型?例如,我可能会将item
作为函数进行duck-type,并在提供类似0
的样本数时尝试获取有效值。 Firefox和IE8都接受长度,即使是字符串(解析为整数)。像Firefox这样的浏览器是否可以与任何DOM对象一起使用,只要它具有length
属性?答案 0 :(得分:3)
这里有一个recently asked and related question导致重新发现这个旧问题。
MDN page for .slice()上有Array.prototype.slice()
的填充,可以与所有浏览器一起制作任何类似数组的对象的副本。因为,只有IE的旧版本才需要这个polyfill,所以polyfill从对旧版IE中失败的东西开始进行特定的测试(因此它只在需要时自行安装)。
try {
// Can't be used with DOM elements in IE < 9
_slice.call(document.documentElement);
} catch (e) {
// we know we're in IE < 9 here
}
polyfill然后使用标准测试来查看对象是否是真实数组:
// test if this is an actual array
if (Object.prototype.toString.call(this) === '[object Array]')
因此,在实数组中,使用常规内置.slice()
。然后,polyfill继续实现它自己的复制功能,只需使用.length
和[index]
来读取在任何类似数组的对象上安全的内容,并返回复制到新的内容阵列。
针对您的具体问题:
IE确实不能使用参数对象,正如有些人所说的那样吗? (我只安装了IE 10,即使在IE5怪癖/ IE7模式下也能正常工作(并且手机制作的数组对象也可以。)
arguments对象是一个原生的Javascript类数组对象(不是宿主对象而不是真正的数组)所以没有特别的怪癖可以复制它。在arguments
模式下,strict
对象中添加了一些新限制,但仍可以复制它。制作适用于所有浏览器的arguments
对象副本的常用方法是:
var items = Array.prototype.slice.call(arguments, 0);
必须使用Array.prototype.slice
因为参数对象本身不是数组,并且没有数组方法。
当使用Array.prototype.slice.call()时,我可以使用什么样的duck-typing等来全面支持某些浏览器支持的所有非数组类型?例如,我可能将item作为函数进行duck-type,并在提供类似于0的样本数时尝试获取有效值.Firefox和IE8都接受长度,即使是字符串(解析为整数)。像Firefox这样的浏览器是否可以与任何DOM对象一起使用,只要它具有长度属性?
Object.prototype.toString.call(this) === '[object Array]'
是测试某些东西是否是实际数组的万无一失的方法。我不知道任何鸭子类型的方法,看看是否有类似于数组的对象,而不是测试该对象是否具有.length
属性,以及是否可以使用[index]
来读取值而不会导致异常。
如果您希望尽可能多地使用旧版浏览器以及尽可能多种类型的非数组对象,那么我建议您在MDN页面上使用上面链接的polyfill,因为它就是这样的专为...而设计。
由于世界(最终)开始超越IE的旧版本,如果你现在只能支持IE9及更高版本,那么你可以在所有类似数组的对象上使用Array.prototype.slice.call()
方法(任何东西)它具有.length
属性,该属性对应于可通过[i]
使用整数索引访问的项目数,并且您甚至不需要填充。