繁体   English   中英

出色的javascript示例和属性中字符串的用法

[英]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中保留字的键,例如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对象。 将数组用于数字索引数据,将对象用于非数字键。

此stackoverflow 帖子中的更多信息

有很多方法可以测试您的JavaScript ...您可以在线(例如jsfiddle )或在浏览器的控制台中进行测试。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM