为什么[0] === [0]为假

时间:2017-11-17 10:07:22

标签: javascript types

如果调试显示变量为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。怎么会是假的?

3 个答案:

答案 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.



2. [0] == "0"评估为true,因为:

在JavaScript中,由于==运算符的性质,当您将对象与基元进行比较时,该对象将被强制转换为基元,然后该基元将被强制转换为您尝试与其进行比较的特定类型的基元。

"0"是一个字符串,因此必须将[0]强制转换为字符串。怎么样 ?首先,JavaScript将调用其valueOf方法以查看它是否返回原语,valueOf的数组版本将只返回该数组,因此valueOf不会产生原语;现在JavaScript将尝试对象的(又名数组)toString方法,数组的toString方法将返回一个字符串,该字符串是其元素的逗号分隔串联的结果(每个元素将被强制转换为字符串也是如此,但这与此无关),如果您的数组包含多个元素(例如,如果它是[0,1]toString将返回"0,1"),这将更加明显,但是你的数组只有1个元素,所以它的字符串化结果是"0"(如果toString没有返回字符串而是另一个原语,那个原语将在ToString摘要中使用操作;如果valueOftoString都没有返回原语,则会抛出TypeError

现在,我们的最终比较,包括所有强制和内容,已经变为"0" == "0",即true


3. [0] == 0,大多数与#2相同,除非JavaScript具有字符串"0",它会将其强制转换为数字,将字符串"0"强制转换为数字的结果是号码0。我们0 == 0true


4. [0] === 0[0] === "0",这两个非常简单,因为您使用的是===,所以不会发生强制行为。 在第一个中,[0]所持有的引用(在内存中指向的位置)将与数字0进行比较,这显然会评估为false; 在第二个中,[0]所持有的引用将与字符串"0"进行比较,再次为false


所以,正如你所看到的那样,好的ser,你的所有痛苦来自==,这个算子和!=被称为“===!==的邪恶对手道格拉斯·克罗克福德(Douglas Crockford),出于同样的原因导致了你的混乱。

随意请求您可能需要的任何详细说明,并提出您可能遇到的任何问题。

此外,请参阅this有关对象强制的文章,this有关Array#toString的MDN文章和this StackOverflow问题,其中概述了==和{之间的差异{1}}。