![](/img/trans.png)
[英]Trouble with Javascript object properties - Eloquent Javascript example
[英]Eloquent javascript example and usage of strings in properties
我目前正在阅读Eloquent Javascript ,这是一个有关属性以及这些属性中字符串使用情况的问题。
我正在看第4章中的两个对象:
http://eloquentjavascript.net/code/jacques_journal.js
和
var journal = [
{events: ["work", "touched tree", "pizza",
"running", "television"],
squirrel: false},
{events: ["work", "ice cream", "cauliflower",
"lasagna", "touched tree", "brushed teeth"],
squirrel: false},
{events: ["weekend", "cycling", "break",
"peanuts", "beer"],
squirrel: true},
/* and so on... */
];
问题:属性名称是否需要像Jacques Journal对象中的字符串? 还是可以将它们仅列为上述对象中的事件和松鼠?
无论哪种情况,此代码仍然有效:
function tableFor(event, journal) {
return journal.events.indexOf(event)
}
tableFor("pizza", JOURNAL) (notice that the JOURNAL object is found within the link provided)
每个人都使用什么来测试带有大量缩进的Javascript代码? 我尝试在chrome中使用开发工具,但必须手动使用空格键输入缩进很烦人。 您可以在Sublime Text中测试javascript代码吗?
var foo = { "bar": 123 };
var foo = { bar: 123 };
以上两行JavaScript完全相同。 无论哪种情况,您都可以通过两种不同的方式访问"bar"
属性:
console.log( foo.bar ); # => 123
console.log( foo["bar"] ); # => 123
当密钥不是有效的JavaScript标识符时,只需使用引号语法( { "bar": 123 }
)。 引用MDN :
JavaScript标识符必须以字母,下划线(_)或美元符号($)开头; 后续字符也可以是数字(0-9)。 因为JavaScript区分大小写,所以字母包括字符“ A”至“ Z”(大写)和字符“ a”至“ z”(小写)。
从JavaScript 1.5开始,您可以在标识符中使用ISO 8859-1或Unicode字母,例如å和ü。 您也可以使用\\ uXXXX Unicode转义序列作为标识符中的字符。
例如,这是有效的:
var obj = { "": 1,
"!": 2,
"foo bar": 3,
"99bottles": 4 }
但是,如果没有引号,则其中任何一个都将引发错误。
还有另外一次需要使用引号的情况,那就是您要使用JavaScript中保留字的键,例如return
或else
或class
。 有时您可以做得很好:
var obj = { else: 123 }
console.log( obj.else ) # => 123
...但是,这取决于JavaScript解析器能否告诉您将其用作属性名而不是关键字。 例如,如果您现在打开JavaScript控制台并键入:
{ else: 123 }
...您将收到一个SyntaxError。 因此,对于在JavaScript中具有特殊含义的单词(此处有完整列表 ),最好使用引号:
var obj = { "else": 123 }
在硬币的另一面(也就是说,从您创建的对象中取出东西),故事几乎是相同的。 假设我们有这个对象:
var obj = { foo: 1, // note that we can mix quoted and non-quoted if we want
"": 2,
"99bottles": 3,
"else": 4,
"foo bar": 5,
$gt: 6 }
对于有效标识符的键,我们可以使用常规的“点符号”来访问属性,但是对于其他键,我们必须使用“括号符号”:
obj.foo # => 1
obj[""] # => 2
obj.99bottles # => SyntaxError: Unexpected token ILLEGAL
obj["99bottles"] # => 3
obj.else # => 4
obj["foo bar"] # => 5
obj.$gt # => 6
最后,值得注意的是JSON是JavaScript的子集 。 这是有效的JavaScript,但不是有效的JSON对象:
{ foo: "bar" }
JSON属性名称必须带引号。 以下是有效的JSON:
{ "foo": "bar" }
首先,您的最后一个片段将引发以下错误:
Uncaught TypeError: Cannot read property 'indexOf' of undefined
这是正确的,因为您的journal
数组中没有值"pizza"
元素。 您的数组中只有一些json对象。 因此,您必须遍历所有对象以找出squirrel
属性的值。
这样的事情会起作用:
function tableFor(event, journal) {
for(var i=0;i<journal.length;i++){
if(journal[i].events.indexOf(event) > 0) return journal[i].squirrel;
}
return false;
}
请记住,javascript中的所有内容都是一个对象,因此您可以通过在其上设置任意属性来“滥用” Array对象。 将数组用于数字索引数据,将对象用于非数字键。
此stackoverflow 帖子中的更多信息
有很多方法可以测试您的JavaScript ...您可以在线(例如jsfiddle )或在浏览器的控制台中进行测试。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.