===
требует, чтобы типы были одинаковыми.Экземпляры вашего типа AdvancedString
не имеют того же типа, что и строки примитива или объекта, и поэтому ===
всегда будет ложным.new String("") === ""
также ложно по той же причине;первый является объектом String, последний является примитивной строкой.
Ваш AdvancedString
является ==
примитивной строкой, но только (кажется), если вы используете class
изначально;когда я пытаюсь это сделать на игровой площадке TypeScript с TypeScript, передающим синтаксис class
, происходит сбой.Но это работает изначально:
class AdvancedString extends String {
isJSON() {
var itIs = true;
try {
JSON.parse(this.toString());
} catch (err) {
itIs = false;
}
return itIs;
}
}
const s = new AdvancedString("foo");
console.log(s === "foo"); // false
console.log(s == "foo"); // true
Однако , вы можете рассмотреть недостатки использования AdvancedString
, поскольку ваши строки будут объектами, а не примитивами:
- Влияние на память.Выделение этих строковых объектов оказывает большее влияние на память, чем использование примитивных строк. ¹
- Любой код, получающий одну из ваших строк (например, библиотеку, которую вы можете использовать), которая выполняет проверку
typeof
, не увидит ихкак (примитивные) строки.Так, например, API, принимающий строку или объект параметров, вероятно, будет введен в заблуждение, если вы передадите ему экземпляр AdvancedString
.TypeScript, возможно, не сможет предупредить вас, когда это произойдет, в зависимости от того, как аннотируется библиотека (например, string|object
не будет ее ловить).
¹ Из любопытстваЯ сделал это:
const s = "**y";
const a = Array.from({length: 100000}, () => new String("x" * s));
... на пустой странице.Я получил 100 005 String
экземпляров в памяти (я думаю, их было где-то еще 5), занимающих 3200 160 байт.Напротив, это:
const s = "**y";
const a = Array.from({length: 100000}, () => "x" + s);
... только увеличило количество примитивных строк с 3 830 (281 384 байт) до 27 533 (1 040 120 байт);очевидно, некоторые (но не все) из них были повторно использованы.
Так что это ~ 741 КБ для примитивов против ~ 3 МБ для объектов, чуть более чем в четыре раза больше памяти.
Это всего лишь один синтетический тест, но вы поняли.