在唯一性很重要的情况下,描述性语句可以与JavaScript常量一起使用吗?

在唯一性很重要的情况下,描述性语句可以与JavaScript常量一起使用吗?,javascript,google-chrome-extension,constants,Javascript,Google Chrome Extension,Constants,我的Chrome扩展使用了许多常量,特别是用于。例如,消息发送者可能有: var message = { from: 'content', subject: 'dataReady', data: data }; var port = chrome.runtime.connect({ name: 'main' }); port.postMessage(message); 消息发送者使用的常量为:content、dataReady和main。消息接收器对常量的使用类似: p

我的Chrome扩展使用了许多常量,特别是用于。例如,消息发送者可能有:

var message = {
  from: 'content', 
  subject: 'dataReady', 
  data: data
};

var port = chrome.runtime.connect({
  name: 'main'
});

port.postMessage(message);
消息发送者使用的常量为:contentdataReadymain。消息接收器对常量的使用类似:

port.onMessage.addListener(function(msg) {
    if ((msg.from === 'content') && 
      (msg.subject === 'dataReady')) {  
        // Do something with data 
        // ... in msg.data
    }
}
消息接收器使用的常量为:内容数据就绪。如果消息接收器发送回复,它也将使用常量main

这些常量的值是不重要的,因为它们必须是唯一的,并且对程序员有广泛的意义。我的Chrome扩展还使用了更“传统”的常量,其中值是有意义的,例如
var MAX_AGE=30

为了防止全局名称空间与常量混淆,我有一个包含所有常量的JavaScript对象,按逻辑分组并保存在一个单独的
constants.js
文件中:

var constants { 
  'actors' : {
    // Content script embedded on site foo.com.
    'content' : 'content',
    // Extension UI loaded when icon clicked.
    'popup' : 'doActionB'
  },
  'subjects' : {
    // The content script has finished loading data.
    'dataReady' : 'dataReady',
    // The content script has refreshed data from user.
    'updateReady' : 'updateReady'
  },
  'channels' : {
    // Main channel used for messaging.
    'main' : 'main'
   },
  'MAX_AGE' : 30,
}
…然后在我的Chrome扩展中使用:

port.onMessage.addListener(function(msg) {
    if ((msg.from === constants.actors.content) && 
      (msg.subject === constants.subjects.dataReady)) {  
        // Do something with data 
        // ... in msg.data
    }
}
太好了,所以我的所有常量都在一个单独的文件中的一个位置,并带有注释

然后我想,也许我可以通过使常量值更具描述性来更好地利用它们:

var constants { 
  'actors' : {
    'content' : 'Content script embedded on site foo.com.',
    'popup' : 'Extension UI loaded when icon clicked.'
  },
  'subjects' : {
    'dataReady' : 'The content script has finished loading data.',
    'updateReady' : 'The content script has refreshed data from user.'
  },
  'channels' : {
    'main' : 'Main channel used for messaging.'
   },
  'MAX_AGE' : 30,
}
这样就不需要注释了,因为这些常量的值是不相关的,所以我应该没问题

问:这是个坏主意、坏习惯还是有更好的方法

更新了以包含@Basic提供的公认答案。我特别喜欢这个解决方案,因为它允许用明显递增的整数值来强调值的不重要。唯一的缺点是通道名称必须是字符串

var constants = {    
    'actors' : {
    // Content script embedded on site foo.com.
    'content' : 1,
    // Extension UI loaded when icon clicked.
    'popup' : 2
    },
    'subjects' : {
    // The content script has finished loading data.
    'dataReady' : 1,
    // The content script has refreshed data from user.
    'updateReady' : 2
    },
    'channels' : {
    'main' : 'main'
    },
    'MAX_AGE' : 30,
}

出于以下几个原因,我倾向于不喜欢后一种实现:

  • 这是不明确的,因为无法区分具有重要值的常量和具有任意描述的常量

  • 这也许无关紧要,但它加剧了我的第二个反对意见;它太容易发生复制/粘贴错误。任何浏览代码的人都会认为密钥很重要,并且必须是唯一的。自由文本描述必须是唯一的,这一点还不太清楚。如果确实有两个常量具有相同的值,那么错误将很微妙,远离问题的根源,并且很难调试

  • 我不确定你的常数是如何/在哪里使用的,但它可能涉及到传输/存储的数据比需要的多。可能存在数据库列宽问题

  • 描述比常量更容易更新。在读取旧数据时,这可能会导致升级问题吗


这并不是说,如果需要,您不应该使用带有“description”属性的复杂自文档结构,但我会保持用于比较的值简短且可预测。

我倾向于不喜欢后一种实现,原因有两个:

  • 这是不明确的,因为无法区分具有重要值的常量和具有任意描述的常量

  • 这也许无关紧要,但它加剧了我的第二个反对意见;它太容易发生复制/粘贴错误。任何浏览代码的人都会认为密钥很重要,并且必须是唯一的。自由文本描述必须是唯一的,这一点还不太清楚。如果确实有两个常量具有相同的值,那么错误将很微妙,远离问题的根源,并且很难调试

  • 我不确定你的常数是如何/在哪里使用的,但它可能涉及到传输/存储的数据比需要的多。可能存在数据库列宽问题

  • 描述比常量更容易更新。在读取旧数据时,这可能会导致升级问题吗


这并不是说,如果需要,不应该使用带有“description”属性的复杂自文档结构,但我会保持用于比较的值简短且可预测。

比较字符串常量所需的解析时间比整数稍长,因为每个字符串中的每个字符都将被检查。然而,如果不经常这样做,它就不会真正引人注目。如果在一个速度至关重要的循环中执行,您可能会看到一些速度减慢。比较字符串常量将比整数花费稍多的时间来解析,因为每个字符串中的每个字符都将被检查。然而,如果不经常这样做,它就不会真正引人注目。如果在速度至关重要的循环中进行,您可能会看到一些减速。我喜欢这种方法。通过故意对常量使用无意义的整数值,它记录了一个重要的特性:即值不重要。我喜欢这种方法。通过故意为常量使用无意义的整数值,它记录了一个重要特性:即值不重要。