什么是$ {a}和=>在我的代码?

时间:2015-12-30 13:19:40

标签: javascript



function unusedDigits(...a){
  return `0123456789`.split('').filter(
    b => `${a}`.split('').indexOf(b) == -1
  ).join('');
}

document.write(unusedDigits(12345))    




  1. 什么是 ${a}

  2. 什么是 =>

  3. 如果有人可以为我分解这段代码,那就太棒了!

3 个答案:

答案 0 :(得分:11)

  

1,什么是$ {a}

这是新JavaScript template string中的替代(由ES2015添加)。它交换a的值。接受任意表达。

  

2,什么是=>

这是ES2015 arrow function

你没有问,但函数声明中...参数之前的a是" rest operator"那说"给我作为数组提供给函数的(其余的)参数。

  

如果有人可以为我分解这段代码,那就太棒了!

它返回一个字符串,其中包含不会以传递给它的任何参数的字符串形式出现的数字:

  • unusedDigits函数接受任意数量的参数,它作为通过a参数访问的数组接收(感谢... rest运算符在{{1}的声明中1}}参数)。
  • 它需要一个数字0-9的字符串并将其拆分以创建一个数组(例如a)。
  • 然后它通过['0', '1', ...]函数循环遍历该数组,获取一个仅包含filter回调所说的条目的新数组。
  • filter回调(ES2015箭头函数)使用ES2015模板字符串创建包含filter数组的字符串。由于这涉及隐式调用a,它最终会隐式执行a.toString()(因为那是a.join(",")所做的),然后检查是否检查了数字(Array#toString )出现在结果字符串中。 (这不是很有效;没有理由每次都重新创建字符串,并且没有理由在这里使用模板字符串。)只有当数字不在字符串中时才返回真值( b已返回indexOf)。
  • 然后它在幸存数字的末尾汇集一个字符串并返回它。

这是一个更有效的版本,FWIW:Live Copy on Babel's REPL

-1

与ES5中的功能相同:

let unusedDigits = (function() {
    const digits = [0,1,2,3,4,5,6,7,8,9];

    return function unusedDigits(...a) {
        let astring = String(a);
        return digits.filter(b => astring.indexOf(b) == -1).join("");
    };
})();

console.log(unusedDigits(12345));

var unusedDigits = (function() { var digits = [0,1,2,3,4,5,6,7,8,9]; var slice = Array.prototype.slice; return function unusedDigits() { var astring = String(slice.call(arguments)); return digits.filter(function(b) { return astring.indexOf(b) == -1}).join(""); }; })(); 事物将伪数组slice转换为真实数组。)



arguments

var unusedDigits = (function() {
    var digits = [0,1,2,3,4,5,6,7,8,9];
    var slice = Array.prototype.slice;

    return function unusedDigits() {
        var astring = String(slice.call(arguments));
        return digits.filter(function(b) { return astring.indexOf(b) == -1}).join("");
    };
})();

snippet.log(unusedDigits(12345));




答案 1 :(得分:1)

 function unusedDigits(...a){
  return `0123456789`.split('').filter(b=>`${a}`.split('').indexOf(b)==-1).join('');
 }

 alert(unusedDigits(12345))  

...第一行中的a是rest运算符 - 这会将arguments数组分配给函数体内的变量a(因此您不必处理Array.prototype.slice.call(arguments)在这种情况下,var a = [12345]

'0123456789'.split('')会将0-9中的所有数字拆分成一个数组 - 然后我们将其过滤掉。

b => ${a}。split('')。indexOf(b)== - 1是过滤器的谓词函数。 =>被称为'胖箭头语法'或'箭头功能'。这是ES6 - 它是函数的简写语法,它还将当前“this”绑定绑定到函数。如果正文在同一行,它将隐式返回表达式。

${a}是模板字符串语法 - 在这种情况下将我们的参数数组[12345]强制转换为'12345',然后我们将其拆分为执行操作索引以查看当前数字(b)是否为分割参数数组中有0-9位数字。在它结束时,我们返回所有那些不在arguments数组中的数字0-9的过滤结果,以字符串形式连接 - 在本例中为'06789'。

答案 2 :(得分:0)

语言功能:

`${1}`;
// gives "1"
var v = 1; `${v}${v}`;
// gives "11"
x => x != "2";
// same as function (x) { return x != "2"; } 
(x => x != "2")("1");
// gives true
((u, ...v) => v)(1, 2, 3);
// gives [2, 3]

字符串和数组方法:

"123".split("");
// gives ["1", "2", "3"]
["1", "2", "3"].join("");
// gives "123"
["1", "2", "3"].indexOf("2");
// gives 1
["1", "2", "3"].indexOf("4");
// gives -1
["1", "2", "3"].filter(x => x != "2");
// gives ["1", "3"]

接近你的代码(转换函数非常糟糕,不要使用它们,我只是想为前面的代码提供一些上下文):

var itos = i => `${i}`; // integer to string
var stoa = s => s.split(""); // string to array
var atos = a => a.join(""); // array to string
var isIn = (x, set) => set.indexOf(x) != -1;

var unusedDigits = function (i) {
  // allDigits is ["0", "1", ..., "9"]
  var allDigits = stoa("0123456789");
  // if i is 12 then usedDigits is ["1", "2"]
  var usedDigits = stoa(itos(i));
  // convert filtering result to a string
  return atos(
    // make a set of digits not in usedDigits
    allDigits.filter(
      // d will be "0" then "1" ... until "9"
      d => !isIn(d, usedDigits)
    )
  );
};

document.write(JSON.stringify(
  unusedDigits(13579) // gives "02468"
));