宽容是真的是假的
forgiving isTrue isFalse
在javascript中,我们经常看到0和1分别代表布尔值TRUE和FALSE。
将 javascript 与 HTML 结合使用时,源自 HTML 元素(例如表单或 ELEMENT 属性)的值可能具有 "type" 转换(例如“1”或 "true" 并且可以作为字符串传递给 javascript。
此外,我们也可能有不同的字符串形式的 TRUE 值,如 lower/upper/camel 大小写 (TRUE / true / True)。
因此确定真真可能很棘手。我想知道以下函数是否涵盖所有基础,或者我是否遗漏了什么?
function isFalse (val){
// Just use isTrue so we don't have to test against "" and null
return ! isTrue(val);
// This is the actual code needed to test against FALSE, notice the extra "" and NULL checks
/*
if(typeof val == "string"){
return !(val === "0" || val === "" || val.toLowerCase() === "false");
} else if (typeof val == "object" && val !== null) {
return Object.keys(val).length;
}
return !!val;
*/
}
function isTrue(val){
if(typeof val == "string"){
return (val === "1" || val.toLowerCase() === "true");
} else if (typeof val == "object" && val !== null) {
return Object.keys(val).length;
}
return !!val;
}
// An empty var for testing
var emptyvar;
// A list of test values
// [value is t/f, value]
var list = [
[1, 1]
, [1, "1"]
, [1, true]
, [1, "true"]
, [1, "TRUE"]
, [1, "True"]
, [0, 0]
, [0, "0"]
, [0, false]
, [0, "false"]
, [0, "FALSE"]
, [0, "False"]
, [0, NaN]
, [0, undefined]
, [0, emptyvar]
, [0, null]
, [0, ""]
, [0, {}]
, [0, []]
];
console.log("-------------- is true ---------------------");
for(var i=0; i<list.length; i++){
var item = list[i][1];
var tf = isTrue(item);
console.log( "pass : " + (list[i][0] == tf ? 1 : 0) + " - isTrue : " + tf + " : " + (typeof item) + " : " + item );
}
console.log("-------------- is false ---------------------");
for(var i=0; i<list.length; i++){
var item = list[i][1];
var tf = isFalse(item);
console.log( " pass : " + (list[i][0] == tf ? 0 : 1) + " - isFalse : " + tf + " : " + (typeof item) + " : " + item );
}
上面的代码正确地通过了测试,但我想知道我是否遗漏了一些明显的东西?
In javascript, we often see 0 and 1 representing boolean TRUE and FALSE.
我不知道?但是,是的,0
和 1
与 false
和 true
可以互换(只需执行 +
或 !!
进行转换)。
When using javascript in conjunction with HTML, values that originate within an HTML element (e.g. a form or ELEMENT attribute) may have a "type" conversion (e.g. "1" or "true" and could be handed through to javascript as a string).
不,你很少会这样做。标准 HTML 布尔属性 可以 应该通过 DOM 属性访问,这些属性将具有真正的布尔类型。以及定义明确的转换规则。
I'm wondering if the following function covers all bases, or if i've missed something?
一个函数永远不会涵盖所有情况。从上面可以看出,你几乎不需要这样的转换函数,而且当你这样做时,它是针对一个非常受限的域。在这种情况下,请定义您所在域中的案例并涵盖它们。
因此对于您的测试用例 - 域定义 - 您建议的功能显然运行良好。但是我确实觉得那个域有点奇怪,我永远不会认为一个对象(即使是空的)是虚假的。
在javascript中,我们经常看到0和1分别代表布尔值TRUE和FALSE。
将 javascript 与 HTML 结合使用时,源自 HTML 元素(例如表单或 ELEMENT 属性)的值可能具有 "type" 转换(例如“1”或 "true" 并且可以作为字符串传递给 javascript。
此外,我们也可能有不同的字符串形式的 TRUE 值,如 lower/upper/camel 大小写 (TRUE / true / True)。
因此确定真真可能很棘手。我想知道以下函数是否涵盖所有基础,或者我是否遗漏了什么?
function isFalse (val){
// Just use isTrue so we don't have to test against "" and null
return ! isTrue(val);
// This is the actual code needed to test against FALSE, notice the extra "" and NULL checks
/*
if(typeof val == "string"){
return !(val === "0" || val === "" || val.toLowerCase() === "false");
} else if (typeof val == "object" && val !== null) {
return Object.keys(val).length;
}
return !!val;
*/
}
function isTrue(val){
if(typeof val == "string"){
return (val === "1" || val.toLowerCase() === "true");
} else if (typeof val == "object" && val !== null) {
return Object.keys(val).length;
}
return !!val;
}
// An empty var for testing
var emptyvar;
// A list of test values
// [value is t/f, value]
var list = [
[1, 1]
, [1, "1"]
, [1, true]
, [1, "true"]
, [1, "TRUE"]
, [1, "True"]
, [0, 0]
, [0, "0"]
, [0, false]
, [0, "false"]
, [0, "FALSE"]
, [0, "False"]
, [0, NaN]
, [0, undefined]
, [0, emptyvar]
, [0, null]
, [0, ""]
, [0, {}]
, [0, []]
];
console.log("-------------- is true ---------------------");
for(var i=0; i<list.length; i++){
var item = list[i][1];
var tf = isTrue(item);
console.log( "pass : " + (list[i][0] == tf ? 1 : 0) + " - isTrue : " + tf + " : " + (typeof item) + " : " + item );
}
console.log("-------------- is false ---------------------");
for(var i=0; i<list.length; i++){
var item = list[i][1];
var tf = isFalse(item);
console.log( " pass : " + (list[i][0] == tf ? 0 : 1) + " - isFalse : " + tf + " : " + (typeof item) + " : " + item );
}
上面的代码正确地通过了测试,但我想知道我是否遗漏了一些明显的东西?
In javascript, we often see 0 and 1 representing boolean TRUE and FALSE.
我不知道?但是,是的,0
和 1
与 false
和 true
可以互换(只需执行 +
或 !!
进行转换)。
When using javascript in conjunction with HTML, values that originate within an HTML element (e.g. a form or ELEMENT attribute) may have a "type" conversion (e.g. "1" or "true" and could be handed through to javascript as a string).
不,你很少会这样做。标准 HTML 布尔属性 可以 应该通过 DOM 属性访问,这些属性将具有真正的布尔类型。以及定义明确的转换规则。
I'm wondering if the following function covers all bases, or if i've missed something?
一个函数永远不会涵盖所有情况。从上面可以看出,你几乎不需要这样的转换函数,而且当你这样做时,它是针对一个非常受限的域。在这种情况下,请定义您所在域中的案例并涵盖它们。
因此对于您的测试用例 - 域定义 - 您建议的功能显然运行良好。但是我确实觉得那个域有点奇怪,我永远不会认为一个对象(即使是空的)是虚假的。