js函数参数下划线占位符报错?

新手上路,请多包涵

js函数参数占位符报错问题

经网上搜索,如果函数传入多个值,但是又没有使用第一的值,可以用_符号进行展位,但是自己写代码时会发现浏览器报错。代码如下

        function nameVal(val1, val2) {
            console.log(val1, val2)
        }
        nameVal(_, "second")

报错信息 title=
该怎么占位呢?

阅读 3.1k
6 个回答

占位符的场景,无非就是 函数中 某个参数是非必填的

要注意_没有这个语法,会默认把它当成一个变量的参数;

可以尝试以下几种方案:

1: 必填项放置开头,非必填放置最后

function nameVal(val1, val2) {
  console.log(val1, val2) // val2 undefined
}
nameVal("first")

2: 设置默认值

function nameVal(val1, val2) {
  console.log(val1, val2) // val2 undefined
}
nameVal("", "first")

3:解构

function nameVal(...arg) {
// 这里的解构是你参数的顺序来的
// first: secornd  secornd:undefined
  const [first, secornd] = arg;
  console.log(first, secornd) 
}

nameVal("secornd")

因为JS没有这个语法,所以不行, 那么_就是一个普通的变量名但是没有定义因此就报错了, 如果要跳过一般是nameVal(undefined, "second")nameVal(null, "second"), 不过为什么要这样写代码呢??

JS 没有这个语法吧。

参考这个:JS有没有参数占位操作?


如果传入参数数量不确定,可以把参数放在 object 中传入。

使用 object 方法的话,不需要考虑传入参数的次序问题。

    /**
     *
     * @param {object} options 参数配置
     * @param {string} options.param1 参数 1
     * @param {string} options.param2 参数 2
     * @param {boolean} options.param3 参数 3
     */
    function test(options) {
        if (options.param1) {
            // ...
        }
        if (options.param2) {
            // ...
        }
        if (options.param3) {
            // ...
        }
    }

    test({param1: '0001', param2: '0002', param3: true});
    test({param1: '0001', param2: '0002'});
    test({param2: '0002'});
    test({param2: '0002', param1: '0001'});

你这个占位符的意义是什么呢?应该也是表示undefined或者null吧,那么,你可以用以上两者去占位,效果是一样的,否则,你在函数内部如何处理这个下划线呢,表示undefined还是null你总得选一个吧,所以,这种占位符还有什么意义呢?一楼和二楼分别给出的两种方案都是可行的,object的方式比较适合参数较多或者比较正式的写法,而非object的方式适合参数少、节奏快的情境,酌情使用。

印象中有用下划线作为函数参数占位符的工具库有underscorelodash,这些库之所以支持这种写法是因为预先定义并导出了“_”这个变量,且在函数的实现中做了一系列判断操作,例如你题中的函数要实现这个功能可以这么写:

const _ = {};
function nameVal(...val) {
    for (let i = 0; i < val.length; ++i) {
        if (val[i] === _) continue;
        // do something...
    }
    console.log(...val);
}
nameVal(_, "second");

是这种情况一般用 _ 占位

[1,2,3].map((_, index) => console.log(index));
撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题
宣传栏