JS:如何对全名变量使用缩写?

JS: How to use abbreviations for full named variables?

我更喜欢在我的代码开头使用不言自明的全名变量声明所有全局变量:

var $interval_start_dates          = [];    // date intervals
var $interval_end_dates            = [];

var $interval_start_milli          = [];    // convert dates to milliseconds
var $interval_end_milli            = [];

var $interval_start_milli_sorted   = [];    // sort millisecond dates
var $interval_end_milli_sorted     = [];

这种命名约定通常会导致变量名很长,我发现在代码中使用它们时很不方便。因此我也更喜欢在代码中对变量使用缩写:

var _isd  = $interval_start_dates;
var _ied  = $interval_end_dates; 

var _ism  = $interval_start_milli; 
var _iem  = $interval_end_milli;

var _isms = $interval_start_milli_sorted;
var _iems = $interval_end_milli_sorted;

我在这方面的问题如下:

(1) 是否可以使用缩写(如_isd)输出中间变量(如$interval_start_dates)?

(2) 这种命名约定是否会导致代码性能变差(例如速度)?如果是,是否有使用缩写的更好方法?

一句话:我知道我可以只使用注释来告知缩写变量的全名。但这意味着我将不得不在我的代码中多次重复这些注释。我正在寻找一个更 "slick" 的解决方案,它允许我使用 console.log 来显示变量的全名(如果可能的话)。

性能方面这无关紧要。但是,您的代码将变得不那么可读。所以你必须决定什么对你更重要:可读性或编码速度更快。您可以通过使用自动完成变量名称的 IDE 来实现这两个目标。

此外,大多数时候你的变量名可以更短而不失去任何意义,例如:

var $interval_start_milli 可以更改为 var interval_start_ms 甚至 var start_ms,因为间隔有开始和结束,这意味着您可以有 var interval_msstart_msend_ms。其中 var interval_ms 是具有 startend 属性.

的对象数组

但这也取决于您声明的其他全局变量。

另一件事是你不应该在 javascript.

中过多地依赖全局变量

1) Is it possible to output the intermediate variable (e.g. $interval_start_dates) using the abbreviation (e.g. _isd)?

是的。它们都引用同一个数组,所以你用哪个来输出数组并不重要。

(2) Does this naming convention result in worse performance of the code (e.g. speed) and if so is there a better way to use abbreviations?

没有。它们都引用同一个数组,每个都是彼此的直接引用。

但是,还有其他潜在的问题。例如,如果您需要过滤或映射这些数组,更新一个引用而忘记另一个引用真的很容易,例如:

_isd = _isd.filter(function(entry) { return entry.foo < bar; });
// OOOPS! Now `_isd` and `$interval_start_dates` don't refer to the same array anymore!

如果只是输入名称,任何好的 IDE 都可以让您更轻松。

I am looking for a more "slick" solution which allows me to use for example console.log to display the full name of a variable (if this is possible).

我不确定你在这里问什么,但如果你的意思是你想在某处使用 _isd(例如,一个函数)并让该函数显示 $interval_start_dates它的输出而不是 _isd,那么你不能(合理地)这样做。在 _isd$interval_start_dates 之间没有 link,只是它们指的是同一个数组。但是,无论如何,你不能这样做 ——如果你将 $interval_start_dates 传递给一个函数,它仍然无法推断出它的名称,因为函数的参数接收该值未以任何方式 link 编辑为 $interval_start_dates(除了它们引用相同的数组)。


旁注:如果所有这些都是数组,并且您想通过某种方式根据数组引用了解数组的 "name",您可以利用标准数组这一事实在 JavaScript aren't really arrays at all, they're just objects 中并为它们分配一个 属性 名称在,例如:

var $interval_start_dates          = [];    // date intervals
$interval_start_dates.name = "$interval_start_dates";

// ...

var _isd = $interval_start_dates;
console.log(_isd.name); // "$interval_start_dates"

如果您这样做,请确保您没有使用 for-in 来遍历数组 (but there are better ways anyhow)。或者使用 Object.defineProperty 来定义名称:

var $interval_start_dates          = [];    // date intervals
Object.defineProperty($interval_start_dates, "name", {
    value: "$interval_start_dates"
});

...默认情况下,以这种方式添加的属性是不可枚举的。

为什么不使用一些数据结构。优点是格式更易读,您可以使用缩写来访问变量。

var interval = {
    start: {
        dates: [], // date intervals
        milli: [], // convert dates to milliseconds
        milli_sorted: [] // sort millisecond dates
    },
    end: {
        dates: [],
        milli: [],
        milli_sorted: []
    }
};
// use
var ie = interval.end;
alert(ie.dates);