将常量用作 JavaScript 关联数组的索引

41

我想在JavaScript中创建一个关联数组,但使用作为类的一部分定义的常量作为索引。

我想这样做的原因是类的用户可以使用常量(定义事件)来触发操作。

以下是一些代码以说明:

STATE_NORMAL = 0;
STATE_NEW_TASK_ADDED = 0;
this.curr_state = STATE_NEW_TASK_ADDED;

this.state_machine = {
    /* Prototype:
    STATE_NAME: {
        EVENT_NAME: {
            "next_state": new_state_name,
            "action": func
        }
    }
    */

    STATE_NEW_TASK_ADDED : { // I'd like this to be a constant
        this.EVENT_NEW_TASK_ADDED_AJAX : {
            "next_state": STATE_NEW_TASK_ADDED,
            "action" : function() {console.log("new task added");},
        }
    }
}

// Public data members.
// These define the various events that can happen.
this.EVENT_NEW_TASK_ADDED_AJAX = 0;
this.EVENT_NEW_TASK_ADDED_AJAX = 1;

我在使用这段代码时遇到了问题。我对JavaScript不太熟悉,但无论我做什么,数组似乎都被定义为字符串而不是常量。有没有办法强制该数组使用常量?

3个回答

64

谢谢!你为我节省了很多时间。 - Mihir
啊,ES6太棒了。 - Félix Adriyel Gagnon-Grenier

44
参见Kristian的答案,讨论了ECMAScript 6/现代JavaScript的新语法,使这种做法成为可能。
下面是我原始的答案,来自于古代时期。
实际上,问题在于当你直接定义一个对象时,你不能使用一个值作为键部分。
也就是说,以下代码可以正常使用常量值:

var CONSTANT_A = 0, CONSTANT_B = 1;
var state_machine = {};
state_machine[CONSTANT_A] = "A";
state_machine[CONSTANT_B] = "B";
console.log(state_machine[0]); // => A
console.log(state_machine[1]); // => B

但是这样无法按预期工作,相反需要使用字符串 CONSTANT_A 作为键:

var CONSTANT_A = 0, CONSTANT_B = 1;
var state_machine = {
    CONSTANT_A: "A",
    CONSTANT_B: "B",
};
console.log(state_machine[0]); // => undefined
console.log(state_machine["CONSTANT_A"]); // => A
console.log(state_machine.CONSTANT_A); // => A

JavaScript有一种缩写方式来定义对象字面量,您可以省略键周围的双引号。不能使用表达式,因此CONSTANT_A不会被评估。


24

假设您有以下常量:

const COMPANIES = "companies";
const BRANCHES = "branches";
const QUEUES = "queues";
const LOGOUT = "logout";

如果您以这种方式声明字典:

var itemsToState = {
  COMPANIES: true,
  BRANCHES: false,
  QUEUES: false,
  LOGOUT: false,
}

// You will get:
// { COMPANIES: true, BRANCHES: false, QUEUES: false, LOGOUT: false }

请注意键是大写的^,因为它没有使用常量的值。

如果您想使用常量的值作为键,您需要这样做:

var itemsToState = {
  [COMPANIES]: true,
  [BRANCHES]: false,
  [QUEUES]: false,
  [LOGOUT]: false,
}

// You will get:
// { companies: true, branches: false, queues: false, logout: false }

请注意,键名为小写字母 ^,因为它使用常量的值。


4
示例使代码和答案易于理解。谢谢! - Sufian

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接