【发布时间】:2014-02-16 07:55:58
【问题描述】:
当我检查这两个是否相等时,它们显然不是。谁能解释一下原因?
var string = "Hello";
var array = ['H', 'e', 'l', 'l', 'o'];
为什么(string === array) 是假的?
编辑:这个网站太棒了。这么快的帮助。谢谢大家。
【问题讨论】:
标签: javascript variables
当我检查这两个是否相等时,它们显然不是。谁能解释一下原因?
var string = "Hello";
var array = ['H', 'e', 'l', 'l', 'o'];
为什么(string === array) 是假的?
编辑:这个网站太棒了。这么快的帮助。谢谢大家。
【问题讨论】:
标签: javascript variables
为什么
(string === array)是假的?
您正在使用strict comparison (===),它还会检查值的数据类型。显然 primitive string 值与 object 的数据类型不同,并且对象仅与它们自己真正相等。证明:
var foo = [1,2,3];
var bar = [1,2,3];
console.log(foo === bar); // false
console.log(foo === foo); // true
现在,如果您使用loose comparison (==),以下比较确实会返回true:
console.log([1,2,3] == '1,2,3'); // true
为什么?因为数组先转换为字符串,而这恰好导致相同的字符串值。但这并不意味着这些值是相同的(一个仍然是数组,另一个是字符串)。这就是为什么您应该始终使用严格比较的原因。
Javascript 中字符串和字符数组有什么区别?
字符串不是数组,因为它们继承自different prototypes (*),因此具有不同的实例方法。例如,数组有一个method join,字符串有一个method match。
从一个角度来看,数组和字符串是相似的,因为它们都是类数组对象。
类数组是什么意思?这意味着该对象具有length 属性和数字属性。字符串有一个length 属性,它为您提供字符串中的字符数,您可以使用str[i] 访问字符串的单个字符。示例:
var arr = ['a','b','c'];
var str = "abc";
console.log(arr.length); // 3
console.log(str.length); // 3
console.log(arr[0]); // a
console.log(str[0]); // a
console.log(arr === str); // false
console.log(typeof str); // string
console.log(typeof arr); // object
*:实际上,原始字符串和字符串对象之间甚至是有区别的,但我不想在这里说得太深。从技术上讲,原始字符串没有任何方法,因为它们不是对象,但在大多数情况下,您可以将原始字符串视为对象。
【讨论】:
您对 c/c++ 感到困惑。在 java-script 中,数组是另一个对象,而字符串变量是另一个对象。试试看this
【讨论】:
在 JavaScript 中,=== 是 严格相等,它比较两个值是否相等。在比较之前,这两个值都不会隐式转换为其他值。所以这就是为什么你必须使用不同的对象(字符串和数组),它们不能相等,这就是你的比较返回 false 的原因。
更多信息请访问Strict equality using ===
【讨论】:
在 Javascript 中,String 和 Array 数据类型不相等。
【讨论】:
虽然大多数答案都是正确的,但我想在此基础上添加一些内容。 我不想重复,为什么像其他人解释的那样比较是错误的。
这是具有相同内容的字符串和数组的另一个区别。
const str = 'Hello';
const arr = ['H','e','l','l','o'];
当我们使用引用数据类型声明 vairbale 常量时,我们可以操作内容。
arr = anotherArray;
会给我们错误,但我们仍然可以做
arr[0] = 'S';
数组现在看起来像 ['S','e','l','l','o'];
在字符串的情况下,虽然您可以通过数组表示法访问元素,但如果您尝试 改变它的内容,它会静默失败,即不会抛出任何错误,但也不会改变内容。
【讨论】: