【问题标题】:Javascript literal notation for array of objects对象数组的 Javascript 文字表示法
【发布时间】:2011-12-20 08:10:43
【问题描述】:

我试图理解一些用 Javascript 编写的代码,但我被困在语法上。

var connections = {}; // I know '{}' means new Object()
var messages = {};

对象包含变量路径、版本等,但是在代码中以下几行是做什么的?

connections[ path ] = connections[ path ] || [];
messages[ path ] = messages[ path ] || { version: 0, body: ''};

【问题讨论】:

  • 悬而未决,{}new Object() 不同(即使Object 未被覆盖)。但它已经足够接近了。差异是微妙的,您可能永远不会注意到差异。
  • @tri:如果您实际上并没有说出区别是什么,我不确定指出一个小的迂腐细节错误是否有帮助。
  • @trinithis——说吧。 ES5 11.1.5 说:The production ObjectLiteral : { } is evaluated as follows: 1. Return a new object created as if by the expression new Object() where Object is the standard built-in constructor with that name。那么“细微差别”是什么?
  • 对不起,我真的很累。由于某种原因,我认为有细微的差别,但我不记得了。

标签: javascript arrays literals notation


【解决方案1】:

由于connectionsmessages 是对象,[] 不表示数组索引,而是访问成员的语法,其中变量用于查找变量的名称。

var path = 'x'
connections[path] = connections[path] || [];

以上,因为path = 'x'等于

connections.x = connections.x || [];

也就是说,如果两个对象中以path的值命名的成员存在,则保留它(将其当前值赋给自己),否则(||在这里用于合并)创建一个新的空数组,或新的{ version: 0, body: '' }

请注意,合并/逻辑 OR 可以轻松地从左到右链接。例如,在某些情况下,您可能想做这样的事情:

function createItem(color) {

   // if a color is specified in the arguments, use that
   // otherwise, if a color is specified in the settings object for this instance
   // of the current user control, use that. otherwise, fall back to the global
   // default values. if none of these settings have been defined, use black.

   color = color || instanceSettings.defaultColor 
                 || globalSettings.defaultColor
                 || '#000000';

   ...

}

【讨论】:

    【解决方案2】:

    如果路径属性之前没有被初始化,或者它包含 null 或 false 或 0,它基本上会初始化它。

    换句话说(或其他代码):

    if (connections[path] === null || connections[path] === undefined || connections[path] === 0 || connections[path] === false) {
        connections[path] = [];
    } else {
        connections[path] = connections[path];
    }
    

    messages[path] 也一样,只是它用一些对象而不是空数组来初始化它。

    【讨论】:

      【解决方案3】:

      关键是理解逻辑 OR (||) 运算符。在 JavaScript 中,首先测试运算符左侧的表达式。如果它解析为 true,则返回该表达式;如果它解析为 false,则返回右侧的表达式。这是为变量分配默认值的好方法。

      其次,connections[path] 没有访问数组的元素。如果path 解析为字符串,则connections[path] 等价于connections.path,它只是访问connections 对象的那个成员。

      connections[path] = connections[path] || [];

      编写此代码的人希望路径成员是一个空数组(如果没有别的)。这一行本质上是检查connections[path] 是否为truthy。如果那个path 成员有什么东西,它会被不管;如果不是,它将是一个空数组。

      messages[path] = messages[path] || { version: 0, body: '' };

      除了默认值是一个包含两个成员的对象而不是一个空数组之外,这与上一行的功能相同。

      【讨论】:

        【解决方案4】:
        connections[ path ] = connections[ path ] || [];
        

        大致翻译成

        connections[ path ] = connections[ path ] != null ? connections[ path] : [];
        

        在这种情况下,这是为connections[path] 设置默认值的便捷方法(即,如果尚未设置值,则将值设置为[]

        在某些语言(例如 Ruby)中,这可以写得更短

        connections[path] ||= []
        

        【讨论】:

          【解决方案5】:

          || 运算符表示 OR 与 connections[ path ] = connections[ path ] || [];

          我们正在检查是connections[ path ] === null 还是connections[ path ] === undefined,如果是这种情况,我们将connections[ path ] 分配给一个空数组。

          对于messages[ path ],我们执行相同的检查,如果它为空或未定义,我们将其赋值为{ version: 0, body: ''}

          【讨论】:

          • 代码实际上是在检查任何 falsy 的东西;当用作条件时解析为 false 的任何内容。除了nullundefined,它还会检查0''falseNaN
          • @David Hedlund - 好点,我同意上述内容,我急于在这里得到任何答案,我没有列出执行的完整检查。
          【解决方案6】:

          例如,让连接和消息成为如下对象。

          var connections={
            "path":"http://www.xyz.com",
            "version":"1.2.0"
          };
          var messages={ 
               "text':"This is message",
               "path":"http://www.xyz.com",
               "version":'1.2.0',
               "body":""
           };
          

          现在下面的代码如下所示: 1.如果上述对象中不存在路径,则将其分配为空白字符串。 2.同样,消息的路径将是对象“路径”中存在的路径。否则,它将是 'version' 和 'body' 的对象

          connections[ path ] = connections[ path ] || [];
          messages[ path ] = messages[ path ] || { version: 0, body: ''};
          

          连接和消息只是 javascript 对象的 JSON 表示。因此,connections[path] 与 connections.path 相同。签到 ||如果对象中不存在或未定义实际值,则用于分配空白值。

          【讨论】:

          • 我认为这个例子有点令人困惑,因为messages 本身包含versionbody,这会导致读者认为这些可能是可能会发生变化的成员(其中并非如此,我认为您也不是这样),而且还因为它暗示 path = 'path' 我认为首先使用变量很明显,它不会永远是。
          • 谢谢大卫!实际上,您的解释似乎更正确。
          【解决方案7】:

          我应该激发你的想象力

          一个 || b 返回第一个不包含任何错误值的元素。

          connections[ path ] || []; 
          //  return [] ( empty array) if connections[ path ] is return false ( or undefined, 0, [], "", NaN etc)
          

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 2012-03-28
            • 2010-10-04
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2011-07-07
            • 1970-01-01
            • 2022-01-23
            相关资源
            最近更新 更多