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