【问题标题】:Are the elements of a javascript object initialized in a specific order?javascript 对象的元素是否按特定顺序初始化?
【发布时间】:2015-07-19 07:55:49
【问题描述】:

我有这样的功能:

parsers[1] = function(buf) {
    return {
        type: "init",
        name: buf.readUTF8String(),
        capacity: buf.readUInt32(),
        port: buf.readUInt16()
    };
}

我能否保证namecapacityport 将依次初始化?否则会以错误的顺序读取缓冲区。

我当然可以依靠:

parsers[1] = function(buf) {
    var ret = {type: "init"};
    ret.name = buf.readUTF8String();
    ret.capacity = buf.readUInt32();
    ret.port = buf.readUInt16();

    return ret;
}

【问题讨论】:

  • 这是 ES5 规范的相关部分:11.1.5 - Object initializer
  • @joews:有点神秘,但我认为它们是按顺序评估的。谢谢。
  • @joews 他想要一个保证,而不是学术猜测
  • 猜测?如果有答案,它就在该文档中。我无法破译该部分,因此我在帮助中发布了一个链接,它将帮助其他人回答问题。
  • 如果您编写的代码期望驻留在对象初始值设定项的值侧的函数/方法调用以特定顺序调用(由于副作用),那么我建议您停止这样做并以所需的顺序逐行编写特定的代码。为什么要编写如此困难的代码来了解是否所有 Javascript 实现的行为方式完全相同?如果顺序很重要,并且并非 100% 明显所有实现都使用初始化器执行您想要的操作,那么请注意安全并自己编写顺序。

标签: javascript node.js object


【解决方案1】:

感谢@joews 的评论,我可以回答我自己的问题。

来自链接11.1.5 Object initializer

语法

ObjectLiteral

  • { }

  • { PropertyNameAndValueList }

  • { PropertyNameAndValueList , }

PropertyNameAndValueList

  • 属性分配

  • PropertyNameAndValueList , PropertyAssignment

简而言之,对象构造函数将无参数、初始化值列表或初始化值列表后跟逗号作为参数。

初始化值列表由PropertyAssignment 或初始化值列表后跟PropertyAssignment 组成,这基本上意味着PropertyAssignment 的递归列表。

现在的问题是在最后一个PropertyNameAndValueList , PropertyAssignment,是否有一个特定的顺序来评估这两个组件?

生产 PropertyNameAndValueList:PropertyNameAndValueList、PropertyAssignment 评估如下:

  1. obj 成为评估PropertyNameAndValueList的结果。

  2. propId 成为评估PropertyAssignment的结果。

  3. ...

如果2. 确定跟随1.,则订单将得到保证。

来自5.2 Algorithm conventions

规范通常使用编号列表来指定算法中的步骤。这些算法用于精确指定 ECMAScript 语言结构所需的语义。这些算法并不意味着使用任何特定的实现技术。在实践中,可能有更有效的算法可用于实现给定的功能。

...

为了表达清楚,算法步骤可以细分为顺序子步骤。

因此,据我所知,预期的初始化顺序是一个又一个元素。

【讨论】:

    【解决方案2】:

    与在许多其他语言中一样,我不会依赖对象属性的任何“顺序”,也不会依赖于它们的初始化方式或值分配方式。

    如果需要“外部”订单,我会尝试通过这些属性的一种映射来实现。

    【讨论】:

    • 这与对象内的实际属性的顺序无关,而是在初始化时是否遵守表达式的顺序(由于函数调用的潜在副作用很重要) .
    • 如果您阅读了 Axel 的回答,他就是这么说的。您的回复看起来就像您在工作“nor”之前完成的。
    • 你是说你个人不会假设属性没有按顺序分配,或者你有证据证明它们不是'吨?如果是后者,你能提供一些引用吗?谢谢!
    • @RGraham 我不会依赖它,为了代码的清晰,我不会使用任何类型的“隐藏功能”。我建议通过可见的应用程序逻辑来实现任何必要的顺序。也许很难在哪里停下来画一条线,因为最后你必须依赖某些东西,仍然是代码的清晰性。想象一下,半年后有人正在改变缓冲区函数的行为 - ...
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-06-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多