考虑保持相同值的两个不同变量的原因是什么

时间:2017-09-12 19:19:58

标签: javascript

我可能非常错,但我需要问这个问题,因为它让我感到困惑,我想这是一个非常基本的JavaScript问题。

我一生都习惯于变量名是指向存储值的记忆位置的指针。猜猜是什么

var a = 30

a是一个指针,指向存储30的存储位置。如果我们声明另一个变量,请说

var b = 30

b将是另一个变量。 30将被存储在内存和变量名称的某个位置' b'将用于查找内存中的值。

我的观点是,a和b是两个不同的变量,指向两个不同的内存位置但两个相似的值。那么下面的表达式如何计算为true?为什么以及这种评估的好处是什么?

a === b // true

4 个答案:

答案 0 :(得分:1)

这通常是JavaScript混乱的根源。

在JavaScript中,所有值都会传递并比较 "按值" 。问题是保存基元的变量存储基元的实际值,而保存对象的变量存储对象的存储位置的值。

关于=====的讨论与此无关,因为它们总是比较值(基元的值或内存位置的值),它只是{{1在像===之类的比较之前,不会对操作数值进行任何隐式转换。但是,两者都总是根据值检查一个值。

==是一个原始的。与它进行比较时,将比较基元的值(而不是内存位置)。

现在,如果您要比较对象,那么这些对象的内存位置就是存储在变量中的内容,这就是比较的内容。



30




仅供参考:如果您有兴趣知道两个对象是否基本相同(内存中的单个实例不同,但状态相同),您可以将每个对象转换为基元,然后检查这些原始值彼此:



// Primitive values (numbers, strings, booleans) are stored directly in variables
var a = 30; // 30 is a primitive value
var b = 30  // 30 is a primitive value

console.log(a === b)  // true because 30 === 30


// Object references (memory location) are stored in variables
var objA = {};
var objB = {};

console.log(objA === objB);  // False because the two variables store memory locations




答案 1 :(得分:0)

您正在使用严格的等式比较(===),在您的情况下比较值(基元)而不是它们的内存位置:

  

严格相等性比较两个相等的值。这两个价值都不是   在比较之前隐式转换为其他值。如果   值具有不同的类型,值被认为是不相等的。   否则,如果值具有相同的类型而不是数字,   如果它们具有相同的值,则认为它们是相等的。最后,如果两者都有   值是数字,如果它们都不是NaN,则它们被认为是相等的   并且是相同的值,或者如果一个是+ 0而一个是-0。 Source

答案 2 :(得分:0)

当您比较javascript中的Numbers时,您正在比较值,而不是引用。这就是为什么在你的例子中a === b是真的。 你认为平等工作的方式对于对象来说是正确的,所以让我们说

var a = {
    x: 30
}

var b = {
    x: 30
}

a === b // false

即使它们看起来相同

答案 3 :(得分:-1)

在面向对象的语言中,如果a和b是对象,则a == b通过调用a.equals(b)来完成。 equals()比较存储在私有成员中的一些原始类型。因此,a和b可以是一个类的两个不同的实例并且是相等的。