许多现有答案使用与此语义相似的方法,但我认为值得一提的是,以下“一行”通常就足够了。例如,除了OP的情况(表单中的字符串)外,人们还经常希望从NodeJS中的process.env中读取环境变量(据我所知,其值始终是字符串),以便启用或禁用某些行为,并且这些变量的格式通常为SOME_env_VAR=1。
const toBooleanSimple = (input) =>
['t', 'y', '1'].some(truePrefix => truePrefix === input[0].toLowerCase());
一个稍微更健壮、更具表现力的实现可能如下所示:
/**
* Converts strings to booleans in a manner that is less surprising
* to the non-JS world (e.g. returns true for "1", "yes", "True", etc.
* and false for "0", "No", "false", etc.)
* @param input
* @returns {boolean}
*/
function toBoolean(input) {
if (typeof input !== 'string') {
return Boolean(input);
}
const s = input.toLowerCase();
return ['t', 'y', '1'].some(prefix => s.startsWith(prefix));
}
对此的(玩笑)单元测试可能如下所示:
describe(`toBoolean`, function() {
const groups = [{
inputs: ['y', 'Yes', 'true', '1', true, 1],
expectedOutput: true
}, {
inputs: ['n', 'No', 'false', '0', false, 0],
expectedOutput: false
}]
for (let group of groups) {
for (let input of group.inputs) {
it(`should return ${group.expectedOutput} for ${JSON.stringify(input)}`, function() {
expect(toBoolean(input)).toEqual(group.expectedOutput);
});
}
}
});