代码之家  ›  专栏  ›  技术社区  ›  Takit Isy Surendra

通过常量字符串建立索引

  •  0
  • Takit Isy Surendra  · 技术社区  · 8 年前

    我在另一个问题的循环中玩一个常量字符串
    这是:

    str = "abcd";
    for (i = 0; i < 4; i++) {
      console.log(str[i]);
    }

    我最终还是这样做了:

    for (i = 0; i < 4; i++) {
      console.log("abcd"[i]);
    }

    在我尝试之前,我不知道这种编码是有效的!
    这种做法叫什么?
    是否应出于任何技术原因避免?

    谢谢你的回答。

    4 回复  |  直到 7 年前
        1
  •  3
  •   T.J. Crowder    8 年前

    这种做法叫什么?

    我不知道它有什么具体的名字。您只是在循环中使用字符串文字。

    是否应出于任何技术原因避免?

    对于字符串文字,这可能无关紧要,因为字符串文字定义了基本字符串(并且可能被JavaScript引擎重用,因为它们是不可变的)。但是,如果您每次都创建一个对象,那么与只创建一次并重用它相比,这将是不必要的开销。

    例如,如果您正在这样做:

    for (var i = 0; i < 4; i++) {
      console.log([1, 2, 3, 4][i]);
    }

    该代码告诉JavaScript引擎创建该数组 每次 循环体运行,速度很快,但不是 瞬间的 (如果代码的使用量足够大,似乎值得一试,JavaScript引擎可能能够分析代码并对其进行优化,但这是另一个主题。)

        2
  •  0
  •   krishnashu    8 年前

    尝试的方法是可以的,但不是很有用,因为如果在循环中指定字符串,则它对循环是静态的。

    建议使用变量代替“硬编码”值。

        3
  •  -1
  •   Scott Marcus    8 年前

    您的代码真正做的就是去掉变量并直接索引“类似数组”的对象。

    字符串为 "array-like" objects .他们有 .length 属性和可以像数组一样编制索引。但是,它们不是实际的阵列,不支持完整的阵列API。JavaScript中充满了“类似数组”的对象,它们肯定是不可避免的。相反,能够利用这一点是语言的一大特点。知道什么时候有一个实际的数组以及什么时候有一个“类似数组”的对象非常重要,这样就不会错误地使用后者。

    所以,因为 "abcd" 是类似于数组的,没有理由不能在其后面放置索引:

    "abcd"[2]
    
        4
  •  -1
  •   ztech    8 年前

    斯科特·马库斯很好地解释了这里发生的事情。至于是否应该避免这种情况,许多人认为最好使用chatAt()而不是括号表示法来访问字符串中的字符。也就是说,因为:

    1. 括号表示法是ECMAScript 5的一部分,因此不受普遍支持

    2. 数组或哈希对象的括号表示法的相似性可能会令人困惑。例如,字符串是不可变的,因此不能像使用数组或哈希那样在某个索引处设置字符串的值。因此,使用chatAt()可以说明人们不应该期望这是可能的。

    资料来源: string.charAt(x) or string[x]?