一个优秀的javascript程序员很清楚这个测试:
if (typeof(dummy) != 'undefined' && dummy != null && dummy != '') {
// Do stuffs
}
实际上,此测试确保虚拟变量具有值。所以我试着写这个功能。我的测试案例是:
hasValue(undefined) => should returns false
hasValue(null) => should returns false
hasValue('') => should returns false
hasValue(' ') => should returns true
hasValue([]) => should returns false
hasValue({}) => should returns false
hasValue(true) => should returns true
hasValue(false) => should returns true
hasValue(0) => should returns true
hasValue(new Date()) => returns false, but should returns true ?
这是功能:
function hasValue (v) {
if (typeof v === 'object') {
for (key in v) {
if (v.hasOwnProperty(key)) {
return true;
}
}
return false;
}
if (v === false) {
return true;
}
if (v === 0) {
return true;
}
return (typeof(v) != 'undefined' && v != null && v != '');
}
有没有人看到错误或任何优化,或者我忘了某些情况?
答案 0 :(得分:2)
这是一种糟糕的工具方法。您将以下决定汇总到一个函数中:
[]
表示“用户未选择任何选项,再次询问”或“用户未选择任何选项,继续”?{}
表示“没有选项传递给函数”或{}
表示“未传递给函数的选项;使用默认选项”?' '
成为中间名的有效用户输入,但''
无效?0
成为有效的用户ID,即使您的数据库返回它意味着没有用户ID?逻辑依赖于域。如果您正在编程,例如,用户选项的仪表板,您可以实现UserDashboard.hasValue
,false
将返回[]
,其余如上所述,但这是依赖于域的逻辑,而不是一些通用的underscore.js或jQuery或node.js核心模块实用程序函数。
即便如此,阅读也是一团糟。如果我看到该行
if(hasValue(v)) {
...
}
我现在必须阅读hasValue
中的神秘逻辑,找出你允许的假名值[]
,{}
和'
'的可能组合。禁止。如果您只是需要检查v
是否null
编写代码来执行此操作。
有各种语言的方法,如isNullOrEmpty
,这是一种像你所说的实用方法,只有它的名字告诉你完全它做了什么,它不会尝试做所有事情。它可能有比你想象的更冗长的名字。这是对的;它必须,或者它模糊了它实际上在做什么。
答案 1 :(得分:0)
除了一些代码减少,你正在测试对象
if (typeof v === 'object') {
return Object.keys(v).length > 0;
}