冗长的javascript示例和字符串在属性中的用法

Eloquent javascript example and usage of strings in properties

本文关键字:属性 字符串 用法 javascript      更新时间:2023-09-26

我目前正在学习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... */
];

问题:属性名称是否需要像JacquesJournal对象中那样是字符串?或者它们可以在上面的对象中被列为事件和松鼠吗?

在任何一种情况下,这个代码仍然有效吗:

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中使用Dev工具,但不得不用空格键手动键入缩进,这很烦人。你能在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"(小写)。

从JavaScript1.5开始,您可以在标识符中使用ISO8859-1或Unicode字母,如å和ü。您也可以使用''uXXXX Unicode转义序列作为标识符中的字符。

例如,这是有效的:

var obj = { "": 1,
            "!": 2,
            "foo bar": 3,
            "99bottles": 4 }

但如果没有引号,任何一个都会出现错误。

还有一次,引号是必要的,那就是您希望在JavaScript中使用一个保留字键,如returnelseclass有时你可以做得很好:

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对象。对数字索引数据使用Array,对非数字键使用对象。

更多信息在此堆叠后

有很多方法可以测试您的javascript。。。您可以在线(例如jsfiddle)或在浏览器中的控制台中执行此操作。