根据我的理解: - 原型类型测试是否相等
'lol' === 'lol'
true
是的,因为内容是相同或真实的,因为内存中的对象ID是相同的吗?
- 身份的复合类型测试
[1,2,3] === [1,2,3]
false
错误,因为引用变量是diff或diff,因为内存中的对象ID是diff?
我希望能够区分:
A)参考变量
B)标识符(命名空间)
C)记忆中的实际对象
D)ID
是否有允许我单独测试这些内容的命令?
答案 0 :(得分:6)
'lol'==='lol'
给你真实,因为它是一个字符串文字。它属于按值传递类别,内存中的位置相同。
但是,如果你做了像
这样的事情var s1=new String('lol');
var s2=new String('lol');
s1===s2 //returns false
因为s1和s2是字符串对象并且按引用类别传递。值指向内存中的不同位置
[1,2,3]===[1,2,3]
也会返回false,因为数组是Javascript中的默认对象。 JS中没有原始形式的数组。它们属于参考类别,内存位置不同。
答案 1 :(得分:4)
JavaScript有两种比较 - 严格和抽象。 ==
运算符执行抽象比较,这意味着它可以将值转换为其他类型,然后比较结果值。 ===
运算符执行严格比较,这意味着它永远不会转换类型。我们确定两个值是否严格相等的方式取决于值的类型,而不仅仅是它们在内存中的位置。我查看了这一点以确保所有案例都正确,所以这是Mozilla的Comparison Operators文章中的列表。
因此两个字符串严格相等,因为它们包含完全相同的字符序列。这两个数组不相等(严格或抽象),因为它们是两个不同的对象。
对于基元或对象,JavaScript中没有“ID”的概念。这些平等规则会产生你所看到的行为。