javascript - 为什么 String 的行为像 Array ? - JS

标签 javascript arrays string types

我们都知道 Strings 有点像 Array。您甚至可以对其应用一些数组方法并从中受益,如下例所示。

[].filter.call('abcdef',function(val){
    return val<'e';
});

此外,

var a='xyz';

我可以使用 a[0] 访问第一个元素,或者我可以像调用 Array 一样调用 a.length

我的问题是为什么 String 表现得像 Array。如果是这样,为什么我在检查它是否是 Array 的实例时得到下面的 falseString 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/

相关文章:

javascript - Wordpress 收藏夹插件 - 从 cookie 中读取一系列帖子

python - 使用字符串含义列表从 int 'flags' 的 ndarray 创建字符串 ndarray

javascript - 将 Php 数组传递给外部 Javascript 文件

android - 字符串在android中追加格式

javascript - 使用javascript获取文本文件内容

javascript - ng-model 使用 ng-options 获取属性值

javascript - 使用 body onload 的替代方法

javascript - jQuery 如何选择 <foo.bar></foo.bar> 节点

javascript - 为瓷砖游戏制作 AI

java - 当用户输入特定字符串时如何跳出循环?