如何检查基元的ID?

时间:2014-04-11 19:15:57

标签: javascript

根据我的理解: - 原型类型测试是否相等

'lol' === 'lol'
true

是的,因为内容是相同或真实的,因为内存中的对象ID是相同的吗?

- 身份的复合类型测试

[1,2,3] === [1,2,3]
false

错误,因为引用变量是diff或diff,因为内存中的对象ID是diff?

我希望能够区分:
A)参考变量
B)标识符(命名空间)
C)记忆中的实际对象
D)ID

是否有允许我单独测试这些内容的命令?

2 个答案:

答案 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文章中的列表。

  • 两个字符串在相应位置具有相同的字符序列,相同的长度和相同的字符时严格相等。
  • 两个数字在数值上相等(具有相同的数值)时严格相等。 NaN不等于任何东西,包括NaN。正负零彼此相等。
  • 如果两个布尔操作数都为真或两者都为假,则它们严格相等。
  • 对于严格或抽象的比较,两个不同的对象永远不会相等。
  • 如果操作数引用相同的对象,则仅比较对象的表达式。
  • 空和未定义的类型是==(但不是===)。

因此两个字符串严格相等,因为它们包含完全相同的字符序列。这两个数组不相等(严格或抽象),因为它们是两个不同的对象。

对于基元或对象,JavaScript中没有“ID”的概念。这些平等规则会产生你所看到的行为。