当前位置: 首页 > 面试题库 >

JavaScript是否保证对象属性顺序?

卫弘义
2023-03-14
问题内容

如果我创建这样的对象:

var obj = {};
obj.prop1 = "Foo";
obj.prop2 = "Bar";

生成的对象会 总是 这样吗?

{ prop1 : "Foo", prop2 : "Bar" }

也就是说,属性的顺序是否与我添加它们的顺序相同?


问题答案:

自ES2015起,对象的迭代顺序遵循一组特定的规则,但不(始终)遵循插入顺序。简而言之,迭代顺序是字符串键的插入顺序和数字键的升序的组合:

// key order: 1, foo, bar
const obj = { "foo": "foo", "1": "1", "bar": "bar" }

使用数组或Map对象可能是实现此目的的更好方法。Map与密钥共享一些相似之处Object并保证密钥按插入顺序进行迭代,无一例外:

Map中的键是有序的,而添加到对象中的键则没有顺序。因此,在对其进行迭代时,Map对象将按插入顺序返回键。(请注意,在ECMAScript
2015规范中,对象确实保留了字符串和符号键的创建顺序,因此仅使用字符串键遍历对象即会按插入顺序产生键)

请注意,在ES2015之前根本无法保证对象中的属性顺序。ECMAScript第三版(pdf)中对象的定义:

4.3.3对象

对象是对象类型的成员。 它是属性的无序集合, 每个 属性 都包含原始值,对象或函数。存储在对象属性中的函数称为方法。



 类似资料:
  • 问题内容: 我知道有一个可预测的迭代顺序(插入顺序)。是否Set通过返回和返回的也维持这种秩序? 问题答案: Map界面提供了三个 集合视图,这些视图允许将地图的内容视为一组键,值的集合或一组键-值映射。该订单的地图被定义为其中在地图上的集合视图迭代返回元素的顺序。某些地图实现(例如TreeMap 类)会对其顺序做出具体保证;其他人,例如 上课者 -Map 此链表定义了迭代顺序,通常是将键插入映射

  • 这里有几个关于如何检查对象中是否存在属性的答案。 我一直在使用 但我想知道这和

  • 问题内容: ES6是否为对象属性引入了定义明确的枚举顺序? 问题答案: 注意: 从ES2020开始,甚至更旧的操作(例如和)都必须遵循属性顺序。这不会改变以下事实:使用基本程序逻辑的属性顺序可能不是一个好主意,因为非整数索引属性的顺序取决于创建属性的时间。 ES2015-ES2019的答案: 对于,和: 第 对于一些其他操作: 是的 ,通常。 虽然ES6 / ES2015增加了财产秩序,它不需要,

  • 问题内容: 我正在创建一个JavaScript对象,如下所示 之后,我将它们如下 上面的方法是否按照对象先前的顺序对它们进行了字符串化处理?字符串化后,它们将按照以前的顺序排列为0,1,2 .... 9吗? 问题答案: 文档中没有任何内容可以明确确认数组项的顺序已保留。但是,文档指出,对于非数组属性,不能保证顺序: 非数组对象的属性不能保证以任何特定顺序进行字符串化。不要依赖于字符串化中同一对象内

  • 问题内容: 我知道有一个可预测的迭代顺序(插入顺序)。是否Set通过返回和返回的也维持这种秩序? 问题答案: Map界面提供了三个 集合视图,这些视图允许将地图的内容视为一组键,值的集合或一组键-值映射。该订单的地图被定义为其中在地图上的集合视图迭代返回元素的顺序。某些地图实现(例如 类)会对其顺序做出具体保证;其他人,例如 上课者,则不会。 地图 此链表定义了迭代顺序,通常是将键插入映射的顺序(

  • 我有一个目标。我想通过删除除某些特定属性之外的所有属性来修改对象(而不是克隆它)。例如,如果我从这个对象开始: 并且只需要属性p1、p2和p100,如何获得此对象: 我明白如何用蛮力做到这一点,但我想要一个更优雅的解决方案。