从获取函数形参谈toString用法

问题

如何获取一个函数形参?我们都知道通过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函数源码解析出来
时间: 2024-08-01 15:03:34

从获取函数形参谈toString用法的相关文章

javascript 获取函数形参个数

分享下javascript获取函数形参个数的方法. /** * 获取函数的形参个数 * @param {Function} func [要获取的函数] * @return {*} [形参的数组或undefind]* @site www.jbxue.com */function getFuncParameters(func) { if (typeof func == 'function') { var mathes = /[^(]+\(([^)]*)?\)/gm.exec(Function.pro

C++ 中获取 可变形参函数中的参数

#include <iostream> #include <stdarg.h> using namespace std; int ArgFunc(const char * str, ...) { va_list ap; // 定义参数列表变量 va_start(ap, str); // 确定参数位置,表明从 str 开始获取参数 // 开始获取参数 var_arg(ap, 数据类型) 返回获取的值 cout<<va_arg(ap, int)<<endl; c

关于函数形参的一些讨论

形参的初始化与变量的初始化一样:如果形参具有非引用类型,则复制实参的值,如果形参为引用类型,则它只是实参的别名. 非引用形参: 普通的非引用类型的参数通过复制对应的实参实现初始化.当用实参副本初始化形参时,函数并没有访问调用所传递的实参本身,因此不会修改实参的值. while 循环体虽然修改了 v1 与 v2 的值,但这些变化仅限于局部参数,而对调用 gcd 函数使用的实参没有任何影响.于是,如果有函数调用gcd(i, j),i 与 j 的值不受 gcd 内执行的赋值操作的影响. #includ

函数的学习以及用法

  浅谈函数应用 函数存在的意义:  把main函数中复杂的逻辑进行拆分,由一个一个单独的函数来处理一个单独的模块,main函数只是起到宏观调控作用 我们可以自己编写一些函数,实现某些功能,把函数的声明放在.h文件里,把函数的定义即实现放在.m文件里,然后在main.m文件里的main函数里调用实现,但是调用之前一定不要忘记把自己写的文件导入即导入头文件,导入自己编写的头文件用#import "",导入系统头文件用#import <> 此外,一个函数最多不要超过60行代码,

JavaScript函数之实际参数对象(arguments) / callee属性 / caller属性 / 递归调用 / 获取函数名称的方法

函数的作用域:调用对象 JavaScript中函数的主体是在局部作用域中执行的,该作用域不同于全局作用域.这个新的作用域是通过将调用对象添加到作用域链的头部而创建的(没怎么理解这句话,有理解的亲可以留言告诉我, 谢谢).因为调用对象是作用域链的一部分,所以在函数体内可以把这个对象属性作为变量来访问. 调用对象的属性包括:用var声明的局部变量,函数形参,还有一种特殊的属性arguments 函数的实际参数:实际参数对象 arguments对象,用来引用实际参数对象.函数的arguments对象并

Webkit的自定义属性获取函数以及属性删除函数实现

概述: [CustomEnumerateProperty] 当给定的接口被枚举时,允许你为指定接口的属性获取函数编写自己的实现. 同样,当接口的属性被删除时,[CustomDeleteProperty]允许你编写自己的实现. customEnumerateProperty](i), [CustomDeleteProperty](i) 用法: 这两个修饰可作用在interface,用法如下: [ CustomEnumerateProperty, CustomDeleteProperty ] int

Java equals和toString用法

1.代码 User.java public class User{ String name; int age; public User(String name,int age){ this.name = name; this.age = age; } public boolean equals(Object obj){ if(this == obj) return true; boolean b = obj instanceof User; if(b){ User u = (User)obj;

[Effective JavaScript 笔记]第28条:不要信赖函数对象的toString方法

js函数有一个非凡的特性,即将其源代码重现为字符串的能力. (function(x){ return x+1 }).toString();//"function (x){ return x+1}" 反射获取函数源代码的功能很强大,使用函数对象的toString方法有严重的局限性.toString方法的局限性ECMAScript标准对函数对象的toString方法的返回结果(即该字符串)并没有任何要求.这意味着不同的js引擎将产生不同的字符串,甚至产生的字符串与该函数并不相关. 如果函数

【转载ToString()转换格式;DateTime.ToString()用法详解】

ToString()转换格式;DateTime.ToString()用法详解 格式模式 说明和关联属性 c.C 货币格式.关联的属性包括: CurrencyDecimalDigits, CurrencyDecimalSeparator, CurrencyGroupSeparator, CurrencyGroupSizes, CurrencyNegativePattern, CurrencyPositivePattern, CurrencySymbol. d.D 十进制格式. e.E 科学计数(指