For AI agents: the complete documentation index is available at /tc39-atlas/en/llms.txt, the full documentation bundle is available at /tc39-atlas/en/llms-full.txt, and this page is available as Markdown at /tc39-atlas/en/proposals/stage/1/proposal-array-equality.md.
  • English
  • Array Equality S1

    Proposal details
    Proposal overview

    This proposal addresses the lack of a standard method to compare arrays for equality, especially deeply nested ones. It proposes adding an Array.prototype.equals method that performs deep comparison. The proposal is at an early stage, with no implementation details or standardization progress mentioned.

    Note

    The README below comes from the upstream repository and may contain outdated stage or status metadata. Use the proposal details above as the current source of truth.

    proposal-array-equality

    Determining whether two arrays are equal.

    Author: Hemanth HM

    Champions: Jordan Harband & Hemanth HM

    Motivation:

    Today we don't have straightforward way to check if two arrays are equal, it get more messier to check when they are deeply nested arrays.

    How is this currently handled?

    There is no standard way to do it, there are few modules like array-equal, deep-equal with like 5M and 8M downloads per week respectively, which is subset of deep comparison.

    Consider few examples:

    // Schema validation
    const equal = require('deep-equal');
    
    const expectedSchema = {
      name: {
        type: String,
        required: true
      },
      score: {
        type: Number,
        default: 0
      }
    };
    
    equal(schemaCall.args[0], expectedSchema);
    

    node builtin:

    // assert.deepStrictEqual(actual, expected[, message])
    
    deepStrictEqual([new Uint32Array([1, 2, 3, 4]).subarray(1, 3), new Uint32Array([2, 3])]);
    // assert.deepEqual(actual, expected[, message])
    
    assert.deepEqual( tokenizer( "AD", "G", cldr ), [{
    		type: "G",
    		lexeme: "AD",
    		value: "1"
    	}] );

    Proposal:

    Have a Array.prototype.equals method, they might look like:

    [1,2,3].equals([1,2,3]) // evaluates to true
    
    [1,2,undefined].equals([1,2,3]) // evaluates to false.
    [1, [2, [3,4]]].equals([1, [2, [3,4]]]) // true
    [{
      foo: 'bar'
    }, {
      foo: 'baz'
    }].equals[{
        foo: 'bar'
    }] // false
    

    How are other langugaes handling this?

    Ruby: array1.to_set == array2.to_set

    Python: [1,[2,3]] == [1,[2,3]]

    Java: java.util.Arrays.equal

    C#: Enumerable.Except or SequenceEqual