Это вопрос производительности при обращении к полю. Если видим решетку, то остаётся проверить в правильном ли скоупе мы сейчас. С private надо каждый раз искать определение свойства и проверять, приватно ли оно.
Плюс, решеткой можно пользоваться и без синтаксиса полей класса. Просто написав в конструкторе this.#privateField = 42, вы уже получаете приватное поле.
Это вопрос производительности при обращении к полю. Если видим решетку, то остаётся проверить в правильном ли скоупе мы сейчас. С private надо каждый раз искать определение свойства и проверять, приватно ли оно.
Плюс, решеткой можно пользоваться и без синтаксиса полей класса. Просто написав в конструкторе this.#privateField = 42, вы уже получаете приватное поле.