如果调试显示变量为0,那么我认为我应该能够用===' 0'或者=== 0但是没有用。我不得不只使用==,然后才有效:
@SpringComponent
@UIScope
public class FuelEditor extends VerticalLayout{
TextField date = new TextField("Data");
TextField price = new TextField("Cena");
TextField amount = new TextField("Kwota tankowania");
Binder<Fuel> binder = new Binder<>(Fuel.class);
@Autowired
public FuelEditor(FuelReposiotry fuelReposiotry) {
// Bind float fields manually
binder.forField(price)
.withConverter(new StringToFloatConverter("Value must be a float"))
.bind(Fuel::getPrice, Fuel::setPrice);
binder.forField(amount)
.withConverter(new StringToFloatConverter("Value must be a float"))
.bind(Fuel::getAmount, Fuel::setAmount);
// bind the last using naming convention
binder.bindInstanceFields(this);
}
我第一次尝试了这个,但它没有工作:
var offset = 0;
alert("## DEBUG non_sortable_columns " + non_sortable_columns)
if (non_sortable_columns == '0' || non_sortable_columns == 0) {
offset = 1;
}
值为[0]且var offset = 0;
alert("## DEBUG non_sortable_columns " + non_sortable_columns)
if (non_sortable_columns === '0' || non_sortable_columns === 0) {
offset = 1;
}
为false。怎么会是假的?
答案 0 :(得分:1)
我刚做了以下测试
var num = 0;
console.log("Number: ", num);
if(num === '0' || num === 0) {
console.log("Num is 0 (===)");
}
if(num == '0' || num == 0) {
console.log("Num is 0 (==)");
}
并获得输出
Number: 0
Num is 0 (===)
Num is 0 (==)
尝试使用console.log值本身,如果您向JS中的数字发出警告或附加字符串,它将始终作为字符串输出。在尝试调试代码时,这可能会产生误导。
答案 1 :(得分:1)
non_sortable_columns
的值可能是false
。
===
和==
之间的基本区别在于3等于比较运算符也检查变量的类型,这意味着:'0'
这是一个字符串不等于: 0
这是一个数字。
在您的情况下,变量non_sortable_columns
值可能是false
,这意味着JavaScript中的0
因此==
的值会发现它与它不相同检查类型,但===
失败,因为它检查了它的类型。
为了更好地理解,请参阅:Which equals operator (== vs ===) should be used in JavaScript comparisons?
答案 2 :(得分:1)
1。 [0] === [0]
是false
,因为每个[0]
实际上是一个声明,它创建一个数字为0
的数组作为其第一个索引。
数组是对象,在JavaScript中,2个对象仅==
或===
,并且仅当它们指向内存中的相同位置时。这意味着:
var a = [];
var b = a;
console.log(a == b); // "true". They both point at the same location in memory.
a = [];
b = [];
console.log(a == b); // "false". They don't point at the same location in memory.
[0] == "0"
评估为true
,因为:==
运算符的性质,当您将对象与基元进行比较时,该对象将被强制转换为基元,然后该基元将被强制转换为您尝试与其进行比较的特定类型的基元。
"0"
是一个字符串,因此必须将[0]
强制转换为字符串。怎么样 ?首先,JavaScript将调用其valueOf
方法以查看它是否返回原语,valueOf
的数组版本将只返回该数组,因此valueOf
不会产生原语;现在JavaScript将尝试对象的(又名数组)toString
方法,数组的toString
方法将返回一个字符串,该字符串是其元素的逗号分隔串联的结果(每个元素将被强制转换为字符串也是如此,但这与此无关),如果您的数组包含多个元素(例如,如果它是[0,1]
,toString
将返回"0,1"
),这将更加明显,但是你的数组只有1个元素,所以它的字符串化结果是"0"
(如果toString
没有返回字符串而是另一个原语,那个原语将在ToString
摘要中使用操作;如果valueOf
和toString
都没有返回原语,则会抛出TypeError
。
"0" == "0"
,即true
。 [0] == 0
,大多数与#2相同,除非JavaScript具有字符串"0"
,它会将其强制转换为数字,将字符串"0"
强制转换为数字的结果是号码0
。我们0 == 0
为true
。 [0] === 0
和[0] === "0"
,这两个非常简单,因为您使用的是===
,所以不会发生强制行为。
在第一个中,[0]
所持有的引用(在内存中指向的位置)将与数字0
进行比较,这显然会评估为false
;
在第二个中,[0]
所持有的引用将与字符串"0"
进行比较,再次为false
。
所以,正如你所看到的那样,好的ser,你的所有痛苦来自==
,这个算子和!=
被称为“===
和!==
的邪恶对手道格拉斯·克罗克福德(Douglas Crockford),出于同样的原因导致了你的混乱。
随意请求您可能需要的任何详细说明,并提出您可能遇到的任何问题。
此外,请参阅this有关对象强制的文章,this有关Array#toString
的MDN文章和this StackOverflow问题,其中概述了==
和{之间的差异{1}}。