Как выдержать сравнение, если два объекта являются действительно тем же объектом?

Одиночная линия на основе функции уменьшения массива

const uniqueCount =  ["a", "b", "c", "d", "d", "e", "a", "b", "c", "f", "g", "h", "h", "h", "e", "a"];
const distribution = uniqueCount.reduce((acum,cur) => Object.assign(acum,{[cur]: (acum[cur] | 0)+1}),{});
console.log(JSON.stringify(distribution,null,2));

16
задан Peter Hosey 23 August 2009 в 21:13
поделиться

4 ответа

Оператор == проверяет, являются ли два выражения одним и тем же указателем на один и тот же объект. Какао называет это отношение «идентичным» (см., Например, NSArray indexOfObjectIdenticalTo: ).

Чтобы проверить, равны ли два объекта, вы должны отправить одному из них isEqual: сообщение (или более конкретное сообщение, такое как isEqualToString: , если оно отвечает на одно), передавая другой объект. Это вернет YES , если у вас действительно есть только один объект (равный себе, очевидно) или если у вас есть два одинаковых объекта. В последнем случае == будет оценивать как НЕТ .

35
ответ дан 30 November 2019 в 16:19
поделиться

[objectA isEqual:objectB] обычно хороший выбор. Обратите внимание, что некоторые классы могут иметь более специализированные функции равенства. (isEqualToString: et.al.) Они обычно проверяют не то, являются ли они одним и тем же объектом, а являются ли они равными, что является отличной концепцией. (Два строковых объекта могут быть равны, даже если они не имеют один и тот же адрес памяти.)

1
ответ дан 30 November 2019 в 16:19
поделиться

Знак == сообщает вам, указывают ли два указателя на один и тот же объект. isEqual сообщает вам, является ли содержимое двух объектов одинаковым (но не обязательно фактически одним и тем же объектом). Немного сбивает с толку.

Попробуйте этот код, чтобы лучше понять:

NSString *aString = [NSString stringWithFormat:@"Hello"];
NSString *bString = aString;
NSString *cString = [NSString stringWithFormat:@"Hello"];

if (aString == bString)
    NSLog(@"CHECK 1");

if (bString == cString)
    NSLog(@"CHECK 2");

if ([aString isEqual:bString])
    NSLog(@"CHECK 3");

if ([bString isEqual:cString])
    NSLog(@"CHECK 4");

// Look at the pointers:
NSLog(@"%p", aString);
NSLog(@"%p", bString);
NSLog(@"%p", cString);
4
ответ дан 30 November 2019 в 16:19
поделиться

Два других ответа правильно отвечают на вопрос в вашем заголовке. Однако правильный ответ на совершенно другой вопрос в вашем основном тексте: да, оператор == подходит для проверки того, относятся ли две переменные к одному и тому же объекту .

]
1
ответ дан 30 November 2019 в 16:19
поделиться