Javascript编程:点号[.]是否总是操作符?

4

在JavaScript中,点号.是否总是一个运算符?

例如:

AnObject.aMethod()

有没有例子,其中点(.)不是运算符的情况?

FYI:这是一个成员运算符 - nnnnnn
4个回答

9

编号。

  • "字符串。"
  • /正则表达式/
  • 1.2 // 数字
  • // 注释。

@Quentin:点号也可以是对象属性(或方法名)的一部分。例如:var obj={".":14};obj[".ss."]=15;alert(obj["."]*obj[".ss."]); 将显示 210。而 obj.hasOwnProperty(".") 则返回 true。 - Andrew D.
2
@Andrew D — 啊,但那些都是字符串 :) - Quentin

5

这不是数字字面量中的运算符。

var x = 12.5;

恭喜!距离您达到一个重要的整数里程碑只有12768步了。(http://xkcd.com/1000/) - nnnnnn
@nnnnnn - 哈!顺便恭喜你达成了10K。你试用过那些10K的工具了吗? - Adam Rackis
谢谢。我已经批准(和拒绝)了一些编辑,但大致就是这样。回到主题上来,你可以在你的答案中添加正则表达式和字符串字面量。 - nnnnnn
@nnnnnn 啊 - 正则表达式。为什么不添加一个这样的答案呢?我不确定是否应该计算字符串字面量 - 那只是纯文本。但在正则表达式中,点实际上是有意义的。 - Adam Rackis

5
尽管通常将成员访问 . 描述为运算符,但我认为在像Java、Javascript、C或C++这样的语言中,这有些不正确。其他二元运算符在左侧和右侧都有表达式,而成员访问运算符不允许右侧有表达式,只允许一个字段标识符...也就是一种非常特定的语法形式。例如,对于其他二元运算符,左结合性或右结合性有意义(即a op b op ca op (b op c)还是(a op b) op c),而对于成员访问,这是一个无意义的问题,因为只有其中一种形式在语法上是有效的(你甚至不能写a.(b))。同样适用于优先级。如果问题不是关于结合性或优先级的运算符,而只是表达式中字符的问题(即问题是点字符在表达式中不表示成员访问时),那么显然你有浮点数(其中它扮演小数点的角色)、字符串字面量中的点字符(它扮演自己...单个点字符的角色)以及正则表达式中的点字符(根据是否转义,它表示本身或“任何字符”)。正如Quentin提醒我的那样,注释中也可以有点,其含义留给人类解释。

1
MDN 称它们为运算符。 - Quentin
ECMA在这方面非常准确,不称点为“运算符” - 在标准中它被称为“点表示法”。 - georg
点运算符是从左到右结合的,供您参考。 - user47322
1
@Quentin:“operator”术语通常用于通过使用优先级和结合性表格来简化语法描述。然而,对于成员访问语法来说,这没有任何意义,因为结合性根本没有意义,而优先级只能对左部分有限地产生意义。它可以被视为一种一元后缀运算符(通过将点和后面的成员名称粘在一起),但即使在这种情况下,它也是语法中的一种例外,因为名称不是固定的。当然,他们可以自由地使用操作符名称以任何他们喜欢的含义。 - 6502
@CharlieSomerville:关于成员访问语法的左右结合性的问题是没有意义的,因为所谓的“右部”只能是单个标识符,而不是表达式。所以a.b.c的意思是(a.b).c不是因为结合规则,而是因为语法规则是a.(b.c)会导致语法错误。当语法本身具有歧义时,结合和优先级规则才会发挥作用……但成员访问并非如此情况。 - 6502

1
除了已经提到的(如数字、字符串和正则表达式)之外,标点符号可能并不总是有效。因此,在这种情况下,如果您尝试访问的属性具有特殊字符,则 . 将不是一个有效的运算符:

var obj = {
    'prop1' : null,
    'prop-2' : null
};
obj.prop1;//it works
obj.prop-2;// it doesn't work. you should access with via the brackets operator : obj['prop-2'];

我的观点是,有些情况下,点号并不总是一个有效的运算符(即使你认为它应该是)。


1
这是一个有效的运算符,无效的标识符是 prop-2 - Quentin

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接