loading...

Swapping Array Elements In Place, Destructuring, and Automatic Semicolon Insertion

stephencweiss profile image Stephen Charles Weiss Originally published at stephencharlesweiss.com on ・2 min read

About a year ago, I learned about bitwise operators and using them to swap elements of a list in place.

With Array Destructuring, Javascript now allows you to do this without relying on bitwise operators.

For example to swap the first and fourth element, you might do the following:

const arr = [1, 2, 3, 4, 5]

[(arr[0], arr[3])] = [arr[3], arr[0]]

Did you catch the error?

There’s no ; to end the definition of the array. This is not a case where Javascript’s Automatic Semicolon Insertion (ASI) will add one either. 1 Instead, if you tried to run this code, you’d get an error similar to:

~/Users/Stephen/Desktop/scratch.js:15~
  [arr[0], arr[3]] = [arr[3], arr[0]];
   ^

ReferenceError: arr is not defined
    at anon (~/Users/Stephen/Desktop/scratch.js:15:4~)
    at Object.<anonymous> (~/Users/Stephen/Desktop/scratch.js:18:1~)
    at Module._compile (internal/modules/cjs/loader.js:685:14)
    at Object.Module._extensions..js (internal/modules/cjs/loader.js:699:10)
    at Module.load (internal/modules/cjs/loader.js:598:32)
    at tryModuleLoad (internal/modules/cjs/loader.js:537:12)
    at Function.Module._load (internal/modules/cjs/loader.js:529:3)
    at Function.Module.runMain (internal/modules/cjs/loader.js:741:12)
    at startup (internal/bootstrap/node.js:285:19)
    at bootstrapNodeJSCore (internal/bootstrap/node.js:739:3)

We can fix it with a well-placed ;:

const arr = [1, 2, 3, 4, 5];

[(arr[0], arr[3])] = [arr[3], arr[0]]

console.log(arr) // [4, 2, 3, 1, 5]

Tracking down the error was a fun reminder about the costs of being clever. Sometimes using a simple swap function really is just the right way to go:

function swap(list, x, y) {
  const tmp = list[x]
  list[x] = list[y]
  list[y] = tmp
  return list
}

Footnotes

Posted on by:

stephencweiss profile

Stephen Charles Weiss

@stephencweiss

Engineer | Lover of dogs, books, and learning | Dos XX can be most interesting man in the world, I'm happy being the luckiest. | I write about what I learn @ code-comments.com

Discussion

markdown guide