Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/variables/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 如何检查原语的ID?_Javascript - Fatal编程技术网

Javascript 如何检查原语的ID?

Javascript 如何检查原语的ID?,javascript,Javascript,据我了解: -基本类型测试是否相等 'lol' === 'lol' true 是因为内容相同而为True,还是因为内存中的对象ID相同而为True -复合类型身份测试 [1,2,3] === [1,2,3] false False,因为引用变量是diff还是diff,因为内存中的对象ID是diff 我希望能够区分: A) 参考变量 B) 标识符(名称空间) C) 内存中的实际对象 D) ID 是否有允许我单独测试这些东西的命令 'lol'='lol'提供true,因为它是一个字符串文本。它属

据我了解: -基本类型测试是否相等

'lol' === 'lol'
true
是因为内容相同而为True,还是因为内存中的对象ID相同而为True

-复合类型身份测试

[1,2,3] === [1,2,3]
false
False,因为引用变量是diff还是diff,因为内存中的对象ID是diff

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


是否有允许我单独测试这些东西的命令

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

JavaScript有两种比较——严格比较和抽象比较。
=
运算符执行抽象比较,这意味着它可能会将值转换为其他类型,然后比较结果值。
=
操作符执行严格的比较,这意味着它永远不会转换类型。我们判断两个值是否严格相等的方式取决于值的类型,而不仅仅是它们在内存中的位置。我查了一下,以确保所有案例都正确无误,下面是Mozilla文章中的列表

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


JavaScript中没有“ID”的概念,无论是原语还是对象。这些相等规则产生了您看到的行为。

所以您似乎在说“==”测试内存位置,而不是值相等。对所有数据类型都是这样吗?==检查相等性,而===检查相等性和标识性。是的,它对所有人都有效,那么为什么:a=[1];b=[1];a==b false a==b false我希望第一个测试为真,第二个测试为假。这是因为它是复合类型吗?==不处理对象。在处理对象时,'=='和'=='具有相同的含义。'='仅处理基元。'='如果值相同,将执行类型转换。所以“5”==5将返回true。而“==”将不会键入并转换它5'==5将返回false。也许你会发现这很有趣:我认为你是错误的伴侣在比较对象时,检查标识(而不是根据“,”JavaScript的==运算符的相等性)只会在给定给它的两个值完全相同的情况下返回true。将不同的对象与相同的内容进行比较,会得到“false”+1,简洁且写得好。这里有一个参考-strict and abstract@chopperdrawlion4
=
只检查对象中的标识,这些对象在JavaScript(ES5)中除了null、未定义、number、string和boolean之外都是空的。这就是这个答案所说的,我引用“只有当操作数引用同一个对象时,比较对象的表达式才是真的。”。这个答案所说的和第4章中雄辩的JavaScript所说的基本相同。如果您对任何事情都不确定,您可以随时查看我在上一篇评论中引用的语言规范。