当我检查这两个是否相等时,他们显然不是。有人可以解释原因吗?
var string = "Hello";
var array = ['H', 'e', 'l', 'l', 'o'];
为什么(string === array)
是假的?
答案 0 :(得分:10)
为什么
(string === array)
是假的?
您正在使用strict comparison (===
),它还会检查值的数据类型。显然,原始字符串值与对象的数据类型不同,对象只是真正等于它们自己。证明:
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
。
从一个角度来看,数组和字符串类似,因为它们都是类似数组的对象。
array-like 是什么意思?这意味着该对象具有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
*:实际上,原始字符串和String对象之间甚至存在差异,但我不想在这里过深。技术上原始的字符串没有任何方法,因为它们不是对象,但在大多数情况下,您可以将原始字符串视为对象。
答案 1 :(得分:2)
你对c / c ++感到困惑。在java-script数组中是另一个对象,而字符串变量是另一个。请尝试阅读this
答案 2 :(得分:2)
在JavaScript中===
是严格相等,它将两个值进行比较以获得相等性。在比较之前,这两个值都不会隐式转换为其他值。这就是为什么你必须使用不同的对象(String和Array),这就是你的比较返回false
的原因。
答案 3 :(得分:1)
在Javascript中,String和Array数据类型不相等。
答案 4 :(得分:0)
尽管大多数答案都是正确的,但我想在此之上添加一些内容。 我不想重复,为什么比较是错误的,因为其他人已经解释过了。
这是内容相同的字符串和数组的另一个区别。
const str = 'Hello';
const arr = ['H','e','l','l','o'];
当我们使用引用数据类型声明 vairbale 常量时,我们可以操作内容。
arr = anotherArray;
会给我们错误但我们仍然可以做到
arr[0] = 'S';
数组现在看起来像 ['S','e','l','l','o'];
在字符串的情况下,尽管您可以通过数组表示法访问元素,但如果您尝试 更改其内容它将静默失败,即不会抛出任何错误但也不会更改内容。