// Permutations
// Option 1, fix prefix, add a letter to the end of current space.
Source code:
function get_suffix(surffix, charIdx) {
  var arr = surffix.split("");
  arr.splice(charIdx, 1);
  var newSurffix = arr.join("");
  return newSurffix;
}
function permSuffix (str) {
 var myArr = [];
 var permNext = function f_permNext(prefix, surffix, initStr) {
   //call example:  permNext("","abc","abc");
 
   var newPrefix = "",
     newSurffix = "";
   var strLen = initStr.length;
   var i = 0;
   console.log("start func: " + prefix, i, surffix);
 
   if (prefix.length === strLen) {
     myArr.push(prefix);
     console.log("** Combined: " + prefix);
     return;
   }
   for (i = 0; i < surffix.length; i++) {
     newPrefix = prefix + surffix[i];
     newSurffix = get_suffix(surffix, i);
     console.log(newPrefix, i, newSurffix);
     f_permNext(newPrefix, newSurffix, initStr);
   }
 };
 permNext("", str, str);
 return myArr.length;
}
permSuffix("123");
> 6
// options 2,  Introduce and insert a letter to the space of prefix.
Source code:
function introChar(targetStr, chr) {
 var arr = [];
 var strArr = [];
 for (var i=0; i<=targetStr.length; i++) {
  strArr = targetStr.split("");
  strArr.splice(i, 0, chr);
  arr.push(strArr.join(""));
 }
 return arr;
}
introChar("abc", "1");
function permInsert (str) {
 var myArr = [];
 var permIntro = function f_intro (arr, pos, permStr) {
  console.log(pos, arr, permStr);
  var len = permStr.length;
  if (pos >= len) {
   myArr = myArr.concat(arr);
   console.log(arr);
   return;
  }
  if (arr.length === 0) {
   arr = introChar("", permStr[0]);
   pos++;
  }
  chr = permStr[pos];
  pos++;
  arr.forEach( function(val) {
   var plusCharArr = introChar(val, chr);
   console.log(plusCharArr);
   f_intro(plusCharArr, pos, permStr);
  });
 };
 permIntro([], 0, str);
 return myArr.length;
}
permInsert("abcde");
> 120
// Reference,  arr is reference type, the paramenter is a link,
// update in a function, update outside arr elements value too.
var yiArr = [7,8,9];
function cut1 (pArr) {
 lArr = pArr.slice();
 lArr.splice(1, 1);
 return lArr;
}
cut1(yiArr);
yiArr;