function unusedDigits(...a){
return `0123456789`.split('').filter(
b => `${a}`.split('').indexOf(b) == -1
).join('');
}
document.write(unusedDigits(12345))
什么是
${a}
什么是=>
如果有人可以为我分解此代码,那就太好了!
最佳答案
1,什么是$ {a}
这是新JavaScript template string(由ES2015添加)的替代。它交换发生位置的a
值。可以接受任意表达式。
2,什么是=>
这是ES2015 arrow function。
您没有要求,但是函数声明中...
参数之前的a
是一个“ rest operator”,它表示“请作为数组提供给函数的参数的其余部分。
如果有人可以为我分解此代码,那就太好了!
它返回一个字符串,其中包含不以传递给它的任何参数的字符串形式出现的数字:unusedDigits
函数接受任意数量的参数,它将作为通过a
参数访问的数组接收(由于...
参数的声明中的ES2015 a
rest运算符)。
它接受一串数字0-9,并将其拆分以创建一个数组(例如['0', '1', ...]
)。
然后,它通过filter
函数循环遍历该数组,得到一个新数组,其中仅包含filter
回调所说的条目。filter
回调(ES2015箭头函数)使用ES2015模板字符串创建一个包含a
数组的字符串。由于这涉及隐式调用a.toString()
,因此最终会隐式执行a.join(",")
(因为Array#toString
会这样做),然后检查所检查的数字(b
)是否出现在结果字符串中。 (这不是很有效;没有理由每次都重新创建字符串,也没有理由在此处使用模板字符串。)仅当数字不在字符串中时,它才返回真实值(indexOf
返回了)。
然后,它从剩余的数字开始在字符串的末尾组装一个字符串并返回。
这是更有效的版本FWIW:Live Copy on Babel's REPL
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));
与ES5中相同的功能:
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("");
};
})();
(
-1
事物将伪数组slice
转换为真实数组。)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));
<!-- Script provides the `snippet` object, see http://meta.stackexchange.com/a/242144/134069 -->
<script src="//tjcrowder.github.io/simple-snippets-console/snippet.js"></script>