String && Regular Expressions

Functions


函数默认传参

  1. 在ES5中有一些函数功能需要很繁琐的操作才能完成,比如default parameter,如下代码可以模拟es5默认函数传参:

    1. function makeRequest(url, timeout, callback) {
    2. timeout = timeout || 2000;
    3. callback = callback || function(){};
    4. //the rest of the function
    5. }

    这模拟了timeout和callback这两个参数的模拟值,在这个函数中timeout为falsy值的时候会取默认值为2000,但是这引发了一个问题,假如想传的timeout值为0,也会受这个语句影响而变为2000。于是想要真正模拟默认传参还需要做一些改进:

    1. function makeRequest(url, timeout, callback) {
    2. timeout = (typeof timeout !== "undefined") || 2000;
    3. callback = (typeof callback !== "undefined") || function(){};
    4. //the rest of the function
    5. }

    只是设定默认传参而已,就需要这么繁琐的操作,给开发带来不便,于是ES6做了一些改进,允许这样形式规定默认传参:

    1. function makeRequest(url, timeout = 2000, callback = function(){}){
    2. //the rest of the function
    3. }

    在这个函数里面url是必传的,其他两个参数如果不传都会在函数内部使用默认值2000和 function(){}

  2. 另外,在ES6中,默认传参触发生效的时候并不会在arguments对象中,并且在函数内部也不能改变arguments对象(ES5非严格模式在函数内部修改参数值的话会直接改变arguments,严格模式下不会),代码如下: ```javascript function mixArgs(first, second = “b”) { console.log(arguments.length); console.log(first === arguments[0]); console.log(second === arguments[1]); first = “c”; second = “d” console.log(first === arguments[0]); console.log(second === arguments[1]); }

mixArgs(“a”);

//outputs: //1 //true //false //false //false

  1. 3. 你甚至可以在后面的参数中使用前面的参数以及调用函数:
  2. ```javascript
  3. function getValue(value){
  4. return value + 5;
  5. }
  6. function add(first, second = getValue(first)){
  7. return first + second;
  8. }
  9. console.log(add(1, 1)); // 2
  10. console.log(add(1)); // 7

但是要注意的是,你不能在前面的参数的默认值赋值中使用到后面的参数:

  1. function add(first = second, second) {
  2. return first + second;
  3. }
  4. console.log(add(1, 1)); // 2
  5. console.log(add(undefined, 1)); // throws error

之所以如此,是应为受暂时性死区(temporal dead zone, TDZ)规则的限制,你可以想象成是在函数调用的时候使用let依次申明了参数。


Rest Parameters

  1. function pick (object, ...keys){
  2. let result = Object.create(null);
  3. for (let i = 0; i < keys.length; i++){
  4. result[keys[i]] = object[keys[i]];
  5. }
  6. return result;
  7. }

以上代码中keys是一个rest parameter,包含了所有在object之后传入的参数(arguments包括了所有的参数,含有第一个)。

对于rest parameter的限制:

  1. 在函数声明中rest parameter必须是最后一个参数,function pick(object, ...keys, last) {} 这种形式是不可取的;
  1. //SyntaxError: Rest parameter must be last formal parameter
  2. function pick(object, ...keys, last) {
  3. let result = Object.create(null);
  4. for (let i = 0, len = keys.length; i < len; i++) {
  5. result[keys[i]] = object[keys[i]];
  6. }
  7. return result;
  8. }
  1. 不能再setter中使用rest parameter:
  1. let object = {
  2. //SyntaxError: Setter function argument must not be a rest parameter
  3. set name(...value) {
  4. // do something
  5. }
  6. };