如何编写isNotSet函数检测TOML文件中的0、false及未定义项?
如何正确判断TOML解析后的值是否为未设置/空值?
你遇到的问题确实很典型——JavaScript里的falsy值(比如0、false)会被普通的空值判断函数误判为“空”,但它们在TOML里是合法的已设置值。我们需要专门针对TOML解析后的结果,区分已设置的合法值和真正的未设置/空值。
问题根源
你的isEmpty和isBlank函数依赖于值的布尔判断:!str会把0、false都视为“假”,但这些都是TOML里明确设置的有效值,不应该被判定为“未设置”。真正需要识别的未设置/空值只有两种情况:
- 键完全不存在(解析后对象中没有这个键,值为
undefined) - 键存在,但值是空字符串(
'')
解决方案:编写isNotSet函数
我们可以编写一个函数,精准判断这两种情况:
const TOML = require('@iarna/toml') const fs = require('fs'); const f = TOML.parse(fs.readFileSync('test.toml', 'utf-8')) console.log(f) // 判断值是否为未设置/空值:返回true表示未设置或为空字符串 function isNotSet(obj, key) { // 首先检查键是否存在于对象自身属性中 if (!Object.prototype.hasOwnProperty.call(obj, key)) { return true; } // 键存在的情况下,仅把空字符串视为空值 const value = obj[key]; return value === ''; } // 相反逻辑:判断值是否已设置(非空且存在) function isSet(obj, key) { return !isNotSet(obj, key); } // 测试结果 console.log('isNotSet结果:'); console.log(isNotSet(f, 'test1')); // false(test1=0,已设置) console.log(isNotSet(f, 'test2')); // false(test2=false,已设置) console.log(isNotSet(f, 'test3')); // true(test3='',空字符串) console.log(isNotSet(f, 'test4')); // true(test4未定义) console.log('isSet结果:'); console.log(isSet(f, 'test1')); // true console.log(isSet(f, 'test2')); // true console.log(isSet(f, 'test3')); // false console.log(isSet(f, 'test4')); // false
执行结果
运行上述代码后,你会得到期望的输出:
{ test1: 0, test2: false, test3: '' } isNotSet结果: false false true true isSet结果: true true false false
关键细节说明
- 使用
Object.prototype.hasOwnProperty.call(obj, key)而非obj.hasOwnProperty(key):这是为了避免对象原型链上的属性干扰,确保我们只检查对象自身拥有的键。 - 仅将空字符串判定为“空值”:
0、false、null(若TOML中设置)都属于已设置的有效值,不会被误判。
内容的提问来源于stack exchange,提问作者Sandra Schlichting
相关产品推荐
相关产品推荐

