【问题标题】:forgiving isTrue isFalse宽容 isTrue isFalse
【发布时间】:2015-03-12 19:57:36
【问题描述】:

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

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

此外,我们还可以将字符串形式的 TRUE 设置为不同的值,如小写/大写/驼峰式 (TRUE / 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 );
}

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

【问题讨论】:

  • True 和 False 是条件而非实际值。例如,我实际上可能想知道值何时为 NaN 并且因此为真。你能解释一下你的代码解决了什么问题吗?
  • 也很好奇你想在这里解决什么问题。您是否只是想始终如一地对待0"0" 之类的东西?

标签: javascript boolean


【解决方案1】:

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

我没有?但是是的,01 可以与 falsetrue 互换(只需使用 +!! 进行转换)。

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

不,你很少会这样做。标准的 HTML 布尔属性 can 应该通过具有真正布尔类型的 DOM 属性来访问。以及非常明确的转换规则。

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

函数永远不会涵盖所有情况。综上所述,你几乎不需要这样的转换函数,而且当你这样做时,它是针对一个非常有限的域。在这种情况下,请定义您所在领域的案例并涵盖它们。

因此,对于您的测试用例 - 域定义 - 您提出的功能显然运作良好。但是我确实觉得这个域有点奇怪,我从不认为一个对象(即使是空的)是虚假的。

【讨论】:

  • Google Closure 和 YUI Compressor 等许多压缩器将布尔值替换为 0/1。它是 slug 的惰性编码。通常,当“选中”或未选中时,DOM 复选框本质上是布尔值——但不是真正的布尔值?对于从 HTML 元素中提取的“属性”,我正在考虑数据自定义属性,例如
    。我同意,检查对象或数组是否为空并不是要求的一部分。
  • @bob:好的,缩小器有时会破坏语言的规则——这并不意味着你应该这样做。虽然 afaik 他们使用 !0!1。然后,typeof inputElement.checked 是非常布尔的。您在自定义数据属性中放置的内容是您的选择(您选择值域),这里一个不错的选择是 JSON,它可以将布尔值序列化并解析为字符串。
  • 这个想法是“存在”、“有价值”和“误报”之间的一种交叉。例如,在
  • @bob:您必须区分 HTML 和 JavaScript、标签和元素、属性和属性。在 HTML 中,有&lt;video&gt;&lt;video controls&gt;&lt;video controls=""&gt;&lt;video controls="controls"&gt;(后三个是等价的);在 DOM 中,您有 videoEl.controls,它始终存在并且是 truefalse
猜你喜欢
  • 2019-12-31
  • 2016-07-10
  • 1970-01-01
  • 2015-08-27
  • 1970-01-01
  • 2011-12-01
  • 2017-08-08
  • 2022-01-18
  • 2023-04-05
相关资源
最近更新 更多