 
  
   
  
   
  
  много лишних проверок, строка ли то, регулярка ли это...
если я мог бы использовать как и префикс !, так и целую фразу
 
  
   
  
  регулярные выражения,
@param  {String|Number|Function|RegExp} - задает шаблон соответствия для части 
   *                    команды. Шаблон может быть строкой, числом, функцией и 
   *                    регулярным выражением. В случае если шаблон это функция, то
   *                    она должна возвращать true если текущая часть команды
   *                    соответствует условиям и false если нетсам код достаточно сложный
Шаг влево, шаг вправо - все сломалось
 
  
   
  
   
  
   
  
   
  
   
  
   
  
   
  
   
  
  var str = "hello world";
var uniq = {};
var list = [];
var last = 0;
var resstr = ""
for(var i=0; i<str.length; i++){
  let v = str[i];
  if(uniq[v]){
    list[uniq[v]-1] = true;
    list[i] = true;
    last = i;
  }else{
  	uniq[v] = i+1;
  }
}
if(last) list[last] = false;
for(var i=0; i<str.length; i++){
	if(!list[i]) resstr+=str[i];
}
console.log(resstr); // he wrld
Но представте у вас таже /tp и ваш пример выдаст вам
cmd = "tp", args = ["vasya", "petya"]
или ["vasya"]
или ["vasya", 1, 100, 15]
или [16, 48, 56]
или ["help"]
Представте сколько логики надо добавить чтобы понять, что именно надо сделать. Да, для данной команды можно попробовать селекцию по числу аргуметов и проверок на help и чисо/строка. Но если команда будет сложнее? А если сложных команд будет много? Писать кучу проверок и селекций в каждом обработчике каждой команды?
Мой же модуль позволяет навесить обработчики на каждый тип команды tp и сам будет распознавать какой из них нужен в каддом конкретном случае