Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/455.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 宽恕是错误的_Javascript_Boolean - Fatal编程技术网

Javascript 宽恕是错误的

Javascript 宽恕是错误的,javascript,boolean,Javascript,Boolean,在javascript中,我们经常看到0和1表示布尔值TRUE和FALSE 当将javascript与HTML结合使用时,源自HTML元素(例如表单或元素属性)的值可能具有“类型”转换(例如“1”或“true”),并且可以作为字符串传递给javascript 此外,字符串形式的TRUE也可能有不同的值,如lower/upper/camel大小写(TRUE/TRUE/TRUE) 所以判断真是很棘手。我想知道下面的函数是否涵盖了所有的基,或者我是否遗漏了什么 function isFalse (va

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

当将javascript与HTML结合使用时,源自HTML元素(例如表单或元素属性)的值可能具有“类型”转换(例如“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 );
}
函数为false(val){
//只需使用isTrue,就不必针对“”和null进行测试
返回!isTrue(val);
//这是针对FALSE进行测试所需的实际代码,请注意额外的“”和NULL检查
/*
if(typeof val==“string”){
return!(val==“0”| | val==“val.toLowerCase()==“false”);
}else if(typeof val==“object”&&val!==null){
返回Object.keys(val).length;
}
返回!!val;
*/
}
函数isTrue(val){
if(typeof val==“string”){
返回值(val==“1”| val.toLowerCase()==“true”);
}else if(typeof val==“object”&&val!==null){
返回Object.keys(val).length;
}
返回!!val;
}
//用于测试的空var
var emptyvar;
//测试值列表
//[数值为t/f,数值]
变量列表=[
[1, 1]
, [1, "1"]
,[1,正确]
,[1,“正确”]
,[1,“正确”]
,[1,“正确”]
, [0, 0]
, [0, "0"]
,[0,错误]
,[0,“假”]
,[0,“假”]
,[0,“假”]
,[0,NaN]
,[0,未定义]
,[0,emptyvar]
,[0,空]
, [0, ""]
, [0, {}]
, [0, []]
];
console.log(“--------------为真-----------------”;
对于(var i=0;i
在javascript中,我们经常看到0和1表示布尔值TRUE和FALSE

我不知道?但是是的,
0
1
可以与
false
true
互换(只需执行
+
转换即可)

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

不,您只能这样做。标准HTML布尔属性可以通过具有真正布尔类型的DOM属性访问。并且可以通过定义良好的转换规则访问

我想知道下面的函数是否涵盖了所有的基,或者我是否遗漏了什么

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,因此为True。你能解释一下你的代码正在解决什么问题吗?也很好奇你在这里试图解决什么问题。你只是想处理
0
“0”之类的事情吗
始终如一?许多小型过滤器(如Google Closure和YUI Compressor)将布尔值替换为0/1。这是对段塞的惰性编码。通常情况下,DOM复选框在“选中”或未选中时本质上是布尔值,但在“属性”中不是真布尔值从HTML元素开始,我想到的是数据自定义属性,如中。我同意,检查对象或数组是否为空不是要求的一部分。@bob:好的,缩微器有时会扭曲语言规则-这并不意味着你应该这样做。尽管他们使用
!0
!1
。然后,
输入元素的类型.checked
非常布尔。在自定义数据属性中放置的是您的选择(您选择值域),这里的一个好选择是JSON,它可以将布尔值序列化并解析为字符串。其思想是“存在”、“有值”和“假阳性”之间的交叉。例如,在标记上,有“控件”属性,如果它存在,则为“true”,但不必显式设置为true——这是HTML和Javascript的古老的宽容性质。@鲍勃:你必须区分HTML和Javascript、标记和元素、属性和属性。在HTML中,有
(后三个是等效的);在DOM中有
videoEl.controls
,它始终存在,并且是
true
false