如何将此函数传递视为分隔符和参数

时间:2018-02-03 12:21:15

标签: javascript

从这里学习Javascript函数 - https://developer.mozilla.org/en-US/docs/Web/JavaScript/Guide/Functions

我无法理解这个概念 - 如何将逗号分配给分隔符?

 function myConcat(separator) {

   console.log(separator); // ,  -> how was this interpreted as comma?
   console.log(arguments.length); // 4
   var result = ''; // initialize list
   var i;
   // iterate through arguments
   for (i = 1; i < arguments.length; i++) {
      result += arguments[i] + separator;
   }
   return result;
}

myConcat(', ', 'red', 'orange', 'blue');

输出:

, 
4
red, orange, blue, 

4 个答案:

答案 0 :(得分:1)

因为这是你的功能签名的第一个参数

$ python -m cProfile -s cumtime h.py | head -n 20
[99999, 99998, 99997]
Took 0.255105018616 seconds
[99999, 99998, 99997]
Took 0.0103080272675 seconds
         800007 function calls (750010 primitive calls) in 0.291 seconds

   Ordered by: cumulative time

   ncalls  tottime  percall  cumtime  percall filename:lineno(function)
        1    0.022    0.022    0.291    0.291 h.py:1(<module>)
    49996    0.034    0.000    0.144    0.000 h.py:47(extract_min)
99995/49998  0.088    0.000    0.103    0.000 h.py:17(heapify)
    49996    0.076    0.000    0.090    0.000 h.py:56(insert)
        1    0.018    0.018    0.021    0.021 random.py:293(sample)
   149975    0.015    0.000    0.015    0.000 {min}
   299987    0.014    0.000    0.014    0.000 {len}
        2    0.010    0.005    0.010    0.005 {sorted}
    49996    0.004    0.000    0.004    0.000 {method 'pop' of 'list' objects}
    49996    0.003    0.000    0.003    0.000 {method 'append' of 'list' objects}
    50000    0.003    0.000    0.003    0.000 {method 'random' of '_random.Random' objects}

尝试将签名更改为myConcat(', ', 'red', 'orange', 'blue'); function myConcat(separator) {...} ,您将看到所有参数都按预期收到。

您甚至可以将签名写为function myConcat(separator, arg1, arg2, arg3)。并调用该功能 因为,JS不进行类型检查。 但是,您仍然可以检查函数中使用function myConcat()调用函数的参数数量。

供参考:
https://www.w3schools.com/js/js_function_parameters.asp
Function arguments

答案 1 :(得分:1)

让我们想象arguments不存在。然后就可以写出这样的函数:

function myConcat(separator, ...array) {
  var result = ""; // initialize the resulting string
  // iterate over the array
  for (let i = 0; i < array.length; i++) {
    result += array[i] + separator;
   }
   return result;
}

现在很清楚,myConcat函数有一个名为seperator的参数,后跟一个所谓的rest parameter数组。这意味着无论何时调用该函数,第一个参数都会传递给seperator,并且所有以下参数都会收集在array数组中。

 myConcat(/*seperator*/ "a",/*...array*/ "b", "n", "n", "!");

当你来自java背景时,用java编写的内容将是:

class Helpers {
  static String myConcat(String seperator, String[] ...array){
    String result = "";
    for(int i = 0; i < array.length; i++)
      result += array[i] + seperator;
    return result;
  }
}

答案 2 :(得分:1)

myConcat(', ', 'red', 'orange', 'blue');

这里,第一个参数是,,实际上是分隔符的值 function myConcat(separator){...}

当你遍历参数时,循环从索引1开始,而不是从0开始(注意,参数[0]实际上是你的分隔符)

for (i = 1; i < arguments.length; i++) {
  result += arguments[i] + separator;
}

答案 3 :(得分:0)

    <script>
 function array(separator, ...array) {
 var result = ""; // initialize the resulting string
   // iterate over the array
    for (let i = 0; i < array.length; i++) {
   result += array[i] + separator;
     }
      return result;
  }
   alert(array( "a",/*...array*/ "b", "n", "n", "!"));
  </script>