我们都知道 Strings
有点像 Array
。您甚至可以对其应用一些数组方法并从中受益,如下例所示。
[].filter.call('abcdef',function(val){
return val<'e';
});
此外,
var a='xyz';
我可以使用 a[0]
访问第一个元素,或者我可以像调用 Array
一样调用 a.length
我的问题是为什么 String
表现得像 Array
。如果是这样,为什么我在检查它是否是 Array
的实例时得到下面的 false
。 String
Array-like
吗?
'a' instanceof Array
最佳答案
Array.prototype.filter
真正需要的是被迭代的变量具有 length
属性,并且该变量具有数字索引值。请参阅(部分)polyfill :
var len = this.length >>> 0,
res = new Array(len), // preallocate array
t = this, c = 0, i = -1;
if (thisArg === undefined){
while (++i !== len){
// checks to see if the key was set
if (i in this){
if (func(t[i], i, t)){
res[c++] = t[i];
}
}
}
}
字符串满足此条件 - 字符串具有 length
属性,并且在字符串上访问的数字索引解析为单个字符。
但是你可以对任意对象做同样的事情:
const obj = {
0: 'foo',
1: 'bar',
length: 2
};
const result = [].filter.call(obj, val => val.startsWith('f'));
console.log(result);
你可以说 obj
也是类数组,因为它有一个 length
属性和数字索引。大多数数组方法(如 .filter
、.reduce
等)都可以在类数组对象上被.call
调用,即使这些对象不是实际数组。
(从技术上讲,您也可以在非类数组对象上调用数组方法,它不会做任何有用的事情——可能不会执行迭代)
关于javascript - 为什么 String 的行为像 Array ? - JS,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56373004/