原谅isTrue是假的

时间:2015-03-12 19:57:36

标签: javascript boolean

在javascript中,我们经常看到0和1表示布尔值TRUE和FALSE。

当将javascript与HTML结合使用时,源自HTML元素(例如表单或ELEMENT属性)的值可能具有"类型"转换(例如" 1"或" true"并且可以作为字符串传递给javascript。

此外,对于字符串形式,我们也可能有不同的TRUE值作为lower / upper / camel case(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 );
}

上面的代码正确地通过了测试,但是我想知道我是否错过了一些明显的东西?

1 个答案:

答案 0 :(得分:1)

  

在javascript中,我们经常看到0和1表示布尔值TRUE和FALSE。

我没有?但是,01可与falsetrue完全互换(只需转换+!!)。

  

当将javascript与HTML结合使用时,源自HTML元素(例如表单或ELEMENT属性)的值可能具有“类型”转换(例如“1”或“true”,并且可以作为javascript传递给javascript一个字符串)。

不,你很少会。应该通过具有真实布尔类型的DOM属性访问标准HTML布尔属性 can 。并且定义良好的转换规则。

  

我想知道以下功能是否涵盖所有基础,或者我是否遗漏了什么?

功能永远不会涵盖所有情况。如上所述,无论如何,你几乎不需要这样的转换功能,当你这样做是为了一个非常有限的域。在这种情况下,请定义您在域中拥有的案例并覆盖它们。

因此,对于您的测试用例 - 域定义 - 您提出的函数显然效果很好。然而,我发现该域有点奇怪,我从来不会认为一个对象(即使是空的)是假的。