代码之家  ›  专栏  ›  技术社区  ›  Colin FAY

在javascript中将捕获函数参数作为裸符号传递给函数

  •  0
  • Colin FAY  · 技术社区  · 6 年前

    我喜欢编写一个函数,它接受一个点-点参数,捕获作为符号传递的元素,并将它们作为字符串。

    是否可以将这些…参数作为符号传递,并捕获函数的输入?

    为了清楚起见,我想写下:

    function myFunc(...args) {
      // capture the ...args 
    };
    myFunc(a, b, c);
    ["a", "b", "c"]
    

    背景

    在R中,可以使用惰性求值,捕获传递给函数的符号而不求值,并将其转换为字符串:

    library(rlang)
    x <- function(...){
      p <- quos(...)
      sapply(p, quo_name)
    }
    
    > x(a, b)        
    "a" "b" 
    
    > x(c, def, ghijk)
    "c"   "def" "ghijk" 
    

    这就是我想用JavaScript重现的内容。这可行吗?

    3 回复  |  直到 6 年前
        1
  •  1
  •   Mark    6 年前

    你不能像问题里说的那样做。一种接近的方法是使用为变量命名的键传入一个对象。语法和你已经做的很接近:

    function myFunc(args) {
        console.log(Object.keys(args))
    
    };
    let a = 1;
    let b = 2;
    let c = 3;
    
    myFunc({a, b, c});

    当然,如果你只是想知道 "a" "b" "c" ,你应该把弦传进去。

        2
  •  4
  •   Quentin    6 年前

    不。

    这个 价值观 的变量被传递给函数。它永远看不到您从中复制的变量名。

        3
  •  1
  •   Avin Kavish    6 年前

    在R中使用它的方式是,例如,当您希望从数据帧中提取列时。“引号”是字符变量,符号是列。所以filter(df,column==“char”)不是filter(df,column==“char”)。

    你所说的语法可以很好地再现, filter(df, column == "char") 我不确定dataframe的结构是什么,也不确定过滤逻辑是什么,但是在您的示例中,第二个参数本质上是一个谓词,可以使用箭头函数用JavaScript编写谓词,就像这样。

    function filter(obj, predicate) {
      predicate(obj) // <--- apply the predicate to the object
    }
    
    filter(df, obj => obj.column === "char")