代码之家  ›  专栏  ›  技术社区  ›  Edan Maor

使用常量作为Javascript关联数组的索引

  •  18
  • Edan Maor  · 技术社区  · 15 年前

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

    一些代码说明:

    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;
    

    我很难让这个工作。我不太擅长JS,但不管我做什么,数组都是用字符串而不是常量定义的。有没有办法强制数组使用常量?

    谢谢!

    2 回复  |  直到 15 年前
        1
  •  39
  •   Charlotte    7 年前

    实际上,这里的问题是,在定义对象时,不能为关键部分使用值 字面意思 .

    也就是说,这将按预期使用常量值:

    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有一个定义对象文本的速记法,在这里可以省略键周围的双引号。无法使用表达式,因此 恒量 不会被评估。

    另请参见下面@Kristian的回答re:ES6/modern JS,本质上是让你想要的成为可能。

        2
  •  35
  •   Kristian Sunil Dodiya    9 年前

    在ES6中,可以使用对象键的计算值。

    var CONSTANT_A = 0, CONSTANT_B = 1
    var state_machine = {
        [CONSTANT_A]: function () {
            return 'a'
        },
        [CONSTANT_B]: function () {
            return 'b'
        }
    };
    
    console.log(state_machine)

    这在IE 11和safari浏览器中都不起作用: https://kangax.github.io/compat-table/es6/#test-object_literal_extensions_computed_properties