2014-02-16 2 views
6

Когда я проверил, были ли эти два равны, они, очевидно, не были. Может кто-нибудь объяснить, почему?В чем разница между строкой и массивом символов в Javascript?

var string = "Hello"; 
var array = ['H', 'e', 'l', 'l', 'o']; 

Почему (string === array) не соответствует действительности?

EDIT: Этот сайт является фантастическим. Такая быстрая помощь. Спасибо, парни.

ответ

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?

Строка не являются массивов, потому что они наследуют от differentprototypes (*) и, следовательно, имеет различные методы экземпляра. Например, массивы имеют 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 

*: На самом деле, там даже есть разница между примитивными строками и объектами строк, но я не хочу слишком глубоко здесь. Технически примитивные строки не имеют никаких методов, потому что они не являются объектами, но в большинстве случаев вы можете рассматривать примитивные строки, как они были объектами.

2

Вы путаетесь с c/C++. В массиве java-script другой объект и строковая переменная - еще один. Попробуйте читать this

2

В JavaScript === есть строгое равенство, которое сравнивает два значения для равенства. Перед сопоставлением ни одно значение не преобразуется в какое-либо другое значение. Поэтому у вас есть разные объекты (String и Array), которые не могут быть равными, и поэтому ваше сравнение возвращает false.

Более подробно о том, что вы можете найти на Strict equality using ===

Смежные вопросы