RegExp в JavaScript 
сохраняет своё состояние между вызовами. Так как выражение содержит флаг глобального соответствия 
g, после очередного найденного совпадения поиск продолжается.
У экземпляра объекта Regexp есть свойство 
lastIndex, которое позволяет читать/писать индекс, с которого начнётся следующее сопоставление. Он поможет разобраться:
var RE = /([A-z0-9])/g;
console.log([
  RE.lastIndex, RE.test("aaaa"), // 0,true
  RE.lastIndex, RE.test("aaaa"), // 1,true
  RE.lastIndex, RE.test("aaaa"), // 2,true
  RE.lastIndex, RE.test("aaaa"), // 3,true
  RE.lastIndex, RE.test("aaaa"), // 4,false
  RE.lastIndex, RE.test("aaaa"), // 0,true
]);