Есть ли null
в ES6 оператор безопасного доступа к свойствам (нулевое распространение / существование) (например, ?.
в CoffeeScript, например, в CoffeeScript) ? Или это запланировано на ES7?
var aThing = getSomething()
...
aThing = possiblyNull?.thing
Это будет примерно так:
if (possiblyNull != null) aThing = possiblyNull.thing
В идеале решение не должно назначать (даже undefined
) aThing
если possiblyNull
естьnull
if( obj?.nested?.property?.value )
вместоif( obj && obj.nested && obj.nested.property && obj.nested.property.value )
var appConfig = loadConfig(config, process.env); connect(appConfig.database);
сconnect(config)
. Вы можете передать гораздо более простой объект ,connect
а не передавая весьconfig
объект, вы можете использоватьconf.username
,conf.password
вместо того чтобы попытаться что - то подобноеconfig[process.env]?.database?.username
,config[process.env]?.database?.password
. Ссылка: Закон Деметры .loadConfig
приведенном выше примере), вы можете сделать предположения о существовании свойств и пропустить проверку нуля в бесчисленных областях вашего приложения.Ответы:
Обновление (2020-01-31): Кажется, что люди все еще находят это, вот текущая история:
Обновление (2017-08-01): Если вы хотите использовать официальный плагин, вы можете попробовать альфа-сборку Babel 7 с новым преобразованием. Ваш пробег может отличаться
https://www.npmjs.com/package/babel-plugin-transform-optional-chaining
Оригинал :
Достигается функция, которая в настоящее время находится на этапе 1: необязательная цепочка.
https://github.com/tc39/proposal-optional-chaining
Если вы хотите использовать его сегодня, есть плагин Babel, который выполняет это.
https://github.com/davidyaha/ecmascript-optionals-proposal
источник
street = user.address?.street
установил быstreet
в любом случае?Street
Я думаю будет назначенundefined
. Но, по крайней мере, это не приведет к попытке получить доступ к свойствам в undefined.=
, похоже, что это не поддерживается в официальной спецификации в настоящее время. github.com/tc39/proposal-optional-chaining#not-supportedЭто не так хорошо, как? оператор, но для достижения аналогичного результата вы могли бы сделать:
Так как
null
иundefined
оба являются ложными значениями ( см. Эту ссылку ), свойство после&&
оператора доступно только в том случае, если прецедент не является нулевым или неопределенным.В качестве альтернативы, вы можете написать такую функцию:
Использование:
Или с запасным значением:
источник
!(user && user.address && user.address.postcode)
:)foo && foo.bar && foo.bar.quux ...
в большой кодовой базе это уродливо и добавляет много сложности, которую вам лучше избегать._get<T>(func: () => T, fallbackValue?: T) :T
user.address.postcode
не определено,_try(() => user.address.postcode, "")
вернетсяundefined
вместо""
. Так что код_try(() => user.address.postcode, "").length
вызовет исключение.Нет. Вы можете использовать lodash # get или что-то подобное для этого в JavaScript.
источник
lodash.get
немного отличается тем, что не может выполнять условное присваивание.Альтернатива ванили для безопасного доступа к собственности
Наиболее кратким условным заданием, вероятно, будет
источник
possiblyNull
не определено /null
?||=
(((a.b || {}).c || {}).d || {}).e
. Но точнее было бы((((a || {}).b || {}).c || {}).d || {}).e
Нет, в ES6 нет нулевого оператора распространения. Вам придется пойти с одним из известных шаблонов .
Вы можете использовать деструктуризацию, хотя:Есть много обсуждений (например, это ), чтобы добавить такого оператора в ES7, но ни один из них действительно не взлетел.
источник
aThing = possiblyNull.thing
null
. Вам нужно будет указать значение по умолчанию, очень похожее на этот шаблон, но с более запутанным синтаксисом.Судя по списку здесь , в настоящее время нет предложений по добавлению безопасного обхода в Ecmascript. Так что не только нет хорошего способа сделать это, но он не будет добавлен в обозримом будущем.
источник
источник
Опциональное сцепление
?.
и нулевое слияние??
Теперь вы можете напрямую использовать
?.
inline для безопасного тестирования на существование. Все современные браузеры поддерживают это.??
может использоваться для установки значения по умолчанию, если оно не определено или равно нулю.Если свойство существует,
?.
переходит к следующей проверке или возвращает действительное значение. Любой сбой сразу же закоротит и вернетundefined
.Чтобы обеспечить значение по умолчанию, вы можете использовать
??
. Если вам требуется первое истинное значение, вы можете использовать||
.Если вы не проверяете регистр, свойство левой стороны должно существовать. Если нет, он выдаст исключение.
?.
Поддержка браузеров - 78%, июль 2020 г.??
Поддержка браузера - 78%Документация Mozilla
-
Логическое нулевое назначение, решение 2020+
Новые операторы в настоящее время добавляются в браузеры
??=
,||=
и&&=
. Они не делают то, что вы ищете, но могут привести к одному и тому же результату в зависимости от цели вашего кода.??=
проверяет, является ли левая сторона неопределенной или нулевой, короткое замыкание, если уже определено. Если нет, то левой стороне присваивается значение правой стороны.||=
и&&=
похожи, но на основе||
и&&
операторов.Основные примеры
Примеры объектов / массивов
Поддержка браузеров июль 2020 г. - .03%
Документация Mozilla
источник
?.
и??
, и подробное предстоящее решение, которое может работать в вашей ситуации. Лучшее текущее решение, вероятно, просто сделатьaThing = possiblyNull?.thing ?? aThing
Безопасный метод глубокого получения выглядит как естественная подгонка для underscore.js, но здесь проблема состоит в том, чтобы избегать строкового программирования. Измените ответ @ Felipe, чтобы избежать программирования строк (или, по крайней мере, отодвинуть крайние случаи назад к вызывающей стороне):
Пример:
источник
_.get(obj, array_or_dotstring)
obj.a.b.c
противobj['a']['b']['c']
keys
идет?Я знаю, что это вопрос JavaScript, но я думаю, что Ruby справляется с этим всеми запрошенными способами, поэтому я думаю, что это актуальная точка отсчета.
.&
,try
и && имеют свои сильные стороны и потенциальные подводные камни. Здесь вы найдете множество вариантов: http://mitrev.net/ruby/2015/11/13/the-operator-in-ruby/TLDR; Вывод Рубисты что
dig
и легче на глазах и более сильной гарантией того, что значение илиnull
будет назначен.Вот простая реализация в TypeScript:
Это может быть использовано для любой глубины вложенности и функций функций.
try
Подход одинаково приятно читать в JS, как показано в предыдущих ответах. Это также не требует зацикливания, что является одним из недостатков этой реализации.источник
Я думал, что этот вопрос нуждается в небольшом обновлении для 2018. Это может быть сделано красиво без использования каких-либо библиотек
Object.defineProperty()
и может быть использовано следующим образом:Я считаю это безопасным (и JS-этическим) из-за
writeable
иenumerable
определения, теперь доступные дляdefineProperty
методаObject
, как описано в MDNопределение функции ниже:
Я собрал jsBin с выводом на консоль, чтобы продемонстрировать это. Обратите внимание, что в версии jsBin я также добавил пользовательское исключение для пустых значений. Это необязательно, и поэтому я оставил это из минимального определения выше.
Улучшения приветствуются
источник