My original assertion (Outdated): > Sorting a string (Or any array) is inefficient because even the > fastest algorithm will sort no faster than O(n log n) in an average > case. The most efficient way would use a hash map to count letters in > each word. Something like: Although reading from a hash map can be as quick as O(1), writing to a hash map is significantly slower. By using a 26-value array (0-25) to represent lowercase letters, the speed of operations can be sped up significantly: function isAnagram(word1, word2) { if (typeof word1 !== 'string' || typeof word2 !== 'string') { throw new Error('isAnagram requires two strings to be passed.') } var normalizedWord1 = word1.replace(/[^A-Za-z]+/g, '').toLowerCase(); var normalizedWord2 = word2.replace(/[^A-Za-z]+/g, '').toLowerCase(); var counts = []; var word1Length = normalizedWord1.length; var word2Length = normalizedWord2.length if (word1Length !== word2Length) { return false; } for (var i = 0; i < word1Length; i++) { var index = normalizedWord1.charCodeAt(i)-97; counts[index] = (counts[index] || 0) + 1; } for (var i = 0; i < word2Length; i++) { var index = normalizedWord2.charCodeAt(i)-97; if (!counts[index]) { return false; } else { counts[index]--; } } return true; } EDIT: A speed comparison between using a hash and using a 26-value array: http://jsperf.com/anagram-algorithms