【问题标题】:Why javascript array element can't be accessed with dot notation?为什么无法使用点符号访问 javascript 数组元素?
【发布时间】:2015-09-26 23:18:03
【问题描述】:

为什么不能用点符号访问数组元素?

var arr = ['Apple', 'Mango', 'Pineapple', 'Orange', {name: 'Banana', color: 'yellow'}];

console.log( arr[0] ); // "Apple"
console.log( arr.0 ); // "Apple"
console.log( arr.3 ); // "Orange"
console.log( arr[4].name ); // "Banana"
console.log( arr.4.color ); // "yellow"

换句话说,为什么语言设计者选择禁止以数字开头的标识符?

【问题讨论】:

标签: javascript arrays


【解决方案1】:

因为标识符不允许以数字开头,而x.y中的y是标识符。

为什么x.y 中的y 是标识符?不知道。在适当的邮件列表或 AMA 会话中询问语言设计者。我它使语言规范和解释都变得非常容易。

【讨论】:

  • 换句话说,为什么语言设计者选择禁止以数字开头的标识符?
  • 我想不允许以数字开头以减少解析歧义。如果他们允许foo.4.bar,您将获得标记foo.4.bar,所以现在他们需要相对于其上下文解析4.,这不会' t 给出预期的结果,除非你做了foo.4..bar。然后应该允许十进制数字吗?如果是这样,foo.4.2.bar 将如何被解析?不允许这样做要简单得多。
  • @squint: 对,正如我所说:-)
  • 我应该把评论发给@Yukulélé。似乎需要更多细节。
【解决方案2】:

根据 javascript 的性质,对象的属性名称可以定义如下...

对象属性名称可以是任何有效的 JavaScript 字符串,或者 任何可以转换为字符串的东西,包括空的 细绳。但是,任何不是有效 JavaScript 的属性名称 标识符(例如,具有空格或连字符的属性名称, 或以数字开头)只能使用正方形访问 括号符号。这种表示法在属性时也非常有用 名称是动态确定的(当属性名称不是 直到运行时才确定)。 more...

由于数组的属性名称​​以数字开头,它只能使用square([])括号来访问

属性名称必须是字符串。这意味着非字符串对象 不能用作对象中的键。任何非字符串对象,包括 一个数字,通过 toString 方法类型转换为字符串。

因此,在点表示法的情况下,它会在对象内部查找一个字符串,并且它从不转换在点(.)表示法之后给出的值。出于这个原因,obj.1 无效并且实际上不存在。另一方面,如果是方括号([]),值总是被转换成字符串来查找属性

【讨论】:

    【解决方案3】:

    这是一个老问题,但它似乎最近被编辑过,我认为以前的任何答案都没有真正触及它的核心。

    首先,“为什么语言设计者选择禁止以数字开头的标识符?”不是“为什么不能使用点符号访问数组元素?”换一种说法。它们是完全不同的问题。

    点符号仅用于访问对象成员。数组元素不是对象成员。

    你可以像这样可视化一个数组:

    array = {elements: ['element_1', 'element_2'], length: f(), push: f()...}
    

    您可以看到,即使允许使用数字标识符,您也无法使用 array.0 访问“element_1”。此外,elements 'member' 是一种特殊的事务,解释器只能通过括号表示法处理(据我所知)。

    kieranpotts 的回答对我来说似乎是一个完全有用但被误解的答案 - 也许它被否决了,因为元素不是属性的想法不够明确。

    【讨论】:

    • 我的问题不仅仅针对数组:使用myObj = {'abc': 'foo', '0': 'bar'},我可以访问myObj.abc,但不能访问myObj.0。但是在这种情况下,0myObj 的成员
    • 你可能会猜到我不是 Stack Overflow 的常客。 myObj.0 无效,因为标识符不能以数字开头。这与使用点符号访问的数组项完全不同。很久没有直接与解释器打交道了,但我的猜测是标识符通常不能以数字开头,因为这会使解释的机制更加尴尬。
    【解决方案4】:

    点语法仅用于访问对象的属性。它不能用于访问数组的元素。

    括号符号 [] 用于访问数组的元素。括号符号可以用作访问对象属性的替代方法。但相比之下,点表示法用于对象属性。

    【讨论】:

    • 在去掉问号的情况下重复问题不是答案。
    • 问题是“为什么不能使用点语法访问 [an] 数组元素?”我在前两句话中已经清楚而简洁地回答了。
    • 问题是 “为什么 [is it] 无法使用点语法访问 [an] 数组元素?” 而您所谓的清晰简洁的答案是 “无法使用点语法访问数组元素”?干得好,我猜...
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-08-08
    • 1970-01-01
    • 1970-01-01
    • 2013-01-20
    • 2018-04-11
    相关资源
    最近更新 更多