Как проверить поддержку оператора трех знаков равенства и обещаний в JS?

Я пишу скрипты, которые хочу разбить на несколько модулей. «Базовые» модули будут поддерживать старые браузеры, которые не поддерживают новый синтаксис, такой как === и обещания.

«Расширенные» модули будут загружены, если браузер пройдет проверку функций.

Мой вопрос: как мне проверить, поддерживает ли браузер синтаксис оператора === и обещания .then(function(){}), не используя их сначала и вызывая синтаксическую ошибку в старых браузерах?

if (/*what goes here*/) {
    var script = document.createElement('script');
    script.src = '/advanced.js';
    script.async = false;
    document.head.appendChild(script);
}

person i-g    schedule 19.01.2020    source источник
comment
Какой браузер не поддерживает ===???   -  person Charlie Fish    schedule 19.01.2020
comment
=== в JS с самого начала, а промисы требуют только полифилла — у них нет специального синтаксиса   -  person Bergi    schedule 19.01.2020
comment
@Bergi На самом деле это было добавлено в 3-е издание ECMAscript в декабре 1999 г. См. раздел 11.9.4. Тем не менее, я согласен с вашим советом практически. источник   -  person Lonnie Best    schedule 19.01.2020
comment
@LonnieBest Честно говоря, я сомневаюсь, действительно ли OP нацелен на браузеры, выпущенные до декабря 1999 года. Переход от === к обещаниям - довольно большой скачок. Это одна из причин, по которой этот вопрос был очень плохо написан. Скорее всего, если вы беспокоитесь о поддержке ===, у вас гораздо больше проблем и вещей, о которых вам следует подумать, прежде чем поддерживать Promise. Так что, хотя это забавная мелочь, я не уверен, насколько это актуально для вопроса. Кроме того, простое задание (=) было добавлено только в 3-м издании. Таким образом, код, изначально написанный OP, даже не будет работать там.   -  person Charlie Fish    schedule 20.01.2020
comment
@CharlieFish Вопрос не плохо написан для моего уровня понимания. ОП спрашивает, как обнаружить поддержку двух вещей в браузерах: оператора === и обещаний. Дата появления оператора '===' в спецификации является подходящим фактом, на основании которого можно оценить, оправдано ли это беспокойство. Этот факт также исправляет небольшое преувеличение, сделанное в предыдущем комментарии (что делает его еще более уместным в контексте). Наконец, = и === НЕ имеют одну и ту же дату начала в спецификации, как утверждает последняя часть вашего комментария.   -  person Lonnie Best    schedule 20.01.2020
comment
@LonnieBest На мой взгляд, если ОП действительно задумал это так, как написано, это должно быть два отдельных вопроса. === и обещания не имеют ничего общего друг с другом в контексте вопроса ОП. Скорее всего, если вас беспокоит поддержка промисов И === у вас много другого несовместимого кода. Вы правы, хотя согласно (ecma-international.org/publications/files/ECMA-ST-ARCH/), в нем указано =. Я привык к тому, что в этих документах обсуждаются только наборы изменений, а не вся спецификация. Виноват.   -  person Charlie Fish    schedule 20.01.2020
comment
@LonnieBest Также важно иметь в виду, что любая реализация, изначально поддерживающая обещания, будет поддерживать === НАМНОГО. Так что сравнивать две вещи, которые разделены почти 2 десятилетиями, мне кажется очень странным по одному вопросу.   -  person Charlie Fish    schedule 20.01.2020
comment
Мне все еще очень любопытно, каков здесь вариант использования OP и на какие браузеры они должны ориентироваться.   -  person Charlie Fish    schedule 20.01.2020
comment
Для тех, кто задается вопросом, почему я ориентируюсь на браузеры до 1999 года, это для упражнения в ультрасовместимости. Отчасти для того, чтобы показать, что прогрессивное улучшение возможно, а отчасти для интересов ретро-вычислений. Так что да, это означает классику, такую ​​как Netcape 3 и IE4, ни одна из которых не поддерживает ===. Для тех, кто говорит, что это было в JS с самого начала, изучите историю своего ремесла, любители.   -  person i-g    schedule 20.01.2020
comment
@CharlieFish Я ценю ваши комментарии о том, что === и обещания далеки друг от друга. Это только два основных препятствия, с которыми я столкнулся в своем тестировании. Если вы можете предложить какие-либо другие вехи, которые я должен проверить, я буду признателен.   -  person i-g    schedule 20.01.2020
comment
@ i-g Имеет смысл. Мне очень любопытно, как вы тестируете его в этих браузерах. У вас просто есть старые устройства, которые вы используете, или? Я также был бы осторожен, называя людей, которые не знали, что он не был в JS с самого начала, «любителями». Это, безусловно, забавный факт, который ежедневно влияет на ОЧЕНЬ немногих разработчиков JS. Мне никогда раньше не приходилось ориентироваться на такие старые браузеры, поэтому я не уверен, какие еще вехи вам стоит протестировать. Как-то над моей головой в этот момент. Но я бы немного удивился, если бы их не было больше. Может и не быть, но похоже, что может быть. Удачи!!   -  person Charlie Fish    schedule 20.01.2020
comment
@CharlieFish Я в основном использую эмуляторы и Wine для запуска старых браузеров. Иногда я сталкиваюсь со старыми устройствами и тестирую их тоже.   -  person i-g    schedule 22.01.2020


Ответы (1)


Если браузер поддерживает обещания, он будет поддерживать then. Один из способов (среди прочих) узнать, поддерживает ли браузер промисы (без выдачи ошибки), — проверить, существует ли window.Promise:

if(window.hasOwnProperty("Promise"))
{
  console.log("Promises are supported.");
}
else
{
  console.log("This browser does NOT support promises.");
}

Что касается ===, я не думаю, что тебе стоит об этом беспокоиться. === был добавлен в ECMAscript в третьем издании в декабре 1999 года, и трудно представить, чтобы кто-нибудь (даже несгибаемый отстающий) использовал браузер сегодня, который не поддерживает его.

ОБНОВЛЕНИЕ:

Если вы действительно настаиваете на обнаружении поддержки ===, мой вывод (из моих комментариев ниже) заключается в том, чтобы добиться этого путем изучения того, какие браузеры не поддерживают ===, и использования Обнаружение браузера для обнаружения этих браузеров. Я надеюсь, что кто-то другой предложит вам более простой способ, о котором я не думаю.

person Lonnie Best    schedule 19.01.2020
comment
Вы можете не думать, что мне придется беспокоиться о ===, но на самом деле мне это нужно, потому что я хочу поддерживать браузеры до 1999 года. Я ценю ваш ответ относительно Обещаний, я думаю, что именно так я и сделаю эту часть. - person i-g; 20.01.2020
comment
@ i-g Мне придется подумать об этом, я не уверен, как вы будете проверять оператор ===, потому что мне кажется, что компилятор точного времени выдаст ошибку из-за простого существования === если браузер не поддерживает. Мои текущие мысли таковы, что вам, вероятно, придется выполнить обнаружение браузера вместо Feature Detection для достижения этой цели. - person Lonnie Best; 20.01.2020
comment
@i-g Еще одна идея, о которой я подумал, заключалась в том, чтобы использовать Try/Catch, но try/catch не использовался в Internet Explorer до версии 5. - person Lonnie Best; 20.01.2020
comment
@i-g Кроме того, я подумал об eval , тем не менее, eval появился в Internet Explorer в версии 3, так что даже если бы вы могли использовать его для тестирования eval("1 === 1"), eval изначально там не было. Это оставляет вас с обнаружением браузера: болезненный процесс идентификации браузеров и выполнения логики «если/то» на основе того, приходит ли ваше исследование к выводу, что === поддерживается в этом браузере или нет. Я бы сказал, к черту это, и просто согласился бы на то, что код не работает в тех браузерах, которые больше никто не использует (нижний итог). - person Lonnie Best; 20.01.2020
comment
Спасибо за ваши предложения, @LonnieBest. В этом упражнении нельзя говорить «черт возьми», поэтому я просто избегаю использования ===. - person i-g; 22.01.2020
comment
@i-g: я даже не думал об этом. Имеет смысл. - person Lonnie Best; 22.01.2020
comment
@i-g Помните, что «===» — это, по сути, «==» плюс дополнительное условное выражение для проверки соответствия типа. Не уверен, когда «typeof» был добавлен в спецификацию. Но может быть что-то, на что стоит обратить внимание в случаях, когда вам нужно «===». - person Charlie Fish; 22.01.2020