.apply() 与节点中的传播运算符

.apply() vs spread operator in node

我想做的就是在我的 console.log 前面加上一条自定义消息。如果可以用我正在尝试的更简单的方式完成,请告诉我。

我有一个带有方法 log

的 ES6 模块 logger
const { Console } = require('console');

const console = new Console(process.stdout, process.stderr);

module.exports = {
  date: new Date().toISOString().slice(0, 19).split('T')[0],
  time: new Date().toISOString().slice(0, 19).split('T')[1],
  log() {
    process.stdout.write(`[${this.date} ${this.time}] INFO `);
    console.log.apply(console, arguments);
  }
};

现在当我 运行 logger.log() 我得到的输出是:

logger.log('--- Some text 1 ---');
[2021-03-22 16:42:46] INFO --- Some text 1 ---
logger.log('--- Some text 2 ---', { aa: 11 });
[2021-03-22 16:42:46] INFO --- Some text 2 --- { aa: 11 }
logger.log('--- Some text 3 ---', 'another string');
[2021-03-22 16:42:46] INFO --- Some text 3 --- another string

这正是我想要的!
但是 ESLint 抱怨 Use the spread operator instead of '.apply()'. ESLint reference here 我想要一个干净的代码所以我遵守将我的代码更改为:

const { Console } = require('console');

const console = new Console(process.stdout, process.stderr);

module.exports = {
  date: new Date().toISOString().slice(0, 19).split('T')[0],
  time: new Date().toISOString().slice(0, 19).split('T')[1],
  log(...args) { // CHANGE HERE
    process.stdout.write(`[${this.date} ${this.time}] INFO `);
    console.log(args); // CHANGE HERE
  }
};

现在 ESLint 很满意,但是 运行使用相同的测试会产生不同的结果:

logger.log('--- Some text 1 ---');
[2021-03-22 16:40:57] INFO [ '--- Some text 1 ---' ]
logger.log('--- Some text 2 ---', { aa: 11 });
[2021-03-22 16:40:57] INFO [ '--- Some text 2 ---', { aa: 11 } ]
logger.log('--- Some text 3 ---', 'another string');
[2021-03-22 16:40:57] INFO [ '--- Some text 3 ---', 'another string' ]

为什么扩展运算符版本突然输出我的参数的数组
我做不到 console.log(args.join(' ')),因为第二次测试会出现 --- Some text 2 --- [object Object]
我在这里错过了什么?

linter 告诉您改用扩展语法。但是您没有在 console.log 调用中使用扩展语法。 (您正在使用 argument rest 语法将所有参数收集到一个名为 args 的数组中,但您仍然需要调用 console.log 并将这些数组项作为单独的参数)

log(...args) {
    process.stdout.write(`[${this.date} ${this.time}] INFO `);
    console.log(args);
}

应该是

log(...args) {
    process.stdout.write(`[${this.date} ${this.time}] INFO `);
    console.log(...args);
}