1. 程式人生 > >從獲取函數形參談toString用法

從獲取函數形參談toString用法

fin spl 類型 javascrip ocs 如何獲取 clas type 正則

問題

如何獲取一個函數形參?我們都知道通過arguments可以獲取運行時的實參值,但是形參值怎麽獲取,如果我們對toString的用法了解,這個問題就好解答了

toString

Function.prototype.toString裏有一句話說,在一個函數上直接調用toString方法,會以字符串形式返回這個函數的源碼。這裏有個重要信息,通過調用toString() 方法可以反編譯解析出函數源碼,多麽強大簡單的功能。

// 擼代碼
function tq(a, b, c) {}
tq.toString();
// "function tq(a, b, c) {}" 那麽剩下的事情就是通過正則匹配解析出圓括號裏面的內容了,簡單吧

  

前人已經寫的幾種獲取函數形參的方法

1. get-parameter-names 推薦使用

//https://github.com/goatslacker/get-parameter-names/blob/master/index.js
// 看不懂正則的,可以上https://regexper.com
var COMMENTS = /((\/\/.*$)|(\/\*[\s\S]*?\*\/))/mg;
var DEFAULT_PARAMS = /=[^,]+/mg;
var FAT_ARROWS = /=>.*$/mg;

function getParameterNames(fn) {
  var code = fn.toString()
    .replace(COMMENTS, ‘‘)
    .replace(FAT_ARROWS, ‘‘)
    .replace(DEFAULT_PARAMS, ‘‘);

  var result = code.slice(code.indexOf(‘(‘) + 1, code.indexOf(‘)‘))
    .match(/([^\s,]+)/g);

  return result === null
    ? []
    : result;
}
2. 同1類似的方法
function getArgs(func) {
 // 先用正則匹配,取得符合參數模式的字符串.
 // 第一個分組是這個: ([^)]*) 非右括號的任意字符
 var args = func.toString().match(/function\s.*?\(([^)]*)\)/)[1];
 // 用逗號來分隔參數(arguments string).
 return args.split(",").map(function(arg) {
  // 去除註釋(inline comments)以及空格
  return arg.replace(/\/\*.*\*\//, "").trim();
 }).filter(function(arg) {
  // 確保沒有 undefined.
  return arg;
 });
}

3. 知乎上賀師俊提供了一個更簡單的方法

//https://www.zhihu.com/question/28912825
/\(\s*([\s\S]*?)\s*\)/.exec(fn)[1].split(/\s*,\s*/)

方法一考慮到單行註釋,多行註釋,默認值,箭頭函數多種情況,適應情況更多,推薦使用方法一

toString其他用法

1. Object.prototype.toString
判斷變量類型,這個經常在比如jquery等各種類庫中常用

 Object.prototype.toString.call(obj);

2. Number.prototype.toString

     將數字轉化為字符串,比如1轉化為‘1’

3. Boolean.prototype.toString

  var b = true;
  console.log(b.toString()); // ‘true‘

4. Array.prototype.toString
行為類似於 [].join(‘,‘);

 [].toString() // ‘‘
 [1, 2].toString() // ‘1,2‘

5. Symbol.prototype.toString

   // 行為類似於Function.prototype.toString會將Symbol函數源碼解析出來

從獲取函數形參談toString用法