.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);
}
我想做的就是在我的 console.log 前面加上一条自定义消息。如果可以用我正在尝试的更简单的方式完成,请告诉我。
我有一个带有方法 log
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);
}