【问题标题】:Undesrtanding strings constants as object properties将字符串常量理解为对象属性
【发布时间】:2015-10-02 01:36:34
【问题描述】:

谁能解释一下 Crockford 在谈到 字符串常量 时的意思:

"当下标是合法标识符形式的字符串常量时,可以使用点表示法。"

http://javascript.crockford.com/survey.html

AFAIK 他将常量称为对象属性,但如果它们的值可能随时更改,为什么还要称为常量。

或者,他是否将这些称为常量,因为一旦定义了属性名称,它就永远不会改变?

如果我应该根据他的话制作一个伪代码,我会做这样的事情(注意这个代码只是为了澄清我的想法,它实际上不是javascript代码,尽管相同):

const const1 = 'name';
object person = {name = 'Ed'};
print person.const1 //it should print "Ed"

非常感谢你

【问题讨论】:

  • 对于数字或表达式,您不能使用点符号。你用方括号代替。
  • 如果const1 不是person 对象的属性,则不会打印'Ed'。另外,请不要使用伪代码。
  • 我不知道 constants 在 javascript 中的使用,这就是我选择使用类似伪代码的编码的原因。这样的文本让我很困惑:当下标是字符串常量时
  • 他在这里通俗地使用“常数”这个词。他的意思是“特定的固定字符序列”。这与const 字符串完全不同,尽管它被称为const,但它仍然是一个变量,并且将在person[const] 中使用。请记住,当 Crockford 编写此 JavaScript 时,甚至没有 const 变量类型。
  • @torazaburo 非常感谢。现在对我来说很有意义。我在这种“口语化”的使用中挣扎了很多。非常感谢您的评论。

标签: javascript string constants


【解决方案1】:

"下标为字符串常量时可以使用点表示法 以合法标识符的形式。”

这意味着一个字符串值在不变的意义上是恒定的,可以用来读取和写入相同的属性值。消息是,尽管任何字符串值都可以在括号表示法中使用,但它必须是使用点表示法编写的合法标识符。

例如someObject["propertyName"]someObject.propertyName 的含义相同,使用点表示法。两者都是有效的并且可以工作。然而,虽然someObject["too....many...dots"] 是有效的并且使用括号表示法工作,但someObject.too....many...dots 不是合法标识符并且不起作用。


回复评论:
  1. 将“常量字符串”视为程序员用来访问属性值的名称:它在编写时是固定的,在代码运行时不会更改。

  2. 使用点表示法的属性名称不使用引号。 object."property" 总是非法的。

  3. 对象属性名和变量名可以同名但不能引用同一个东西

    x;      // look for variable x in function scope.
    obj.x;  // look for property x of object obj
    var x = obj.x; // transfer the value of obj.x to variable x
    
  4. 括号表示法中的属性名称是括号内的字符串值。如果这是一个字符串文字,它将被引用。如果它不是字符串文字,它将被评估为 javascript 表达式,结果用作属性名称。

    obj.color = "red";
    var prop = "color"
    obj[ prop]; // value of property specified by the expression (prop) is "red"
    

【讨论】:

  • 这部分不变是主要的;我猜如果他写了“当下标是合法标识符形式的 string 时可以使用点表示法。”,没有单词 constant,它这意味着使用任何作为合法标识符的字符串文字(使用引号)或字符串变量(var x = 'property')都可以:object."property" = 3; 甚至var x = "property"; object.x = 3; //making reference to object.property instead of object.x
【解决方案2】:

Crockford 在这里通俗地使用“常数”这个词。他的意思是“特定的固定字符序列”。这与 ES6 const 字符串完全不同,尽管它被称为 const,但它仍然是一个(不可变的)变量,当然,它就像任何其他持有一个键的变量一样, 与person[const] 一样使用。请记住,当 Crockford 编写此 JavaScript 时,甚至没有 const 变量 typej,显然这不是他所指的。

【讨论】:

    【解决方案3】:

    JavaScript 中的字符串是原始的不可变值,这就是他使用常量这个词的原因,他说当属性标识符是合法的(单词)字符串值时,您可以在对象上使用点表示法。

    你只是混合了两个不同的概念。

    @Traktor53 中的示例很好地解释了 Crockford 的含义。

    【讨论】:

      【解决方案4】:
      • object.hello 好的。
      • object.2 失败,因为 2 不是有效标识符。
      • object.hello world 因空间问题而失败,
      • object.a-b你怎么看?

      【讨论】:

      • 嗨@Jaromanda X,我明白这一点,但是,为什么他将字符串常量指代,例如您的示例hello,来自object.hello
      • 如果你理解了答案,并且没有从中学到任何新东西,那么你可能问错了问题
      【解决方案5】:

      这就是我所相信的

      var obj = {'You can have spaces here' : 'value 1', cantHaveSpacesHere: 'value 2'};
      console.log(obj['You can have spaces here']);
      console.log(obj.cantHaveSpacesHere);
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2021-10-28
        • 1970-01-01
        • 2012-03-29
        • 1970-01-01
        • 2019-05-11
        • 1970-01-01
        相关资源
        最近更新 更多