Первое, с чем нужно быть осторожным в JavaScript, это разница между == и ===. Поскольку JavaScript пытается быть устойчивым к ошибкам программирования, == пытается сделать приведение типов между двумя переменными, т.е. конвертирует строку в число так, чтобы вы могли произвести сравнение с числом как показано ниже:
console.log(5 == "5"); // true , TS Error
console.log(5 === "5"); // false , TS ErrorТем не менее, выбор, который делает JavaScript не всегда идеален. В примере ниже первое выражение ложно потому что "" и "0" являются строками и очевидно не равны. Но во втором примере 0 и пустая строка ("") ложные (то есть ведут себя как false) и следовательно равны в соответствии с ==. Оба выражения ложны если вы используете ===.
console.log("" == "0"); // false
console.log(0 == ""); // true
console.log("" === "0"); // false
console.log(0 === ""); // falseОбратите внимание, что
string == numberиstring === numberявляются ошибками компиляции в TypeScript, по-этому, как правило, вам не нужно об этом беспокоиться.
По аналогии с == и ===, существует != против !==.
Поэтому совет профессионала: всегда используйте === и !==, кроме проверки на null, о которой мы расскажем позже.
Если вы хотите сравнить два объекта на структурное равенство, то использовать ==/=== недостаточно, то есть:
console.log({a:123} == {a:123}); // False
console.log({a:123} === {a:123}); // FalseЧтобы делать такие проверки, используйте пакет deep-equal:
import * as deepEqual from "deep-equal";
console.log(deepEqual({a:123},{a:123})); // TrueТем не менее, довольно часто вам не нужна глубокая проверка, а всё что вам на самом деле нужно, это проверка по какому-нибудь id:
type IdDisplay = {
id: string,
display: string
}
const list: IdDisplay[] = [
{
id: 'foo',
display: 'Foo Select'
},
{
id: 'bar',
display: 'Bar Select'
},
]
const fooIndex = list.map(i => i.id).indexOf('foo');
console.log(fooIndex); // 0