且构网

分享程序员开发的那些事...
且构网 - 分享程序员编程开发的那些事

《JavaScript启示录》——1.10 原始值比较采用值比较

更新时间:2022-09-16 14:46:46

本节书摘来自异步社区《JavaScript启示录》一书中的第1章,第1.10节,作者:【美】Cody Lindley著,更多章节内容可以访问云栖社区“异步社区”公众号查看

1.10 原始值比较采用值比较

可以通过比较原始值来确定其值在字面上是否相同。从逻辑上讲,如果将一个包含数值10的变量与另一个包含数值10的变量进行比较,JavaScript将会认为它们是相等的,因为10与10是相同的(即10===10)。同样,如果将原始字符串“foo”与另一个拥有‘foo’值的原始字符串进行比较也会采用同样的方法。比较的结果是,根据它们的值,它们是彼此相等的(即‘foo’===‘foo’)。

在下面的代码中,我使用原始数字演示了“值比较”的概念,并将它与复杂数字对象进行比较。

<!DOCTYPE html><html lang="en"><body><script>

var price1 = 10;
var price2 = 10;
var price3 = new Number('10'); // 复杂数字对象,因为使用了new 
var price4 = price3;

console.log(price1 === price2); // 输出true

// 输出false,因为price3包含了一个复杂数字对象,而price1是原始值
console.log(price1 === price3);

// 输出true,因为复杂对象采用引用比较,而不是值比较
console.log(price4 === price3);

// 如果使price4的值变为原始值,那又如何呢?
price4 = 10;
console.log(price4 === price3); /* 输出false: price4此时是原始值,而非复杂对象 */

</script></body></html>

这里的重点是,在进行比较时,原始值会去检查表示的值是否相等。当使用new关键字创建字符串、数字或布尔值时[如new Number('10')],这个值就不再是原始值。同样地,如果通过字面量语法创建的值进行比较,结果就不同了。这并不奇怪,因为原始值是按值来存储的(10===10成立吗?),而复杂值是按引用来存储的(price3和price4包含对相同值的引用吗?)。