变量赋值和严格相等在Javascript中的工作原理,更深入一点

变量赋值和严格相等在Javascript中的工作原理,更深入一点,javascript,pass-by-reference,variable-assignment,equality,pass-by-value,Javascript,Pass By Reference,Variable Assignment,Equality,Pass By Value,我们都知道JS有对象和一组原语 让我们检查以下作业 a = 'foo'; b = a; c = 'foo' a === b; //true a = b = c = undefined; 多年来,我在JS中可视化变量赋值过程的方式是这样的 a=‘foo’; 将创建一个新的基本字符串foo并将其添加到内存位置。变量a现在指向内存中的该位置 b=a 变量b指向内存中与a相同的位置,这意味着它指向foo c=‘foo’ 基本字符串foo已经存在于内存中,所以变量c只是指向它 a==b//符合事实的 变

我们都知道JS有对象和一组原语

让我们检查以下作业

a = 'foo';
b = a;
c = 'foo'
a === b; //true
a = b = c = undefined;
多年来,我在JS中可视化变量赋值过程的方式是这样的

a=‘foo’; 将创建一个新的基本字符串foo并将其添加到内存位置。变量a现在指向内存中的该位置

b=a 变量b指向内存中与a相同的位置,这意味着它指向foo

c=‘foo’ 基本字符串foo已经存在于内存中,所以变量c只是指向它

a==b//符合事实的 变量a和b通过引用进行比较,这意味着唯一要检查的是它们是否指向内存中的相同位置,而不是它们的值是否相同。这意味着无论字符串有多长,这都应该是一个快速操作

a=b=c=未定义 变量a、b、c都指向未定义的原语。原语foo没有被任何变量指向,因此它是垃圾收集的

以上所有内容也应适用于对象属性

我对JS的工作原理有101%的把握,直到今天,我与一位同事进行了一次谈话,他和我一样确信,当比较两个变量时,即使使用严格的等式==,也会通过值而不是引用进行比较

因此,如果我们必须比较两个变量,这两个变量都被分配了一个非常大的字符串,例如

a = 'a huge string';
b = 'a huge string';
a === b; //true, takes 1ms
与仅为两个变量分配一个字母字符串相比,此相等性检查需要更长的时间。e、 g

a = 'a small string';
b = 'a small string';
a === b; //true, takes 0.1ms
总之 我的任何要点我的理解是错误的吗?严格相等是否比较值而不是引用

欢迎并鼓励提供技术性答案


谢谢。

当您使用基本类型Number、String、Boolean时,您正在比较它们的值

"string one" == "string one";  // true
3 == 3;  // true
false == false;  // true
即使是未定义的工程也类似:

undefined == undefined;  // true
例外情况是:

NaN == NaN;  // false
比较对象时,比较对象的引用。例如:

var obj1 = { "name": "Charles" };
var obj2 = { "name": "Charles" };
obj1 == obj2;  // false
obj1 === obj2;  // false
根据等级库,==比较值,而不是参照,除非这些值是对象

对于字符串比较,它们是按字典顺序进行比较的,就像检查所有字符是否在同一顺序上相等一样

如果x和y是完全相同的代码单元序列、相同的长度和对应索引处的相同代码单元,则返回true;否则,返回false

以下是a==b的通用算法:

我不久前写了一篇文章,根据ES5规范演示了==和===算法,这可能会有所帮助

现在,就重用已经定义的字符串中的内存而言,例如出于效率原因指向同一内存的a='foo'和c='foo'示例,这是一个引擎可以进行的优化,可以使事情更快,但不是规范的一部分


事实上,这被称为,许多语言都这样做。

对您的假设有一个重要的警告。您在某种程度上将单个JS引擎实现细节与官方ECMAScript规范混为一谈。并非所有这些行为都在规范中概述。我正确理解您的问题,主要的一点是字符串和数字在对象数组中按值进行比较和赋值,功能通过引用进行比较和分配。考虑var a= {};变量b={}但a!==B正如你所展示的,弦是相等的。这确实是一个令人大开眼界的答案,谢谢你。所以,从技术上讲,我的同事是对的:好吧,再一次,这是理论和实践之间的一条细线:。实际上,大多数引擎都会进行字符串实习,所以我想说,在决定谁是对的之前,你们都需要先定义判断规则
// if both are undefined, return true
// if both are null, return true
// if both are numbers
//    if a is NaN, return false
//    if b is NaN, return false
//    if are equal numeric values, return true
//    if a is +0 and b is -0, return true
//    if b is +0 and a is -0, return true
//    return false
// if both are strings
//    if all chars equal and in the same order, return true
//    return false
// if both are booleans
//    if both are true or both are false, return true
//    return false
// if both are objects
//    if are equal references, return true
//    return false
// return false