Script Preparation code:
x
 
var str = "150721";
var DIGITS = new Map([
  ["0", "0"],
  ["1", "1"],
  ["2", "2"],
  ["3", "3"],
  ["4", "4"],
  ["5", "5"],
  ["6", "6"],
  ["7", "7"],
  ["8", "8"],
  ["9", "9"],
  ["\uFF10", "0"], // Fullwidth digit 0
  ["\uFF11", "1"], // Fullwidth digit 1
  ["\uFF12", "2"], // Fullwidth digit 2
  ["\uFF13", "3"], // Fullwidth digit 3
  ["\uFF14", "4"], // Fullwidth digit 4
  ["\uFF15", "5"], // Fullwidth digit 5
  ["\uFF16", "6"], // Fullwidth digit 6
  ["\uFF17", "7"], // Fullwidth digit 7
  ["\uFF18", "8"], // Fullwidth digit 8
  ["\uFF19", "9"], // Fullwidth digit 9
  ["\u0660", "0"], // Arabic-indic digit 0
  ["\u0661", "1"], // Arabic-indic digit 1
  ["\u0662", "2"], // Arabic-indic digit 2
  ["\u0663", "3"], // Arabic-indic digit 3
  ["\u0664", "4"], // Arabic-indic digit 4
  ["\u0665", "5"], // Arabic-indic digit 5
  ["\u0666", "6"], // Arabic-indic digit 6
  ["\u0667", "7"], // Arabic-indic digit 7
  ["\u0668", "8"], // Arabic-indic digit 8
  ["\u0669", "9"], // Arabic-indic digit 9
  ["\u06F0", "0"], // Eastern-Arabic digit 0
  ["\u06F1", "1"], // Eastern-Arabic digit 1
  ["\u06F2", "2"], // Eastern-Arabic digit 2
  ["\u06F3", "3"], // Eastern-Arabic digit 3
  ["\u06F4", "4"], // Eastern-Arabic digit 4
  ["\u06F5", "5"], // Eastern-Arabic digit 5
  ["\u06F6", "6"], // Eastern-Arabic digit 6
  ["\u06F7", "7"], // Eastern-Arabic digit 7
  ["\u06F8", "8"], // Eastern-Arabic digit 8
  ["\u06F9", "9"], // Eastern-Arabic digit 9
]);
var DIGITz = {
  "0": "0",
  "1": "1",
  "2": "2",
  "3": "3",
  "4": "4",
  "5": "5",
  "6": "6",
  "7": "7",
  "8": "8",
  "9": "9",
  "\uFF10": "0", // Fullwidth digit 0
  "\uFF11": "1", // Fullwidth digit 1
  "\uFF12": "2", // Fullwidth digit 2
  "\uFF13": "3", // Fullwidth digit 3
  "\uFF14": "4", // Fullwidth digit 4
  "\uFF15": "5", // Fullwidth digit 5
  "\uFF16": "6", // Fullwidth digit 6
  "\uFF17": "7", // Fullwidth digit 7
  "\uFF18": "8", // Fullwidth digit 8
  "\uFF19": "9", // Fullwidth digit 9
  "\u0660": "0", // Arabic-indic digit 0
  "\u0661": "1", // Arabic-indic digit 1
  "\u0662": "2", // Arabic-indic digit 2
  "\u0663": "3", // Arabic-indic digit 3
  "\u0664": "4", // Arabic-indic digit 4
  "\u0665": "5", // Arabic-indic digit 5
  "\u0666": "6", // Arabic-indic digit 6
  "\u0667": "7", // Arabic-indic digit 7
  "\u0668": "8", // Arabic-indic digit 8
  "\u0669": "9", // Arabic-indic digit 9
  "\u06F0": "0", // Eastern-Arabic digit 0
  "\u06F1": "1", // Eastern-Arabic digit 1
  "\u06F2": "2", // Eastern-Arabic digit 2
  "\u06F3": "3", // Eastern-Arabic digit 3
  "\u06F4": "4", // Eastern-Arabic digit 4
  "\u06F5": "5", // Eastern-Arabic digit 5
  "\u06F6": "6", // Eastern-Arabic digit 6
  "\u06F7": "7", // Eastern-Arabic digit 7
  "\u06F8": "8", // Eastern-Arabic digit 8
  "\u06F9": "9", // Eastern-Arabic digit 9
};
Tests:
  • Map

     
    let result = '';
    for (let i = 0, n = str.length; i < n; ++i) {
      result += DIGITS.get(str[i]);
    }
  • one liner

     
    str.normalize("NFKC").replace(/[٠-٩۰-۹]/g,a=>a.charCodeAt(0)&15);
  • one liner swapped

     
    str.replace(/[٠-٩۰-۹]/g,a=>a.charCodeAt(0)&15).normalize("NFKC");
  • ES6 for loop

     
    let result = '';
    for (let letter of str) {
      result += DIGITS.get(letter);
    }
  • Using object

     
    let result = '';
    for (let letter of str) {
      result += DIGITz[letter];
    }
  • regex normalize

     
    str.replace(/[\uFF10-\uFF19]/g,a=>a.charCodeAt(a.charCodeAt(0)-0xfee0)).replace(/[٠-٩۰-۹]/g,a=>a.charCodeAt(0)&15);
  • regex normalize swapped

     
    str.replace(/[٠-٩۰-۹]/g,a=>a.charCodeAt(0)&15).replace(/[\uFF10-\uFF19]/g,a=>a.charCodeAt(a.charCodeAt(0)-0xfee0));
Rendered benchmark preparation results:

Suite status: <idle, ready to run>

Previous results

Experimental features:

  • Test case name Result
    Map
    one liner
    one liner swapped
    ES6 for loop
    Using object
    regex normalize
    regex normalize swapped

    Fastest: N/A

    Slowest: N/A

Latest run results:
Run details: (Test run date: 2 years ago)
Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/102.0.5005.61 Safari/537.36
Chrome 102 on Windows
View result in a separate tab
Test name Executions per second
Map 1099992.9 Ops/sec
one liner 2655456.5 Ops/sec
one liner swapped 2604336.0 Ops/sec
ES6 for loop 1732553.9 Ops/sec
Using object 1558265.4 Ops/sec
regex normalize 1535058.1 Ops/sec
regex normalize swapped 1612221.9 Ops/sec