Введение в ecmascript 6 (es-2015)

JS Уроки

JS HOMEJS IntroductionJS Where ToJS OutputJS StatementsJS SyntaxJS CommentsJS VariablesJS OperatorsJS ArithmeticJS AssignmentJS Data TypesJS FunctionsJS ObjectsJS ScopeJS EventsJS StringsJS String MethodsJS NumbersJS Number MethodsJS ArraysJS Array MethodsJS Array SortJS Array IterationJS DatesJS Date FormatsJS Date Get MethodsJS Date Set MethodsJS MathJS RandomJS BooleansJS ComparisonsJS ConditionsJS SwitchJS Loop ForJS Loop WhileJS BreakJS Type ConversionJS BitwiseJS RegExpJS ErrorsJS DebuggingJS HoistingJS Strict ModeJS this KeywordJS Style GuideJS Best PracticesJS MistakesJS PerformanceJS Reserved WordsJS VersionsJS Version ES5JS Version ES6JS JSON

Map

Пример:

Отличие Map от Object:

Ключами Объекта выступают Строки и Символы, в то время как любое значение может быть ключом Map, включая функции, объекты и примитивы. В отличие от Объектов, ключи в Map упорядочены

Таким образом, во время итерации Map, ключи возвращаются в порядке вставки. Вы легко можете получить количество элементов в Map с помощью свойства size, в то время как количество элементов Объекта может быть определено только вручную. Map — итерируемый объект и может быть итерирован напрямую, в то время как Объект требует ручного получения списка ключей и их итерации. Объект имеет прототип и поэтому имеет стандартный набор ключей, который, при неосторожности, может пересекаться с вашими ключами. С момента выхода ES5 это может быть изменено с помощью map = Object.create(null). Map может иметь более высокую производительность в случаях частого добавления или удаления ключей.

Свойства и методы:


  • Map.prototype.size — Возвращает число пар ключ\значение на Map
  • Map.prototype.set(key, value) — Добавляет переданную пару ключ\значение в Map. Если указанный ключ уже существует то он перезапишется новым значением.
  • Map.prototype.get(key) — Возвращает значение переданного ключа. Если ключа нет, то вернётся undefined
  • Map.prototype.has(key) — Возвращает true если переданный ключ существует и false если его нет
  • Map.prototype.delete(key) — Удаляет указанную пару ключ\значение и возвращает true. Возвращает false если ключ не существует
  • Map.prototype.clear() — Удаляет все пары ключ\значение из Map
  • Map.prototype.keys() — Возвращает итератор ключей на Map для каждого элемента
  • Map.prototype.values() — Возвращает итератор значений на Map для каждого элемента
  • Map.prototype.entries() — Возвращает итератор массива на Map для каждого элемента

Manipulating objects in ES6 vs ES5

Objects get a major overhaul in ES6. Things like object destructuring and rest/spread operators made it working with objects very easy now. Let’s jump to the code and try to merge two objects in ES5.

var obj1 = { a: 1, b: 2 }var obj2 = { a: 2, c: 3, d: 4}var obj3 = Object.assign(obj1, obj2)

We have to merge the object using which takes both objects as input and outputs the merged object. Let’s take a look how we can tackle this problem in ES6.

const obj1 = { a: 1, b: 2 }const obj2 = { a: 2, c: 3, d: 4}const obj3 = {...obj1, ...obj2}

Simple isn’t it ? The spread operator makes merging objects a breeze for the developer.

Let’s take a look at object destructuring now. If you have to extract multiple values from ES5 you have to write 3–4 lines of code like this:

var obj1 = { a: 1, b: 2, c: 3, d: 4 }var a = obj1.avar b = obj1.bvar c = obj1.cvar d = obj1.d

Time consuming . Oh wait! we have ES6 here to rescue us.

const obj1 = { a: 1, b: 2, c: 3, d: 4 }const {  a,  b,  c,  d} = obj1

Cool! Last but not least look at another new feature for introduced for objects.

We define a object like this in ES5

var a = 1var b = 2var c = 3var d = 4var obj1 = { a: a, b: b, c: c, d: d }

In ES6 you will do something like this:

var a = 1var b = 2var c = 3var d = 4var obj1 = { a, b, c, d }

Yeah, if the name of the key and the variable we are going to assign to that key are same you can use this shorthand.

Стрелочные функции

Стрелочные функции – отличное дополнение к языку JavaScript. Они создают короткий и лаконичный код. В этой статье мы рассказываем о стрелочных функциях пораньше, чтобы позже воспользоваться ими в других примерах. Следующий фрагмент кода показывает стрелочную функцию в сравнении аналогичной функцией, написанной в знакомом стиле ES5:

Если мы посмотрим на синтаксис стрелочных функций, то не увидим ключевого слова . Остается только ноль или более аргументов, «жирная стрелка» () и выражение функции. Возвращаемое выражение добавляется неявно.

При нуле или более одном аргументе, вы должны добавить круглые скобки:

Заключите выражение функции в блок , если вам необходима более сложная логика или больше пробельных символов (например, символ новой строки):

Стрелочные функции означают не только меньшее количество напечатанных символов, но их поведение отличается от обычных функций. Выражение стрелочной функции наследует и аргументы из окружающего контекста. Это означает, что вы можете избавиться от уродливых выражений, подобных , и вам не нужно связывать функции с правильным контекстом

Пример кода (обратите внимание на в сравнении с в версии ES5):

֍ Stage 3

Предложения вышедшие из статуса черновика, но ещё не вошедшие в финальную версию стандарта. 

Приватные\статические\публичные методы\свойства\атрибуты у классов

https://github.com/tc39/proposal-class-fieldshttps://github.com/tc39/proposal-private-methodshttps://github.com/tc39/proposal-static-class-features

В некоторых языках есть договорённость, называть приватные методы через видимый пробел ( «_» — такая_штука, ты можешь знать этот знак под неверным названием — нижнее подчёркивание).

Например так:

Напомню — это только договорённость. Ничто не мешает использовать префикс для других целей, использовать другой префикс, или не использовать вовсе.

Лично мне импонирует идея использовать видмый пробел в качестве префикса для функций, возвращающих . Так их можно объединять в цепочку вызовов.

Разработчики спецификации EcmaScript пошли дальше и сделали префикс-октоторп ( «#» —решётка, хеш ) частью синтаксиса.

Предыдущий пример на ES10 можно переписать следующим образом:

Пример излишне усложнён для демонстрации приватных свойств, методов и атрибутов разом. Но в целом JS — радует глаз своей лаконичностью по сравнению с PHP вариантом. Никаких тебе private function _…, ни точек с запятой в конце строки, и точка вместо «->» для перехода вглубь объекта.

Геттеры именованные. Для динамических имён — прокси-объекты.

Вроде бы мелочи, но после перехода на JS, всё меньше желания возвращаться к PHP.

К слову приватные акцессоры доступны только с Babel 7.3.0 и старше.

На момент написания статьи, самая свежая версия по версии npmjs.com — 7.2.2

Ждём в Stage 4!

Шебанг грамматика

Хешбэнг — знакомый юниксоидам способ указать интерпретатор для исполняемого файла:

в данный момент, на подобный фортель, Chrome выбрасывает    

Большие числа с BigInt

Максимальное целое число, которое можно безопасно использовать в JavaScript (2⁵³ — 1):


BigInt нужен для использования чисел произвольной точности.

Объявляется этот тип несколькими способами:

Это новый примитивный тип:

Его можно сравнивать с обычными числами:

Но математические операции нужно проводить в пределах одного типа:

Поддерживается унарный минус, унарный плюс возвращает ошибку:

— новый способ доступа к глобальному контексту

работает в Chrome

Поскольку реализации глобальной области видимости зависят от конкретного движка, раньше приходилось делать что-то вроде этого:

И даже такой вариант не гарантировал, что всё точно будет работать.

— общий для всех платформ способ доступа к глобальной области видимости:

Динамический

Хотелось переменные в строках импорта‽ С динамическими импортами это стало возможно:

Динамический импорт — асинхронная операция. Возвращает промис, который после загрузки модуля возвращает его в функцию обратного вызова.

Поэтому загружать модули можно — отложенно, когда это необходимо:

Синтаксически, это выглядит как вызов функции , но не наследуется от , а значит вызвать через или — не удастся:

import.meta — мета-информация о загружаемом модуле.

работает в Chrome

В коде загружаемого модуля стало возможно получить информацию по нему. Сейчас это только адрес по которому модуль был загружен:

Фикс метода

В разделе требуется, чтобы текст JSON, обмениваемый за пределами замкнутой экосистемы, кодировался с использованием UTF-8, но JSON.stringify может возвращать строки, содержащие кодовые точки, которые не представлены в UTF-8 (в частности, суррогатные кодовые точки от U+D800 до U+DFFF)

Так строка после обработки JSON.stringify() превращается в :

Такого быть не должно, и новая спецификация это исправляет. Edge и Chrome уже обновились.

Прототипные методы строк и

работает в Chrome

По аналогии с методами и , обрезают пробельные символы в начале и конце строки соответственно:

.matchAll() — новый прототипный метод строк.

работает в Chrome

Работает как метод с включенным флагом , но возвращает итератор:

Аргумент должен быть регулярным выражением, иначе будет выброшено исключение:

Classes

ES6 introduced classes.

A class is a type of function, but instead of using the keyword to initiate it, we use the keyword , and the properties are assigned inside a method.

Use the keyword to create a class, and always add a constructor method.

The constructor method is called each time the class object is initialized.

Example

A simple class definition for a class named «Car»:

class Car {  constructor(brand) {    this.carname = brand;  }}

Now you can create objects using the Car class:

Example

Create an object called «mycar» based on the Car class:

class Car {  constructor(brand) {    this.carname = brand;  }}mycar = new Car(«Ford»);


Learn more about classes in our JavaScript Classes chapter.

Use cases

You can see there are so many different things which are needed to code just to have these features. But the real question is — is it worth the effort?

Only you can answer this question by looking at this compatibility tables. Check the difference between the and . If you want to support the features for all the older browsers (including IE), you should go for the .

You can also choose to use ES6 features and transpile them using the tools like , but if something goes wrong with the code after converting it to ES5(very little chances), it is very difficult to debug. If you want to try this, copy your ES6 code, paste it here and see the results.

Either way, it is good to have some knowledge because if any error occurs, you can solve the problem on your own or maybe contribute to the open-source community. Your thoughts and ideas are always welcomed.

JavaScript/ECMAScript/JScript

JavaScript был разработан для Netscape. Первый браузер для запуска JavaScript был Netscape 2 в 1996. После Netscape фонд Mozilla продолжил разработку JavaScript для браузера Firefox. Номера версий JavaScript запускаются с 1,0 до 1,8.

ECMAScript был разработан ECMA International после того, как Организация приняла JavaScript. Первое издание ECMAScript было выпущено в 1997. Номера версий ECMAScript запускаются от 1 до 7.

JScript был разработан Microsoft как совместимый язык JavaScript для Internet Explorer в 1996. Номера версий JScript выполняются с 1,0 по 9,0.

В этом списке сравниваются номера версий трех различных продуктов:

Год JavaScript ECMA JScript Browser
1996 1.0   Netscape 2
1996   1.0 Internet Explorer 3
1996 1.1   Netscape 3
1997 1.2   Netscape 4
1997   1 3.0 Internet Explorer 4
1998 1.3 1   Netscape 4.06
1999   2 5.0 Internet Explorer 5
1999   2 5.1 Internet Explorer 5.1
2000   3 5.5 Internet Explorer 5.5
2000 1.5 3   Netscape 6
2000 1.5 3   Firefox 1
2001   3 5.6 Internet Explorer 6
2006   3 5.7 Internet Explorer 7
2005 1.6 3   Firefox 1.5
2006 1.7 3   Firefox 2
2008 1.8 3   Firefox 3
2009   3 5.8 Internet Explorer 8
2009 1.8.1 5   Firefox 3.5 (Partial Support)
2009 1.8.2 5   Firefox 3.6 (Partial Support)
2011 1.8.5 5   Firefox 4
2011   5 9.0 Internet Explorer 9 (Partial Support)

Internet Explorer 4 (JScript 3,0) и Netscape 4,06 (JavaScript 1,3) были первыми обозревателями, поддерживающими ECMAScript 1.

Internet Explorer 5 (JScript 5,0) был первым обозревателем, поддерживающим ECMAScript 2.

Internet Explorer 5,5 (JScript 5,5) и Netscape 6 (JavaScript 1,5) были первыми обозревателями, поддерживающими ECMAScript 3.

Internet Explorer 9 (JScript 9,0) и Firefox 3,5 (JavaScript 1.8.1) были первыми браузерами, поддерживающими ECMAScript 5.

❮ Назад Дальше ❯

1: Block-Scoped Constructs Let

Trong phần này chúng ta nhìn thấy từ Block – Scoped đầu tiên đúng không! bây giờ chúng ta sẽ phải biết Block – scoped là gì? + Block Scoped là phạm vi trong một khối, nghĩa là chỉ hoạt động trong phạm vi được khai báo bời cặp {} => Xem hình dưới đây để hiểu rõ hơn nhé

![](https://viblo.asia/uploads/1dc05c80-78ed-42b9-bef4-2c347959153d.png)

Như trong hình thì vị trí 1 là một block, vị trí 2 là một block và vị trí 3 cũng là một block. Nếu để ý kỹ hơn nữa thì bạn thấy vị trí 1 sẽ bao trùm cả vị trí 2 + 3 và vị trí 2 bao trùm cả vị trí 3. Vậy Block Scoped là phạm vi chứa tất cả những đoạn code nằm bên trong cặp thẻ {}.

1 2 3 4 5 6

!(https//viblo.asia/uploads/1dc05c80-78ed-42b9-bef4-2c347959153d.png)

Nhưtronghình thìvịtrí1làmộtblock,vịtrí2làmộtblockvàvịtrí3cũnglàmộtblock.Nếuđểýkỹhơnnữathìbạnthấyvịtrí1sẽbao trùmcảvịtrí2+3vàvịtrí2bao trùmcảvịtrí3.VậyBlockScopedlàphạmvichứatấtcảnhữngđoạncodenằmbêntrongcặpthẻ{}.

   

Và trong phần này chúng ta sẽ biết cách dùng từ khóa let để khai báo biến trong ES6 nhé!

1 2 3 4

Và trong phần này chúng ta sẽ biết cách dùng từ khóa let để khai báo biến trong ES6 nhé!

Bình thường khi khai báo hay định nghĩa 1 biến trong 1 hàm các bạn hay dùng varđúng không, khai báo kiểu này không sai nhưng nó chưa tối ưu, mọi người xem ví dụ sẽ hiểu là nó chưa tối ưu chỗ nào nhé

Kết quả khi chạy đoạn code trên nó sẽ ra như này

Nhiều người bảo nó vẫn đúng chả sao! ừm thì vẫn đúng nhưng là không cần thiết, vì nếu mình chỉ muốn biến tmp tồn tại trong câu lệnh if thôi không cần thiết ở bên ngoài nữa thì khai báo bằng var lại không xử lý được gây tốn bộ nhớ, không tối ưu . Nhưng các bạn đừng lo nhé đến với ES6 thì nó đã tối ưu bằng lỗi đấy khi khai báo biến bằng “let” => cách định nghĩa này thì biến chỉ tồn tại trong phạm vi khối của nó (Block Scope)Cú pháp: let var_name = var_value; Với phạm vi hoạt động hẹp như vậy thì let thường dùng để khai báo các biến mang tính chất tạm thời, nghĩa là nó chỉ sống trong một phạm vi hoạt động của khối đó thôi, không sử dụng qua vị trí khác.

Chúng ta cùng làm lại ví dụ trên mà dùng let nhé

Kết quả của nó sẽ là thế này

mọi người thấy khác biệt rồi chứ! biến tmp sẽ không được định nghĩa khi ở ngoài block – scoped if nữa!

Qua phần này mọi người có thêm một cách định nghĩa một biến nữa rồi đúng không – rất hay phải không, nhưng cũng đừng lạm dụng mà tùy vào từng trường hợp khi mình muốn sử dụng nó nhé

Kết

Rõ ràng việc sử dụng từ khóa let có những ưu điểm và nhược điểm khác nhau, vì vậy không phải thấy nó mới được bổ sung vào là sử dụng đâu nhé . Ví dụ nếu bạn sử dụng một biến cho toàn ứng dụng và biến đó thay đổi liên tục thì bắt buộc phải sử dụng var để khai báo.


Có thể bạn muốn xem:

Транспиляция

Мы можем писать свой код на ES6 сегодня. Как уже упоминалось во введении, поддержка ES6 браузерами пока не очень обширна и сильно варьируется. Очень вероятно, что не всё из ES6 кода, который вы напишете, будет понято браузерами ваших пользователей. Вот почему мы должны конвертировать его в предыдущие версии JavaScript (ES5), которые хорошо запускаются на любом современном браузере. Это преобразование часто называют «транспиляция». Мы должны выполнять его с нашими приложениями, пока браузеры, которые мы хотим поддерживать, не начнут понимать ES6.

Начнем

Транспилировать код не сложно. Вы можете траспилировать код непосредственно из командной строки или можете включить в качестве плагина планировщик задач, например, Grunt или Gulp. Существует множество решений для транспиляции, в том числе и Babel, Traceur и TypeScript. Взгляните, например, на множество способов начать использовать ES6 с Babel (ранее «6to5»). Большинство возможностей ES6 в вашем распоряжении!

Теперь, когда, надеюсь, вы впечатлены ES6, почему бы не начать использовать его? В зависимости от особенностей, которые вы хотите использовать, и браузеров или оболочек, которые вам необходимо поддерживать (например, Node.js), вы, вероятно, хотите включить транспилятор в ваш рабочий процесс. И если вы готовы к этому, то существуют также наблюдатели за файлами, чтобы сделать ваш процесс разработки бесшовным.

Если вы начинаете с нуля, то возможно просто захотите конвертировать ваш код из командной строки (смотрите, например, документацию Babel CLI). Если вы уже используете планировщик задач (например, Grunt или Gulp), то можете добавить плагин (например, gulp-babel или babel-loader для Webpack). Для Grunt существует grunt-babel и много других плагинов, связанных с ES6. Люди, использующие Browserify, могут попробовать babelify.

Многие возможности могут быть преобразованы в ES5-совместимый код без существенных дополнительных усилий. Другие требуют дополнительных временных костылей (которые могут быть предоставлены транспилятором) и/или ухудшают производительность. А некоторые просто невозможны. Чтобы поэкспериментировать с кодом ES6 и посмотреть, как выглядит транспилированный код, вы можете использовать различные интерактивные инструменты (также известные как REPL):

  • Traceur: сайт, REPL
  • Babel: сайт, REPL
  • TypeScript: сайт, REPL
  • ScratchJS (расширение Chrome)

Итак, что же я могу использовать?

В общем, некоторые из возможностей ES6 могут использоваться практически «свободно», например, модули, стрелочные функции, остаточные параметры и классы. Эти функции могут быть транспилированы в ES5 без больших накладных расходов. Дополнения к объектам и прототипам , и (например, и ) требуют так называемых «заполнителей» (polyfills). Заполнители – временные костыли для функционала, который пока не поддерживается браузером. Вы можете загрузить заполнитель первым, и ваш код будет работать, как если бы браузер поддерживал этот функционал. и Babel, и Traceur предоставляют такие заполнители.

Смотрите таблицу совместимости ES6 от Kangax для полного обзора возможностей ES6, которые поддерживаются транспиляторами и браузерами. Мотивирует то, что на момент написания статьи, последние браузеры уже поддерживают от 55% до более 70% всех возможностей ES6. Microsoft Edge, Google Chrome и Mozilla Firefox здесь действительно конкурируют друг с другом, и это хорошо для веба в целом.

Лично я думаю, что возможность легко использовать новые возможности ES6, такие как модули, стрелочные функции и остаточные параметры, – это облегчение и значительное улучшение процесса кодирования.

Features

The ECMAScript language includes structured, dynamic, functional, and prototype-based features.

Imperative and structured

ECMAScript JavaScript supports C style structured programming. However, there exist some dissimilarities between both languages implementation of scoping. Until ECMAScript 2015, JavaScript supported only function scoping using the keyword . ECMAScript 2015 added the keywords and allowing JavaScript to support both block scoping as well as function scoping. JavaScript supports automatic semicolon insertion, meaning that semicolons that are normally used to terminate a statement in C may be omitted in JavaScript.

Like C-style languages, control flow is done with the , , , , and statements. Functions are weakly typed and may accept and return any type. Arguments not provided default to .

Weakly typed

ECMAScript is weakly typed. This means that certain types are assigned implicitly based on the operation being performed. However, there are several quirks in JavaScript’s implementation of the conversion of a variable from one type to another. These quirks have drawn criticism from many developers.[citation needed]

Dynamic

ECMAScript is dynamically typed. Thus, a type is associated with a value rather than an expression. ECMAScript supports various ways to test the type of objects, including duck typing.

Transpiling

Since ES 2015, transpiling JavaScript has become very common. Transpilation is a source-to-source compilation in which the newer versions of JavaScript are used in the user’s source code and the transpiler rewrites them so that they are compliant with the current specification. Usually, transpilers transpile down to ES3 to maintain compatibility with all versions of browsers. The settings to transpiling to a specific version can be configured according to need. Transpiling adds an extra step to the build process and is sometimes done to avoid needing polyfills. Polyfills allow using functionalities from newer ECMA versions in older environments that lack them. Polyfills do this at runtime in the interpreter, such as the user’s browser or on the server. Instead, transpiling rewrites the ECMA code itself during the build phase of development, before it reaches the interpreter.

Classes

Объявление класса

  • преобразование ошибок в исключения;
  • изменения, упрощающие вычисление переменной в определённых случаях использования её имени;
  • изменения, упрощающие eval и arguments;
  • изменения, упрощающие написание «безопасного» JavaScript;

Преобразование ошибок в исключения

  1. Ошибки времени исполнения будут переобразованны в необработанные исключения.
  2. Невозможно случайное создание глобальных переменных.
  3. Присваивания, которые всё равно завершились бы неудачей, выбрасывают исключения.
  4. Попытки удалить неудаляемые свойства будут вызывать исключения (в то время как прежде такая попытка просто не имела бы эффекта).
  5. Все свойства, перечисленные в сериализованном объекте, должны встречаться только один раз. В обычном коде имена свойств могут дублироваться, а значение свойства определяется последним объявлением.
  6. Имена аргументов в объявлении функций встречались только один раз. В обычном коде последний повторённый аргумент скрывает предыдущие аргументы с таким же именем.
  7. Запрещён синтаксис восьмеричной системы счисления.
  8. Запрещёна установка свойств с primitive значениями.

Упрощение работы с переменными

  1. Запрещено использование with. Проблема с with в том, что во время выполнения любое имя внутри блока может ссылаться как на свойство обрабатываемого объекта, так и на переменную в окружающем (или даже в глобальном) контексте — невозможно знать об этом заранее. Простая альтернатива with уже существует — присваивание объекта переменной с коротким именем и затем доступ к нужному свойству как свойству этой переменной.
  2. eval() в строгом режиме не добавляет новых переменных в окружающий контекст.
  3. Запрещено удаление простых имён.

Упрощение eval и arguments

  1. Ключевые слова eval и arguments не могут быть переопределены или изменены.
  2. Поля объекта arguments не связаны с проименованными аргументами функции, а являются их продублированными копиями значений.
  3. Свойство arguments.callee не поддерживается. В обычном коде свойство arguments.callee ссылается на саму функцию для вызова которой и был создан объект arguments.

«Обезопасенный» JavaScript

  1. Значение, передаваемое в функцию как this, в строгом режиме не приводится к объекту.
  2. Не представляется возможным осуществлять «прогонку» стека JavaScript посредством базовых расширений ECMAScript.
  3. В функциях свойство arguments больше не предоставляет доступ к переменным созданным внутри функции.

документацию

Методы

Синтаксис обьявления методов:

Сокращение методов-генераторов

Вычисляемые имена свойств

Cинтаксис getter’ов и setter’ов

  • setter — Необходим для валидаций записываемых параметров (как в примере выше)
  • getter — Необходим для получения свойств (хотя их можно получить и напрямую). Не может иметь аргументов

Активация

Node.js будет обрабатывать код как ES-модули в следующих случаях:

  • Файлы с расширением
  • Файлы с расширением или без расширения вообще, при условии что ближайший к ним родительский содержит значение
  • Код, переданный через аргумент или STDIN, вместе с флагом

Во всех остальных случаях код будет считаться CommonJS. Это относится к файлам без в ближайшем и коду, переданному через командную строку без указания . Это сделано в целях сохранения обратной совместимости. Однако, поскольку у нас теперь есть два вида модулей, CommonJS и ES, будет лучше указывать тип модулей явным образом.

Вы можете явно отметить свой код как CommonJS следующими признаками:

  • Файлы с расширением
  • Файлы с расширением или без расширения вообще, при условии что ближайший родительский содержит значение
  • Код, переданный через аргумент или STDIN c явным флагом

Feature detection

I suggest you to use feature detection instead of detecting the browser’s engine with heuristic methods. To do this you can simply wrap some code inside a statement, or use some statements.

For example:

Why is feature detection better than browser/engine detection?

There are multiple reasons that make, in most of the cases, feature detection the best option:

  • You don’t have to rely on browser’s version, engine or specifics, nor detect them using heuristic methods which are hard and pretty crafty to implement.

  • You will not fall into errors regarding browser/engine specifications detection.

  • You don’t have to worry about browser-specific features: for example WebKit browsers have different specifications than other ones.

  • You can be sure that, once a feature is detected, you’ll be able to use it.

These are the main reasons that IMHO make feature detection the best approach.

Bitwise Operators

JavaScript supports the following bitwise operators. The following table summarizes JavaScript’s bitwise operators.

Operators Usage Description
Bitwise AND a & b Returns a one in each bit position for which the corresponding bits of both operands are ones
Bitwise OR a | b Returns a one in each bit position for which the corresponding bits of either or both operands are ones
Bitwise XOR a^b Returns a one in each bit position for which the corresponding bits of either but not both operands are ones
Bitwise NOT ~ a Inverts the bits of its operand
Left shift a << b Shifts a in binary representation b (< 32) bits to the left, shifting in zeroes from the right
Sign-propagating right shift a >> b Shifts a in binary representation b (< 32) bits to the right, discarding bits shifted off
Zero-fill right shift a >>> b Shifts a in binary representation b (< 32) bits to the right, discarding bits shifted off, and shifting in zeroes from the left

С этим читают