Я бы сделал следующее:
var arr = [1,2,3,4],
brr = [2,4],
res = arr.filter(f => !brr.includes(f));
console.log(res);
Две из больших проблем с прямым доступом к переменной в классе (поле/атрибут):
1) Вы не можете легко связать с данными против полей.
2) При представлении общедоступных полей от классов, Вы не можете позже изменить их на свойства (например: добавить логику проверки к методам set)
Это главным образом сводится к нему становившийся общей конвенцией кодирования. Это помогает затем добавить пользовательский код обработки, если Вы требуете. Но Вы корректны, нет технически никакой реальной потребности в этом. Хотя, если Вы действительно добавляете пользовательскую обработку позже, это поможет Вам не повредить интерфейс.
Поскольку, в будущем при изменении реализации код с помощью текущего интерфейса не повредится.
Например, Вы реализуете простой класс с общедоступным полем и начинаете использовать свой класс в некоторых внешних модулях. Месяц спустя Вы обнаруживаете, что необходимо реализовать ленивую загрузку в том классе. Необходимо было бы затем преобразовать поле к свойству. От внешней точки модуля ciew это могло бы выглядеть одинаково syntaxicaly, но это не. Свойство является рядом функций, в то время как поле является смещением в экземпляре класса.
При помощи свойства Вы эффективно снижаете риск, который изменит интерфейс.
Этот стиль нотации более полезен при смешивании доступности для метода get и метода set. Например, можно записать:
public int Foo { get; private set; }
Вы могли также поместить внутренний метод set или даже сделать метода get частным и общественность метода set.
Эта нотация избегает потребности явно записать частную переменную только для решения классической проблемы внутренне перезаписываемого/внешне читаемого значения.
Ключ - то, что компилятор переводит свойство 'под капотом' в функциональную пару, и когда у Вас есть код, который похож, это использует свойство, это на самом деле вызывает функции при компиляции вниз в IL.
Так же скажем, Вы создаете это как поле и имеете код в отдельном блоке, который использует это поле. Если позже реализация изменяется, и Вы решаете сделать ее свойством для сокрытия изменений от остальной части кода, все еще необходимо перекомпилировать и повторно развернуть другой блок. Если это будет свойство с самого начала затем, то вещи будут просто работать.
Когда Вы получаете ошибку, и необходимо узнать, какие методы изменяют поля и когда, Вы будете заботиться намного больше. Вставление средств доступа свойства легкого веса впереди сохраняет феноменальную сумму страдания, должен ошибка возникать, включая поле, которое Вы обернули. Я был в той ситуации пару раз, и не приятно, особенно когда это оказывается связанной повторной входимостью.
Выполнение этой работы заранее и липкий точка останова на средстве доступа намного легче, чем альтернативы.
Я думаю, что корреспондент просит, почему бы не следующее...
public string FirstName { }
Почему беспокойство со средствами доступа, когда Вы могли сократить его к вышеупомянутому. Я думаю, что ответ - то, что путем требования средств доступа делает это очевидным для человека, читающего код, что это - стандарт, получают/устанавливают. Без них Вы видите выше его, твердо определить, это автоматически реализуется.
Для 99% случаев, представляя общедоступное поле прекрасен.
общий совет состоит в том, чтобы использовать поля: "Если Вы представляете общедоступные поля от своих классов, Вы не можете позже изменить их на свойства". Я знаю, что все мы хотим, чтобы наш код соответствовал требованиям завтрашнего дня, но существуют некоторые проблемы с этими взглядами:
потребители Вашего класса могут, вероятно, перекомпилировать, когда Вы изменяете свой интерфейс.
99% Ваших элементов данных никогда не должны будут становиться нетривиальными свойствами. Это спекулятивная общность . Вы пишете много кода, который будет проребенок никогда не быть полезным.
, Если Вам нужна двоичная совместимость через версии, делая элементы данных в к свойствам, вероятно, не достаточно. По крайней мере необходимо только представить интерфейсы и скрыть всех конструкторов и представить фабрики (см. код ниже).
public class MyClass : IMyClass
{
public static IMyClass New(...)
{
return new MyClass(...);
}
}
Это - тяжелая проблема, пытаясь сделать код, который будет работать в неопределенном будущем. Действительно трудно.
у кого-либо есть пример времени, когда использование тривиальных свойств убралось подобру-поздорову?
Это сохраняет инкапсуляцию объекта и уменьшает код, чтобы быть более простым читать.