有人可以解释一下Crockford在谈到字符串常量时的意思:
"当下标是合法标识符形式的字符串常量时,可以使用点表示法。"
http://javascript.crockford.com/survey.html
AFAIK他将常量称为对象属性,但是如果它们的值可能随时改变,为什么要调用常量。
或者,他是否将这些作为常量引用,因为一旦定义了属性名称,它就永远不会改变?
如果我应该根据他的话做一个伪代码,我会做这样的事情(请注意,这段代码只是为了澄清我的想法,它实际上并不是javascript代码,尽管它是相同的):
const const1 = 'name';
object person = {name = 'Ed'};
print person.const1 //it should print "Ed"
非常感谢你
答案 0 :(得分:1)
"当下标是字符串常量时,可以使用点表示法 以合法标识符的形式。"
这意味着在未更改的意义上,常量的字符串值可用于读取和写入相同的属性值。消息是虽然任何字符串值都可以在括号表示法中使用,但它必须是使用点表示法编写的合法标识符。
例如,someObject["propertyName"]
表示使用点表示法与someObject.propertyName
相同。两者都有效且有效。但是,虽然someObject["too....many...dots"]
有效且使用括号表示法,但someObject.too....many...dots
不是合法的标识符,并且不起作用。
<小时/> 回复评论:
考虑&#34;常量字符串&#34;作为程序员用来访问属性值的名称:它在编写时是固定的,并且在代码运行时不会更改。
使用点表示法的属性名称不使用引号。
object."property"
始终是非法的。
对象属性名称和变量名称可以具有相同的名称但不要引用相同的内容。
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
括号表示法中的属性名称是括号内的字符串值。如果这是一个字符串文字,它将被引用。如果它不是字符串文字,它将被评估为javascript表达式,结果用作属性名称。
obj.color = "red";
var prop = "color"
obj[ prop]; // value of property specified by the expression (prop) is "red"
答案 1 :(得分:1)
Crockford在这里通俗地使用“常量”这个词。他只是指“一个特定的固定字符序列”。这与ES6 const
字符串完全不同,尽管被称为const
,它仍然是一个(不可变的)变量,当然,它与其他任何字符串一样持有一个密钥的变量,可以在person[const]
中使用。请记住,当Crockford写这个时,JavaScript甚至没有const
变量typej,显然这不是他所指的。
答案 2 :(得分:1)
JavaScript中的字符串是原始的不可变值,这就是他使用单词constant的原因,他说的是当属性标识符是合法(字)字符串值时,你可以在对象上使用点表示法。
你只是混合了两个不同的概念。
来自@Traktor53的例子是解释Crockford意味着什么的好方法。
答案 3 :(得分:0)
object.hello
好的。 object.2
失败,因为2不是有效的标识符。 object.hello world
因空间而失败,object.a-b
你怎么看?答案 4 :(得分:0)
这就是我所相信的
var obj = {'You can have spaces here' : 'value 1', cantHaveSpacesHere: 'value 2'};
console.log(obj['You can have spaces here']);
console.log(obj.cantHaveSpacesHere);