【问题标题】:How to check the ID of a primitive?如何检查原语的 ID?
【发布时间】:2014-04-11 19:15:56
【问题描述】:

据我了解: - 原始类型测试相等性

'lol' === 'lol'
true

因为内容相同而为真,还是因为内存中的对象 ID 相同而为真?

-用于身份的复合类型测试

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

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

我希望能够区分:
A) 参考变量
B) 标识符(命名空间)
C) 内存中的实际对象
D) 身份证

是否有命令可以让我单独测试这些东西?

【问题讨论】:

标签: javascript


【解决方案1】:

'lol'==='lol' 给你 true 因为它是一个字符串文字。它属于按值传递类别,并且在内存中的位置是相同的。

但是如果你做类似的事情

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 中没有原始形式的数组。它们属于按引用类别传递,并且内存位置不同。

【讨论】:

  • 所以您似乎在说 '===' 测试 内存位置,而不是值相等。所有数据类型都是这样吗?
  • == 检查相等性,而 === 检查相等性和身份。是的,它对所有人都有效
  • 那怎么来的:a = [1]; b = [1]; a==b false a===b false 我希望第一个测试为真,第二个为假。这是因为它是复合类型的差异吗?
  • == 不适用于对象。在处理对象时,'==' 和 '===' 具有相同的含义。'==' 仅适用于原始对象。如果值相同,'==' 将进行类型转换。所以 "5"==5 会让你返回 true。而 '===' 不会输入转换它。 '5'===5 将返回 false。
【解决方案2】:

JavaScript 有两种比较——严格的和抽象的。 == 运算符进行抽象比较,这意味着它可能会将值转换为不同的类型,然后比较结果值。 === 运算符进行严格比较,这意味着它永远不会转换类型。我们确定两个值是否严格相等的方式取决于值的类型,而不仅仅是它们在内存中的位置。我查看了这个以确保我得到了所有的案例,所以这里是来自 Mozilla 的 Comparison Operators 文章的列表。

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

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

JavaScript 中没有“ID”的概念,无论是用于基元还是对象。这些相等规则会产生您所看到的行为。

【讨论】:

  • 我认为你是不正确的伙伴。 == 根据eloquentjavascript.net/chapter4.html,检查身份,而不是相等性,""JavaScript 的 == 运算符在比较对象时,只有在给它的两个值是完全相同的值时才会返回 true。比较具有相同内容的不同对象将给出错误“”
  • +1 简洁且写得很好。这是一个参考 - 严格的es5.github.io/#x11.9.6 和抽象的es5.github.io/#x11.9.3
  • @chopperdrawlion4 == 仅检查对象中的身份,除了 JavaScript(在 ES5 中)中的 null、未定义、数字、字符串和布尔值之外的任何内容。这就是这个答案所说的,我引用“仅当操作数引用相同的对象时,比较对象的表达式才为真。”。这个答案所说的和 Eloquent JavaScript 在第 4 章所说的基本相同。如果您不确定任何事情,您可以随时查看我在上一条评论中引用的语言规范。
猜你喜欢
  • 2020-03-12
  • 2020-09-06
  • 1970-01-01
  • 2015-11-09
  • 2014-10-01
  • 1970-01-01
  • 2015-01-17
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多