Repository: javascript-tutorial/fr.javascript.info
Branch: master
Commit: c02fa1d6e2ca
Files: 1171
Total size: 3.9 MB
Directory structure:
gitextract_jgp5_eg_/
├── .gitattributes
├── .gitignore
├── 1-js/
│ ├── 01-getting-started/
│ │ ├── 1-intro/
│ │ │ └── article.md
│ │ ├── 2-manuals-specifications/
│ │ │ └── article.md
│ │ ├── 3-code-editors/
│ │ │ └── article.md
│ │ ├── 4-devtools/
│ │ │ ├── article.md
│ │ │ └── bug.html
│ │ └── index.md
│ ├── 02-first-steps/
│ │ ├── 01-hello-world/
│ │ │ ├── 1-hello-alert/
│ │ │ │ ├── index.html
│ │ │ │ ├── solution.md
│ │ │ │ ├── solution.view/
│ │ │ │ │ └── index.html
│ │ │ │ └── task.md
│ │ │ ├── 2-hello-alert-ext/
│ │ │ │ ├── alert.js
│ │ │ │ ├── index.html
│ │ │ │ ├── solution.md
│ │ │ │ └── task.md
│ │ │ └── article.md
│ │ ├── 02-structure/
│ │ │ └── article.md
│ │ ├── 03-strict-mode/
│ │ │ └── article.md
│ │ ├── 04-variables/
│ │ │ ├── 1-hello-variables/
│ │ │ │ ├── solution.md
│ │ │ │ └── task.md
│ │ │ ├── 2-declare-variables/
│ │ │ │ ├── solution.md
│ │ │ │ └── task.md
│ │ │ ├── 3-uppercast-constant/
│ │ │ │ ├── solution.md
│ │ │ │ └── task.md
│ │ │ └── article.md
│ │ ├── 05-types/
│ │ │ ├── 1-string-quotes/
│ │ │ │ ├── solution.md
│ │ │ │ └── task.md
│ │ │ └── article.md
│ │ ├── 06-alert-prompt-confirm/
│ │ │ ├── 1-simple-page/
│ │ │ │ ├── solution.md
│ │ │ │ └── task.md
│ │ │ └── article.md
│ │ ├── 07-type-conversions/
│ │ │ └── article.md
│ │ ├── 08-operators/
│ │ │ ├── 1-increment-order/
│ │ │ │ ├── solution.md
│ │ │ │ └── task.md
│ │ │ ├── 2-assignment-result/
│ │ │ │ ├── solution.md
│ │ │ │ └── task.md
│ │ │ ├── 3-primitive-conversions-questions/
│ │ │ │ ├── solution.md
│ │ │ │ └── task.md
│ │ │ ├── 4-fix-prompt/
│ │ │ │ ├── solution.md
│ │ │ │ └── task.md
│ │ │ └── article.md
│ │ ├── 09-comparison/
│ │ │ ├── 1-comparison-questions/
│ │ │ │ ├── solution.md
│ │ │ │ └── task.md
│ │ │ └── article.md
│ │ ├── 10-ifelse/
│ │ │ ├── 1-if-zero-string/
│ │ │ │ ├── solution.md
│ │ │ │ └── task.md
│ │ │ ├── 2-check-standard/
│ │ │ │ ├── ifelse_task2/
│ │ │ │ │ └── index.html
│ │ │ │ ├── solution.md
│ │ │ │ └── task.md
│ │ │ ├── 3-sign/
│ │ │ │ ├── if_sign/
│ │ │ │ │ └── index.html
│ │ │ │ ├── solution.md
│ │ │ │ └── task.md
│ │ │ ├── 5-rewrite-if-question/
│ │ │ │ ├── solution.md
│ │ │ │ └── task.md
│ │ │ ├── 6-rewrite-if-else-question/
│ │ │ │ ├── solution.md
│ │ │ │ └── task.md
│ │ │ └── article.md
│ │ ├── 11-logical-operators/
│ │ │ ├── 1-alert-null-2-undefined/
│ │ │ │ ├── solution.md
│ │ │ │ └── task.md
│ │ │ ├── 2-alert-or/
│ │ │ │ ├── solution.md
│ │ │ │ └── task.md
│ │ │ ├── 3-alert-1-null-2/
│ │ │ │ ├── solution.md
│ │ │ │ └── task.md
│ │ │ ├── 4-alert-and/
│ │ │ │ ├── solution.md
│ │ │ │ └── task.md
│ │ │ ├── 5-alert-and-or/
│ │ │ │ ├── solution.md
│ │ │ │ └── task.md
│ │ │ ├── 6-check-if-in-range/
│ │ │ │ ├── solution.md
│ │ │ │ └── task.md
│ │ │ ├── 7-check-if-out-range/
│ │ │ │ ├── solution.md
│ │ │ │ └── task.md
│ │ │ ├── 8-if-question/
│ │ │ │ ├── solution.md
│ │ │ │ └── task.md
│ │ │ ├── 9-check-login/
│ │ │ │ ├── solution.md
│ │ │ │ └── task.md
│ │ │ └── article.md
│ │ ├── 12-nullish-coalescing-operator/
│ │ │ └── article.md
│ │ ├── 13-while-for/
│ │ │ ├── 1-loop-last-value/
│ │ │ │ ├── solution.md
│ │ │ │ └── task.md
│ │ │ ├── 2-which-value-while/
│ │ │ │ ├── solution.md
│ │ │ │ └── task.md
│ │ │ ├── 3-which-value-for/
│ │ │ │ ├── solution.md
│ │ │ │ └── task.md
│ │ │ ├── 4-for-even/
│ │ │ │ ├── solution.md
│ │ │ │ └── task.md
│ │ │ ├── 5-replace-for-while/
│ │ │ │ ├── solution.md
│ │ │ │ └── task.md
│ │ │ ├── 6-repeat-until-correct/
│ │ │ │ ├── solution.md
│ │ │ │ └── task.md
│ │ │ ├── 7-list-primes/
│ │ │ │ ├── solution.md
│ │ │ │ └── task.md
│ │ │ └── article.md
│ │ ├── 14-switch/
│ │ │ ├── 1-rewrite-switch-if-else/
│ │ │ │ ├── solution.md
│ │ │ │ └── task.md
│ │ │ ├── 2-rewrite-if-switch/
│ │ │ │ ├── solution.md
│ │ │ │ └── task.md
│ │ │ └── article.md
│ │ ├── 15-function-basics/
│ │ │ ├── 1-if-else-required/
│ │ │ │ ├── solution.md
│ │ │ │ └── task.md
│ │ │ ├── 2-rewrite-function-question-or/
│ │ │ │ ├── solution.md
│ │ │ │ └── task.md
│ │ │ ├── 3-min/
│ │ │ │ ├── solution.md
│ │ │ │ └── task.md
│ │ │ ├── 4-pow/
│ │ │ │ ├── solution.md
│ │ │ │ └── task.md
│ │ │ └── article.md
│ │ ├── 16-function-expressions/
│ │ │ └── article.md
│ │ ├── 17-arrow-functions-basics/
│ │ │ ├── 1-rewrite-arrow/
│ │ │ │ ├── solution.md
│ │ │ │ └── task.md
│ │ │ └── article.md
│ │ ├── 18-javascript-specials/
│ │ │ └── article.md
│ │ └── index.md
│ ├── 03-code-quality/
│ │ ├── 01-debugging-chrome/
│ │ │ ├── article.md
│ │ │ ├── debugging.view/
│ │ │ │ ├── hello.js
│ │ │ │ └── index.html
│ │ │ └── head.html
│ │ ├── 02-coding-style/
│ │ │ ├── 1-style-errors/
│ │ │ │ ├── solution.md
│ │ │ │ └── task.md
│ │ │ └── article.md
│ │ ├── 03-comments/
│ │ │ └── article.md
│ │ ├── 04-ninja-code/
│ │ │ └── article.md
│ │ ├── 05-testing-mocha/
│ │ │ ├── 3-pow-test-wrong/
│ │ │ │ ├── solution.md
│ │ │ │ └── task.md
│ │ │ ├── article.md
│ │ │ ├── beforeafter.view/
│ │ │ │ ├── index.html
│ │ │ │ └── test.js
│ │ │ ├── index.html
│ │ │ ├── pow-1.view/
│ │ │ │ ├── index.html
│ │ │ │ └── test.js
│ │ │ ├── pow-2.view/
│ │ │ │ ├── index.html
│ │ │ │ └── test.js
│ │ │ ├── pow-3.view/
│ │ │ │ ├── index.html
│ │ │ │ └── test.js
│ │ │ ├── pow-4.view/
│ │ │ │ ├── index.html
│ │ │ │ └── test.js
│ │ │ ├── pow-full.view/
│ │ │ │ ├── index.html
│ │ │ │ └── test.js
│ │ │ ├── pow-min.view/
│ │ │ │ ├── index.html
│ │ │ │ └── test.js
│ │ │ └── pow-nan.view/
│ │ │ ├── index.html
│ │ │ └── test.js
│ │ ├── 06-polyfills/
│ │ │ └── article.md
│ │ └── index.md
│ ├── 04-object-basics/
│ │ ├── 01-object/
│ │ │ ├── 2-hello-object/
│ │ │ │ ├── solution.md
│ │ │ │ └── task.md
│ │ │ ├── 3-is-empty/
│ │ │ │ ├── _js.view/
│ │ │ │ │ ├── solution.js
│ │ │ │ │ └── test.js
│ │ │ │ ├── solution.md
│ │ │ │ └── task.md
│ │ │ ├── 4-const-object/
│ │ │ │ ├── solution.md
│ │ │ │ └── task.md
│ │ │ ├── 5-sum-object/
│ │ │ │ ├── solution.md
│ │ │ │ └── task.md
│ │ │ ├── 8-multiply-numeric/
│ │ │ │ ├── _js.view/
│ │ │ │ │ ├── solution.js
│ │ │ │ │ ├── source.js
│ │ │ │ │ └── test.js
│ │ │ │ ├── solution.md
│ │ │ │ └── task.md
│ │ │ └── article.md
│ │ ├── 02-object-copy/
│ │ │ └── article.md
│ │ ├── 03-garbage-collection/
│ │ │ └── article.md
│ │ ├── 04-object-methods/
│ │ │ ├── 4-object-property-this/
│ │ │ │ ├── solution.md
│ │ │ │ └── task.md
│ │ │ ├── 7-calculator/
│ │ │ │ ├── _js.view/
│ │ │ │ │ ├── solution.js
│ │ │ │ │ └── test.js
│ │ │ │ ├── solution.md
│ │ │ │ └── task.md
│ │ │ ├── 8-chain-calls/
│ │ │ │ ├── _js.view/
│ │ │ │ │ ├── solution.js
│ │ │ │ │ └── test.js
│ │ │ │ ├── solution.md
│ │ │ │ └── task.md
│ │ │ └── article.md
│ │ ├── 06-constructor-new/
│ │ │ ├── 1-two-functions-one-object/
│ │ │ │ ├── solution.md
│ │ │ │ └── task.md
│ │ │ ├── 2-calculator-constructor/
│ │ │ │ ├── _js.view/
│ │ │ │ │ ├── solution.js
│ │ │ │ │ └── test.js
│ │ │ │ ├── solution.md
│ │ │ │ └── task.md
│ │ │ ├── 3-accumulator/
│ │ │ │ ├── _js.view/
│ │ │ │ │ ├── solution.js
│ │ │ │ │ └── test.js
│ │ │ │ ├── solution.md
│ │ │ │ └── task.md
│ │ │ └── article.md
│ │ ├── 07-optional-chaining/
│ │ │ └── article.md
│ │ ├── 08-symbol/
│ │ │ └── article.md
│ │ ├── 09-object-toprimitive/
│ │ │ └── article.md
│ │ └── index.md
│ ├── 05-data-types/
│ │ ├── 01-primitives-methods/
│ │ │ ├── 1-string-new-property/
│ │ │ │ ├── solution.md
│ │ │ │ └── task.md
│ │ │ └── article.md
│ │ ├── 02-number/
│ │ │ ├── 1-sum-interface/
│ │ │ │ ├── solution.md
│ │ │ │ └── task.md
│ │ │ ├── 2-why-rounded-down/
│ │ │ │ ├── solution.md
│ │ │ │ └── task.md
│ │ │ ├── 3-repeat-until-number/
│ │ │ │ ├── _js.view/
│ │ │ │ │ ├── solution.js
│ │ │ │ │ └── test.js
│ │ │ │ ├── solution.md
│ │ │ │ └── task.md
│ │ │ ├── 4-endless-loop-error/
│ │ │ │ ├── solution.md
│ │ │ │ └── task.md
│ │ │ ├── 8-random-min-max/
│ │ │ │ ├── solution.md
│ │ │ │ └── task.md
│ │ │ ├── 9-random-int-min-max/
│ │ │ │ ├── solution.md
│ │ │ │ └── task.md
│ │ │ └── article.md
│ │ ├── 03-string/
│ │ │ ├── 1-ucfirst/
│ │ │ │ ├── _js.view/
│ │ │ │ │ ├── solution.js
│ │ │ │ │ └── test.js
│ │ │ │ ├── solution.md
│ │ │ │ └── task.md
│ │ │ ├── 2-check-spam/
│ │ │ │ ├── _js.view/
│ │ │ │ │ ├── solution.js
│ │ │ │ │ └── test.js
│ │ │ │ ├── solution.md
│ │ │ │ └── task.md
│ │ │ ├── 3-truncate/
│ │ │ │ ├── _js.view/
│ │ │ │ │ ├── solution.js
│ │ │ │ │ └── test.js
│ │ │ │ ├── solution.md
│ │ │ │ └── task.md
│ │ │ ├── 4-extract-currency/
│ │ │ │ ├── _js.view/
│ │ │ │ │ ├── solution.js
│ │ │ │ │ └── test.js
│ │ │ │ ├── solution.md
│ │ │ │ └── task.md
│ │ │ └── article.md
│ │ ├── 04-array/
│ │ │ ├── 1-item-value/
│ │ │ │ ├── solution.md
│ │ │ │ └── task.md
│ │ │ ├── 10-maximal-subarray/
│ │ │ │ ├── _js.view/
│ │ │ │ │ ├── solution.js
│ │ │ │ │ └── test.js
│ │ │ │ ├── solution.md
│ │ │ │ └── task.md
│ │ │ ├── 2-create-array/
│ │ │ │ ├── solution.md
│ │ │ │ └── task.md
│ │ │ ├── 3-call-array-this/
│ │ │ │ ├── solution.md
│ │ │ │ └── task.md
│ │ │ ├── 5-array-input-sum/
│ │ │ │ ├── solution.md
│ │ │ │ └── task.md
│ │ │ └── article.md
│ │ ├── 05-array-methods/
│ │ │ ├── 1-camelcase/
│ │ │ │ ├── _js.view/
│ │ │ │ │ ├── solution.js
│ │ │ │ │ └── test.js
│ │ │ │ ├── solution.md
│ │ │ │ └── task.md
│ │ │ ├── 10-average-age/
│ │ │ │ ├── solution.md
│ │ │ │ └── task.md
│ │ │ ├── 11-array-unique/
│ │ │ │ ├── _js.view/
│ │ │ │ │ ├── solution.js
│ │ │ │ │ └── test.js
│ │ │ │ ├── solution.md
│ │ │ │ └── task.md
│ │ │ ├── 12-reduce-object/
│ │ │ │ ├── _js.view/
│ │ │ │ │ ├── solution.js
│ │ │ │ │ └── test.js
│ │ │ │ ├── solution.md
│ │ │ │ └── task.md
│ │ │ ├── 2-filter-range/
│ │ │ │ ├── _js.view/
│ │ │ │ │ ├── solution.js
│ │ │ │ │ └── test.js
│ │ │ │ ├── solution.md
│ │ │ │ └── task.md
│ │ │ ├── 3-filter-range-in-place/
│ │ │ │ ├── _js.view/
│ │ │ │ │ ├── solution.js
│ │ │ │ │ └── test.js
│ │ │ │ ├── solution.md
│ │ │ │ └── task.md
│ │ │ ├── 4-sort-back/
│ │ │ │ ├── solution.md
│ │ │ │ └── task.md
│ │ │ ├── 5-copy-sort-array/
│ │ │ │ ├── solution.md
│ │ │ │ └── task.md
│ │ │ ├── 6-array-get-names/
│ │ │ │ ├── solution.md
│ │ │ │ └── task.md
│ │ │ ├── 6-calculator-extendable/
│ │ │ │ ├── _js.view/
│ │ │ │ │ ├── solution.js
│ │ │ │ │ └── test.js
│ │ │ │ ├── solution.md
│ │ │ │ └── task.md
│ │ │ ├── 7-map-objects/
│ │ │ │ ├── solution.md
│ │ │ │ └── task.md
│ │ │ ├── 8-sort-objects/
│ │ │ │ ├── solution.md
│ │ │ │ └── task.md
│ │ │ ├── 9-shuffle/
│ │ │ │ ├── solution.md
│ │ │ │ └── task.md
│ │ │ └── article.md
│ │ ├── 06-iterable/
│ │ │ └── article.md
│ │ ├── 07-map-set/
│ │ │ ├── 01-array-unique-map/
│ │ │ │ ├── _js.view/
│ │ │ │ │ ├── solution.js
│ │ │ │ │ └── test.js
│ │ │ │ ├── solution.md
│ │ │ │ └── task.md
│ │ │ ├── 02-filter-anagrams/
│ │ │ │ ├── _js.view/
│ │ │ │ │ ├── solution.js
│ │ │ │ │ └── test.js
│ │ │ │ ├── solution.md
│ │ │ │ └── task.md
│ │ │ ├── 03-iterable-keys/
│ │ │ │ ├── solution.md
│ │ │ │ └── task.md
│ │ │ └── article.md
│ │ ├── 08-weakmap-weakset/
│ │ │ ├── 01-recipients-read/
│ │ │ │ ├── solution.md
│ │ │ │ └── task.md
│ │ │ ├── 02-recipients-when-read/
│ │ │ │ ├── solution.md
│ │ │ │ └── task.md
│ │ │ └── article.md
│ │ ├── 09-keys-values-entries/
│ │ │ ├── 01-sum-salaries/
│ │ │ │ ├── _js.view/
│ │ │ │ │ ├── solution.js
│ │ │ │ │ └── test.js
│ │ │ │ ├── solution.md
│ │ │ │ └── task.md
│ │ │ ├── 02-count-properties/
│ │ │ │ ├── _js.view/
│ │ │ │ │ ├── solution.js
│ │ │ │ │ └── test.js
│ │ │ │ ├── solution.md
│ │ │ │ └── task.md
│ │ │ └── article.md
│ │ ├── 10-destructuring-assignment/
│ │ │ ├── 1-destruct-user/
│ │ │ │ ├── solution.md
│ │ │ │ └── task.md
│ │ │ ├── 6-max-salary/
│ │ │ │ ├── _js.view/
│ │ │ │ │ ├── solution.js
│ │ │ │ │ └── test.js
│ │ │ │ ├── solution.md
│ │ │ │ └── task.md
│ │ │ └── article.md
│ │ ├── 11-date/
│ │ │ ├── 1-new-date/
│ │ │ │ ├── solution.md
│ │ │ │ └── task.md
│ │ │ ├── 2-get-week-day/
│ │ │ │ ├── _js.view/
│ │ │ │ │ ├── solution.js
│ │ │ │ │ └── test.js
│ │ │ │ ├── solution.md
│ │ │ │ └── task.md
│ │ │ ├── 3-weekday/
│ │ │ │ ├── _js.view/
│ │ │ │ │ ├── solution.js
│ │ │ │ │ └── test.js
│ │ │ │ ├── solution.md
│ │ │ │ └── task.md
│ │ │ ├── 4-get-date-ago/
│ │ │ │ ├── _js.view/
│ │ │ │ │ ├── solution.js
│ │ │ │ │ └── test.js
│ │ │ │ ├── solution.md
│ │ │ │ └── task.md
│ │ │ ├── 5-last-day-of-month/
│ │ │ │ ├── _js.view/
│ │ │ │ │ ├── solution.js
│ │ │ │ │ └── test.js
│ │ │ │ ├── solution.md
│ │ │ │ └── task.md
│ │ │ ├── 6-get-seconds-today/
│ │ │ │ ├── solution.md
│ │ │ │ └── task.md
│ │ │ ├── 7-get-seconds-to-tomorrow/
│ │ │ │ ├── solution.md
│ │ │ │ └── task.md
│ │ │ ├── 8-format-date-relative/
│ │ │ │ ├── _js.view/
│ │ │ │ │ ├── solution.js
│ │ │ │ │ └── test.js
│ │ │ │ ├── solution.md
│ │ │ │ └── task.md
│ │ │ └── article.md
│ │ ├── 12-json/
│ │ │ ├── 1-serialize-object/
│ │ │ │ ├── solution.md
│ │ │ │ └── task.md
│ │ │ ├── 2-serialize-event-circular/
│ │ │ │ ├── solution.md
│ │ │ │ └── task.md
│ │ │ └── article.md
│ │ └── index.md
│ ├── 06-advanced-functions/
│ │ ├── 01-recursion/
│ │ │ ├── 01-sum-to/
│ │ │ │ ├── solution.md
│ │ │ │ └── task.md
│ │ │ ├── 02-factorial/
│ │ │ │ ├── solution.md
│ │ │ │ └── task.md
│ │ │ ├── 03-fibonacci-numbers/
│ │ │ │ ├── solution.md
│ │ │ │ └── task.md
│ │ │ ├── 04-output-single-linked-list/
│ │ │ │ ├── solution.md
│ │ │ │ └── task.md
│ │ │ ├── 05-output-single-linked-list-reverse/
│ │ │ │ ├── solution.md
│ │ │ │ └── task.md
│ │ │ ├── article.md
│ │ │ └── head.html
│ │ ├── 02-rest-parameters-spread/
│ │ │ └── article.md
│ │ ├── 03-closure/
│ │ │ ├── 1-closure-latest-changes/
│ │ │ │ ├── solution.md
│ │ │ │ └── task.md
│ │ │ ├── 10-make-army/
│ │ │ │ ├── _js.view/
│ │ │ │ │ ├── solution.js
│ │ │ │ │ ├── source.js
│ │ │ │ │ └── test.js
│ │ │ │ ├── solution.md
│ │ │ │ └── task.md
│ │ │ ├── 2-closure-variable-access/
│ │ │ │ ├── solution.md
│ │ │ │ └── task.md
│ │ │ ├── 3-counter-independent/
│ │ │ │ ├── solution.md
│ │ │ │ └── task.md
│ │ │ ├── 4-counter-object-independent/
│ │ │ │ ├── solution.md
│ │ │ │ └── task.md
│ │ │ ├── 5-function-in-if/
│ │ │ │ ├── solution.md
│ │ │ │ └── task.md
│ │ │ ├── 6-closure-sum/
│ │ │ │ ├── solution.md
│ │ │ │ └── task.md
│ │ │ ├── 7-let-scope/
│ │ │ │ ├── solution.md
│ │ │ │ └── task.md
│ │ │ ├── 8-filter-through-function/
│ │ │ │ ├── _js.view/
│ │ │ │ │ ├── solution.js
│ │ │ │ │ ├── source.js
│ │ │ │ │ └── test.js
│ │ │ │ ├── solution.md
│ │ │ │ └── task.md
│ │ │ ├── 9-sort-by-field/
│ │ │ │ ├── _js.view/
│ │ │ │ │ ├── solution.js
│ │ │ │ │ ├── source.js
│ │ │ │ │ └── test.js
│ │ │ │ ├── solution.md
│ │ │ │ └── task.md
│ │ │ └── article.md
│ │ ├── 04-var/
│ │ │ └── article.md
│ │ ├── 05-global-object/
│ │ │ └── article.md
│ │ ├── 06-function-object/
│ │ │ ├── 2-counter-inc-dec/
│ │ │ │ ├── _js.view/
│ │ │ │ │ ├── solution.js
│ │ │ │ │ ├── source.js
│ │ │ │ │ └── test.js
│ │ │ │ ├── solution.md
│ │ │ │ └── task.md
│ │ │ ├── 5-sum-many-brackets/
│ │ │ │ ├── _js.view/
│ │ │ │ │ ├── solution.js
│ │ │ │ │ ├── source.js
│ │ │ │ │ └── test.js
│ │ │ │ ├── solution.md
│ │ │ │ └── task.md
│ │ │ └── article.md
│ │ ├── 07-new-function/
│ │ │ └── article.md
│ │ ├── 08-settimeout-setinterval/
│ │ │ ├── 1-output-numbers-100ms/
│ │ │ │ ├── solution.md
│ │ │ │ └── task.md
│ │ │ ├── 3-rewrite-settimeout/
│ │ │ │ ├── solution.md
│ │ │ │ └── task.md
│ │ │ ├── 4-settimeout-result/
│ │ │ │ ├── solution.md
│ │ │ │ └── task.md
│ │ │ └── article.md
│ │ ├── 09-call-apply-decorators/
│ │ │ ├── 01-spy-decorator/
│ │ │ │ ├── _js.view/
│ │ │ │ │ ├── solution.js
│ │ │ │ │ ├── source.js
│ │ │ │ │ └── test.js
│ │ │ │ ├── solution.md
│ │ │ │ └── task.md
│ │ │ ├── 02-delay/
│ │ │ │ ├── _js.view/
│ │ │ │ │ ├── solution.js
│ │ │ │ │ └── test.js
│ │ │ │ ├── solution.md
│ │ │ │ └── task.md
│ │ │ ├── 03-debounce/
│ │ │ │ ├── _js.view/
│ │ │ │ │ ├── solution.js
│ │ │ │ │ └── test.js
│ │ │ │ ├── debounce.view/
│ │ │ │ │ └── index.html
│ │ │ │ ├── solution.md
│ │ │ │ └── task.md
│ │ │ ├── 04-throttle/
│ │ │ │ ├── _js.view/
│ │ │ │ │ ├── solution.js
│ │ │ │ │ └── test.js
│ │ │ │ ├── solution.md
│ │ │ │ └── task.md
│ │ │ └── article.md
│ │ ├── 10-bind/
│ │ │ ├── 2-write-to-object-after-bind/
│ │ │ │ ├── solution.md
│ │ │ │ └── task.md
│ │ │ ├── 3-second-bind/
│ │ │ │ ├── solution.md
│ │ │ │ └── task.md
│ │ │ ├── 4-function-property-after-bind/
│ │ │ │ ├── solution.md
│ │ │ │ └── task.md
│ │ │ ├── 5-question-use-bind/
│ │ │ │ ├── solution.md
│ │ │ │ └── task.md
│ │ │ ├── 6-ask-partial/
│ │ │ │ ├── solution.md
│ │ │ │ └── task.md
│ │ │ ├── article.md
│ │ │ └── head.html
│ │ ├── 12-arrow-functions/
│ │ │ └── article.md
│ │ └── index.md
│ ├── 07-object-properties/
│ │ ├── 01-property-descriptors/
│ │ │ └── article.md
│ │ ├── 02-property-accessors/
│ │ │ └── article.md
│ │ └── index.md
│ ├── 08-prototypes/
│ │ ├── 01-prototype-inheritance/
│ │ │ ├── 1-property-after-delete/
│ │ │ │ ├── solution.md
│ │ │ │ └── task.md
│ │ │ ├── 2-search-algorithm/
│ │ │ │ ├── solution.md
│ │ │ │ └── task.md
│ │ │ ├── 3-proto-and-this/
│ │ │ │ ├── solution.md
│ │ │ │ └── task.md
│ │ │ ├── 4-hamster-proto/
│ │ │ │ ├── solution.md
│ │ │ │ └── task.md
│ │ │ └── article.md
│ │ ├── 02-function-prototype/
│ │ │ ├── 1-changing-prototype/
│ │ │ │ ├── solution.md
│ │ │ │ └── task.md
│ │ │ ├── 4-new-object-same-constructor/
│ │ │ │ ├── solution.md
│ │ │ │ └── task.md
│ │ │ └── article.md
│ │ ├── 03-native-prototypes/
│ │ │ ├── 1-defer-to-prototype/
│ │ │ │ ├── solution.md
│ │ │ │ └── task.md
│ │ │ ├── 2-defer-to-prototype-extended/
│ │ │ │ ├── solution.md
│ │ │ │ └── task.md
│ │ │ └── article.md
│ │ ├── 04-prototype-methods/
│ │ │ ├── 2-dictionary-tostring/
│ │ │ │ ├── solution.md
│ │ │ │ └── task.md
│ │ │ ├── 3-compare-calls/
│ │ │ │ ├── solution.md
│ │ │ │ └── task.md
│ │ │ └── article.md
│ │ └── index.md
│ ├── 09-classes/
│ │ ├── 01-class/
│ │ │ ├── 1-rewrite-to-class/
│ │ │ │ ├── _js.view/
│ │ │ │ │ ├── solution.js
│ │ │ │ │ └── source.js
│ │ │ │ ├── solution.md
│ │ │ │ └── task.md
│ │ │ └── article.md
│ │ ├── 02-class-inheritance/
│ │ │ ├── 1-class-constructor-error/
│ │ │ │ ├── solution.md
│ │ │ │ └── task.md
│ │ │ ├── 2-clock-class-extended/
│ │ │ │ ├── solution.md
│ │ │ │ ├── solution.view/
│ │ │ │ │ ├── clock.js
│ │ │ │ │ ├── extended-clock.js
│ │ │ │ │ └── index.html
│ │ │ │ ├── source.view/
│ │ │ │ │ ├── clock.js
│ │ │ │ │ └── index.html
│ │ │ │ └── task.md
│ │ │ └── article.md
│ │ ├── 03-static-properties-methods/
│ │ │ ├── 3-class-extend-object/
│ │ │ │ ├── solution.md
│ │ │ │ └── task.md
│ │ │ └── article.md
│ │ ├── 04-private-protected-properties-methods/
│ │ │ └── article.md
│ │ ├── 05-extend-natives/
│ │ │ └── article.md
│ │ ├── 06-instanceof/
│ │ │ ├── 1-strange-instanceof/
│ │ │ │ ├── solution.md
│ │ │ │ └── task.md
│ │ │ └── article.md
│ │ ├── 07-mixins/
│ │ │ ├── article.md
│ │ │ └── head.html
│ │ └── index.md
│ ├── 10-error-handling/
│ │ ├── 1-try-catch/
│ │ │ ├── 1-finally-or-code-after/
│ │ │ │ ├── solution.md
│ │ │ │ └── task.md
│ │ │ └── article.md
│ │ ├── 2-custom-errors/
│ │ │ ├── 1-format-error/
│ │ │ │ ├── solution.md
│ │ │ │ └── task.md
│ │ │ └── article.md
│ │ └── index.md
│ ├── 11-async/
│ │ ├── 01-callbacks/
│ │ │ ├── article.md
│ │ │ └── one.js
│ │ ├── 02-promise-basics/
│ │ │ ├── 01-re-resolve/
│ │ │ │ ├── solution.md
│ │ │ │ └── task.md
│ │ │ ├── 02-delay-promise/
│ │ │ │ ├── solution.md
│ │ │ │ └── task.md
│ │ │ ├── 03-animate-circle-promise/
│ │ │ │ ├── solution.md
│ │ │ │ ├── solution.view/
│ │ │ │ │ └── index.html
│ │ │ │ └── task.md
│ │ │ ├── article.md
│ │ │ └── head.html
│ │ ├── 03-promise-chaining/
│ │ │ ├── 01-then-vs-catch/
│ │ │ │ ├── solution.md
│ │ │ │ └── task.md
│ │ │ ├── article.md
│ │ │ ├── getMessage.js
│ │ │ ├── head.html
│ │ │ ├── one.js
│ │ │ ├── three.js
│ │ │ ├── two.js
│ │ │ └── user.json
│ │ ├── 04-promise-error-handling/
│ │ │ ├── 01-error-async/
│ │ │ │ ├── solution.md
│ │ │ │ └── task.md
│ │ │ ├── article.md
│ │ │ ├── getMessage.js
│ │ │ ├── head.html
│ │ │ ├── one.js
│ │ │ ├── three.js
│ │ │ ├── two.js
│ │ │ └── user.json
│ │ ├── 05-promise-api/
│ │ │ ├── article.md
│ │ │ ├── head.html
│ │ │ ├── iliakan.json
│ │ │ ├── one.js
│ │ │ └── two.js
│ │ ├── 06-promisify/
│ │ │ └── article.md
│ │ ├── 07-microtask-queue/
│ │ │ └── article.md
│ │ ├── 08-async-await/
│ │ │ ├── 01-rewrite-async/
│ │ │ │ ├── solution.md
│ │ │ │ └── task.md
│ │ │ ├── 02-rewrite-async-2/
│ │ │ │ ├── solution.md
│ │ │ │ └── task.md
│ │ │ ├── 03-async-from-regular/
│ │ │ │ ├── solution.md
│ │ │ │ └── task.md
│ │ │ ├── article.md
│ │ │ └── head.html
│ │ └── index.md
│ ├── 12-generators-iterators/
│ │ ├── 1-generators/
│ │ │ ├── 01-pseudo-random-generator/
│ │ │ │ ├── _js.view/
│ │ │ │ │ ├── solution.js
│ │ │ │ │ └── test.js
│ │ │ │ ├── solution.md
│ │ │ │ └── task.md
│ │ │ └── article.md
│ │ ├── 2-async-iterators-generators/
│ │ │ ├── article.md
│ │ │ └── head.html
│ │ └── index.md
│ ├── 13-modules/
│ │ ├── 01-modules-intro/
│ │ │ ├── article.md
│ │ │ ├── say.view/
│ │ │ │ ├── index.html
│ │ │ │ └── say.js
│ │ │ ├── scopes-working.view/
│ │ │ │ ├── hello.js
│ │ │ │ ├── index.html
│ │ │ │ └── user.js
│ │ │ └── scopes.view/
│ │ │ ├── hello.js
│ │ │ ├── index.html
│ │ │ └── user.js
│ │ ├── 02-import-export/
│ │ │ └── article.md
│ │ ├── 03-modules-dynamic-imports/
│ │ │ ├── article.md
│ │ │ └── say.view/
│ │ │ ├── index.html
│ │ │ └── say.js
│ │ └── index.md
│ ├── 99-js-misc/
│ │ ├── 01-proxy/
│ │ │ ├── 01-error-nonexisting/
│ │ │ │ ├── solution.md
│ │ │ │ └── task.md
│ │ │ ├── 02-array-negative/
│ │ │ │ ├── solution.md
│ │ │ │ └── task.md
│ │ │ ├── 03-observable/
│ │ │ │ ├── solution.md
│ │ │ │ └── task.md
│ │ │ └── article.md
│ │ ├── 02-eval/
│ │ │ ├── 1-eval-calculator/
│ │ │ │ ├── solution.md
│ │ │ │ └── task.md
│ │ │ └── article.md
│ │ ├── 03-currying-partials/
│ │ │ └── article.md
│ │ ├── 04-reference-type/
│ │ │ ├── 2-check-syntax/
│ │ │ │ ├── solution.md
│ │ │ │ └── task.md
│ │ │ ├── 3-why-this/
│ │ │ │ ├── solution.md
│ │ │ │ └── task.md
│ │ │ └── article.md
│ │ ├── 05-bigint/
│ │ │ └── article.md
│ │ ├── 06-unicode/
│ │ │ └── article.md
│ │ └── index.md
│ └── index.md
├── 2-ui/
│ ├── 1-document/
│ │ ├── 01-browser-environment/
│ │ │ └── article.md
│ │ ├── 02-dom-nodes/
│ │ │ ├── article.md
│ │ │ ├── elk.html
│ │ │ └── head.html
│ │ ├── 03-dom-navigation/
│ │ │ ├── 1-dom-children/
│ │ │ │ ├── solution.md
│ │ │ │ └── task.md
│ │ │ ├── 3-navigation-links-which-null/
│ │ │ │ ├── solution.md
│ │ │ │ └── task.md
│ │ │ ├── 4-select-diagonal-cells/
│ │ │ │ ├── solution.md
│ │ │ │ ├── solution.view/
│ │ │ │ │ └── index.html
│ │ │ │ ├── source.view/
│ │ │ │ │ └── index.html
│ │ │ │ └── task.md
│ │ │ ├── article.md
│ │ │ └── head.html
│ │ ├── 04-searching-elements-dom/
│ │ │ ├── 1-find-elements/
│ │ │ │ ├── solution.md
│ │ │ │ ├── table.html
│ │ │ │ └── task.md
│ │ │ └── article.md
│ │ ├── 05-basic-dom-node-properties/
│ │ │ ├── 2-lastchild-nodetype-inline/
│ │ │ │ ├── solution.md
│ │ │ │ └── task.md
│ │ │ ├── 2-tree-info/
│ │ │ │ ├── solution.md
│ │ │ │ ├── solution.view/
│ │ │ │ │ └── index.html
│ │ │ │ ├── source.view/
│ │ │ │ │ └── index.html
│ │ │ │ └── task.md
│ │ │ ├── 3-tag-in-comment/
│ │ │ │ ├── solution.md
│ │ │ │ └── task.md
│ │ │ ├── 4-where-document-in-hierarchy/
│ │ │ │ ├── solution.md
│ │ │ │ └── task.md
│ │ │ └── article.md
│ │ ├── 06-dom-attributes-and-properties/
│ │ │ ├── 1-get-user-attribute/
│ │ │ │ ├── solution.md
│ │ │ │ └── task.md
│ │ │ ├── 2-yellow-links/
│ │ │ │ ├── solution.md
│ │ │ │ ├── solution.view/
│ │ │ │ │ └── index.html
│ │ │ │ ├── source.view/
│ │ │ │ │ └── index.html
│ │ │ │ └── task.md
│ │ │ └── article.md
│ │ ├── 07-modifying-document/
│ │ │ ├── 1-createtextnode-vs-innerhtml/
│ │ │ │ ├── solution.md
│ │ │ │ └── task.md
│ │ │ ├── 10-clock-setinterval/
│ │ │ │ ├── solution.md
│ │ │ │ ├── solution.view/
│ │ │ │ │ └── index.html
│ │ │ │ ├── source.view/
│ │ │ │ │ └── index.html
│ │ │ │ └── task.md
│ │ │ ├── 11-append-to-list/
│ │ │ │ ├── solution.md
│ │ │ │ └── task.md
│ │ │ ├── 12-sort-table/
│ │ │ │ ├── solution.md
│ │ │ │ ├── solution.view/
│ │ │ │ │ └── index.html
│ │ │ │ ├── source.view/
│ │ │ │ │ └── index.html
│ │ │ │ └── task.md
│ │ │ ├── 4-clear-elem/
│ │ │ │ ├── solution.md
│ │ │ │ └── task.md
│ │ │ ├── 5-why-aaa/
│ │ │ │ ├── solution.md
│ │ │ │ └── task.md
│ │ │ ├── 6-create-list/
│ │ │ │ ├── solution.md
│ │ │ │ ├── solution.view/
│ │ │ │ │ └── index.html
│ │ │ │ └── task.md
│ │ │ ├── 7-create-object-tree/
│ │ │ │ ├── build-tree-dom.view/
│ │ │ │ │ └── index.html
│ │ │ │ ├── innerhtml.view/
│ │ │ │ │ └── index.html
│ │ │ │ ├── solution.md
│ │ │ │ ├── source.view/
│ │ │ │ │ └── index.html
│ │ │ │ └── task.md
│ │ │ ├── 8-tree-count/
│ │ │ │ ├── solution.md
│ │ │ │ ├── solution.view/
│ │ │ │ │ └── index.html
│ │ │ │ ├── source.view/
│ │ │ │ │ └── index.html
│ │ │ │ └── task.md
│ │ │ ├── 9-calendar-table/
│ │ │ │ ├── solution.md
│ │ │ │ ├── solution.view/
│ │ │ │ │ └── index.html
│ │ │ │ ├── source.view/
│ │ │ │ │ └── index.html
│ │ │ │ └── task.md
│ │ │ └── article.md
│ │ ├── 08-styles-and-classes/
│ │ │ ├── 2-create-notification/
│ │ │ │ ├── solution.md
│ │ │ │ ├── solution.view/
│ │ │ │ │ ├── index.css
│ │ │ │ │ └── index.html
│ │ │ │ ├── source.view/
│ │ │ │ │ ├── index.css
│ │ │ │ │ └── index.html
│ │ │ │ └── task.md
│ │ │ └── article.md
│ │ ├── 09-size-and-scroll/
│ │ │ ├── 1-get-scroll-height-bottom/
│ │ │ │ ├── solution.md
│ │ │ │ └── task.md
│ │ │ ├── 2-scrollbar-width/
│ │ │ │ ├── solution.md
│ │ │ │ └── task.md
│ │ │ ├── 4-put-ball-in-center/
│ │ │ │ ├── ball-half/
│ │ │ │ │ └── index.html
│ │ │ │ ├── solution.md
│ │ │ │ ├── solution.view/
│ │ │ │ │ └── index.html
│ │ │ │ ├── source.view/
│ │ │ │ │ └── index.html
│ │ │ │ └── task.md
│ │ │ ├── 6-width-vs-clientwidth/
│ │ │ │ ├── solution.md
│ │ │ │ └── task.md
│ │ │ ├── article.md
│ │ │ ├── cssWidthScroll.view/
│ │ │ │ └── index.html
│ │ │ └── metric.view/
│ │ │ └── index.html
│ │ ├── 10-size-and-scroll-window/
│ │ │ └── article.md
│ │ ├── 11-coordinates/
│ │ │ ├── 1-find-point-coordinates/
│ │ │ │ ├── solution.md
│ │ │ │ ├── solution.view/
│ │ │ │ │ ├── index.css
│ │ │ │ │ └── index.html
│ │ │ │ ├── source.view/
│ │ │ │ │ ├── index.css
│ │ │ │ │ └── index.html
│ │ │ │ └── task.md
│ │ │ ├── 2-position-at/
│ │ │ │ ├── solution.md
│ │ │ │ ├── solution.view/
│ │ │ │ │ ├── index.css
│ │ │ │ │ └── index.html
│ │ │ │ ├── source.view/
│ │ │ │ │ ├── index.css
│ │ │ │ │ └── index.html
│ │ │ │ └── task.md
│ │ │ ├── 3-position-at-absolute/
│ │ │ │ ├── solution.md
│ │ │ │ ├── solution.view/
│ │ │ │ │ ├── index.css
│ │ │ │ │ └── index.html
│ │ │ │ └── task.md
│ │ │ ├── 4-position-inside-absolute/
│ │ │ │ ├── solution.md
│ │ │ │ ├── solution.view/
│ │ │ │ │ ├── index.css
│ │ │ │ │ └── index.html
│ │ │ │ └── task.md
│ │ │ ├── article.md
│ │ │ └── head.html
│ │ └── index.md
│ ├── 2-events/
│ │ ├── 01-introduction-browser-events/
│ │ │ ├── 01-hide-other/
│ │ │ │ ├── solution.md
│ │ │ │ ├── solution.view/
│ │ │ │ │ └── index.html
│ │ │ │ ├── source.view/
│ │ │ │ │ └── index.html
│ │ │ │ └── task.md
│ │ │ ├── 02-hide-self-onclick/
│ │ │ │ ├── solution.md
│ │ │ │ └── task.md
│ │ │ ├── 03-which-handlers-run/
│ │ │ │ ├── solution.md
│ │ │ │ └── task.md
│ │ │ ├── 04-move-ball-field/
│ │ │ │ ├── solution.md
│ │ │ │ ├── solution.view/
│ │ │ │ │ └── index.html
│ │ │ │ ├── source.view/
│ │ │ │ │ └── index.html
│ │ │ │ └── task.md
│ │ │ ├── 05-sliding-menu/
│ │ │ │ ├── solution.md
│ │ │ │ ├── solution.view/
│ │ │ │ │ └── index.html
│ │ │ │ ├── source.view/
│ │ │ │ │ └── index.html
│ │ │ │ └── task.md
│ │ │ ├── 06-hide-message/
│ │ │ │ ├── solution.md
│ │ │ │ ├── solution.view/
│ │ │ │ │ ├── index.html
│ │ │ │ │ └── messages.css
│ │ │ │ ├── source.view/
│ │ │ │ │ ├── index.html
│ │ │ │ │ └── messages.css
│ │ │ │ └── task.md
│ │ │ ├── 07-carousel/
│ │ │ │ ├── solution.md
│ │ │ │ ├── solution.view/
│ │ │ │ │ ├── index.html
│ │ │ │ │ └── style.css
│ │ │ │ ├── source.view/
│ │ │ │ │ ├── index.html
│ │ │ │ │ └── style.css
│ │ │ │ └── task.md
│ │ │ ├── article.md
│ │ │ └── head.html
│ │ ├── 02-bubbling-and-capturing/
│ │ │ ├── article.md
│ │ │ ├── both.view/
│ │ │ │ ├── example.css
│ │ │ │ ├── index.html
│ │ │ │ └── script.js
│ │ │ ├── bubble-target.view/
│ │ │ │ ├── example.css
│ │ │ │ ├── index.html
│ │ │ │ └── script.js
│ │ │ └── capture.view/
│ │ │ ├── example.css
│ │ │ ├── index.html
│ │ │ └── script.js
│ │ ├── 03-event-delegation/
│ │ │ ├── 1-hide-message-delegate/
│ │ │ │ ├── solution.md
│ │ │ │ ├── solution.view/
│ │ │ │ │ ├── index.html
│ │ │ │ │ └── messages.css
│ │ │ │ ├── source.view/
│ │ │ │ │ ├── index.html
│ │ │ │ │ └── messages.css
│ │ │ │ └── task.md
│ │ │ ├── 2-sliding-tree/
│ │ │ │ ├── solution.md
│ │ │ │ ├── solution.view/
│ │ │ │ │ └── index.html
│ │ │ │ ├── source.view/
│ │ │ │ │ └── index.html
│ │ │ │ └── task.md
│ │ │ ├── 3-sortable-table/
│ │ │ │ ├── solution.md
│ │ │ │ ├── solution.view/
│ │ │ │ │ └── index.html
│ │ │ │ ├── source.view/
│ │ │ │ │ └── index.html
│ │ │ │ └── task.md
│ │ │ ├── 4-behavior-tooltip/
│ │ │ │ ├── solution.md
│ │ │ │ ├── solution.view/
│ │ │ │ │ └── index.html
│ │ │ │ ├── source.view/
│ │ │ │ │ └── index.html
│ │ │ │ └── task.md
│ │ │ ├── article.md
│ │ │ └── bagua.view/
│ │ │ ├── bagua.css
│ │ │ └── index.html
│ │ ├── 04-default-browser-action/
│ │ │ ├── 1-why-return-false-fails/
│ │ │ │ ├── solution.md
│ │ │ │ └── task.md
│ │ │ ├── 2-catch-link-navigation/
│ │ │ │ ├── solution.md
│ │ │ │ ├── solution.view/
│ │ │ │ │ └── index.html
│ │ │ │ ├── source.view/
│ │ │ │ │ └── index.html
│ │ │ │ └── task.md
│ │ │ ├── 3-image-gallery/
│ │ │ │ ├── solution.md
│ │ │ │ ├── solution.view/
│ │ │ │ │ ├── gallery.css
│ │ │ │ │ └── index.html
│ │ │ │ ├── source.view/
│ │ │ │ │ ├── gallery.css
│ │ │ │ │ └── index.html
│ │ │ │ └── task.md
│ │ │ ├── article.md
│ │ │ └── menu.view/
│ │ │ ├── index.html
│ │ │ ├── menu.css
│ │ │ └── menu.js
│ │ ├── 05-dispatch-events/
│ │ │ └── article.md
│ │ └── index.md
│ ├── 3-event-details/
│ │ ├── 1-mouse-events-basics/
│ │ │ ├── 01-selectable-list/
│ │ │ │ ├── solution.md
│ │ │ │ ├── solution.view/
│ │ │ │ │ └── index.html
│ │ │ │ ├── source.view/
│ │ │ │ │ └── index.html
│ │ │ │ └── task.md
│ │ │ ├── article.md
│ │ │ └── head.html
│ │ ├── 3-mousemove-mouseover-mouseout-mouseenter-mouseleave/
│ │ │ ├── 1-behavior-nested-tooltip/
│ │ │ │ ├── solution.md
│ │ │ │ ├── solution.view/
│ │ │ │ │ └── index.html
│ │ │ │ ├── source.view/
│ │ │ │ │ └── index.html
│ │ │ │ └── task.md
│ │ │ ├── 2-hoverintent/
│ │ │ │ ├── solution.md
│ │ │ │ ├── solution.view/
│ │ │ │ │ ├── hoverIntent.js
│ │ │ │ │ ├── index.html
│ │ │ │ │ ├── style.css
│ │ │ │ │ └── test.js
│ │ │ │ ├── source.view/
│ │ │ │ │ ├── hoverIntent.js
│ │ │ │ │ ├── index.html
│ │ │ │ │ ├── style.css
│ │ │ │ │ └── test.js
│ │ │ │ └── task.md
│ │ │ ├── article.md
│ │ │ ├── mouseenter-mouseleave-delegation-2.view/
│ │ │ │ ├── index.html
│ │ │ │ ├── script.js
│ │ │ │ └── style.css
│ │ │ ├── mouseenter-mouseleave-delegation.view/
│ │ │ │ ├── index.html
│ │ │ │ ├── script.js
│ │ │ │ └── style.css
│ │ │ ├── mouseleave-table.view/
│ │ │ │ ├── index.html
│ │ │ │ ├── script.js
│ │ │ │ └── style.css
│ │ │ ├── mouseleave.view/
│ │ │ │ ├── index.html
│ │ │ │ ├── script.js
│ │ │ │ └── style.css
│ │ │ ├── mouseoverout-child.view/
│ │ │ │ ├── index.html
│ │ │ │ ├── script.js
│ │ │ │ └── style.css
│ │ │ ├── mouseoverout-fast.view/
│ │ │ │ ├── index.html
│ │ │ │ ├── script.js
│ │ │ │ └── style.css
│ │ │ └── mouseoverout.view/
│ │ │ ├── index.html
│ │ │ ├── script.js
│ │ │ └── style.css
│ │ ├── 4-mouse-drag-and-drop/
│ │ │ ├── 1-slider/
│ │ │ │ ├── solution.md
│ │ │ │ ├── solution.view/
│ │ │ │ │ ├── index.html
│ │ │ │ │ └── style.css
│ │ │ │ ├── source.view/
│ │ │ │ │ ├── index.html
│ │ │ │ │ └── style.css
│ │ │ │ └── task.md
│ │ │ ├── 2-drag-heroes/
│ │ │ │ ├── solution.md
│ │ │ │ ├── solution.view/
│ │ │ │ │ ├── index.html
│ │ │ │ │ ├── soccer.css
│ │ │ │ │ └── soccer.js
│ │ │ │ ├── source.view/
│ │ │ │ │ ├── index.html
│ │ │ │ │ ├── soccer.css
│ │ │ │ │ └── soccer.js
│ │ │ │ └── task.md
│ │ │ ├── article.md
│ │ │ ├── ball.view/
│ │ │ │ └── index.html
│ │ │ ├── ball2.view/
│ │ │ │ └── index.html
│ │ │ ├── ball3.view/
│ │ │ │ └── index.html
│ │ │ └── ball4.view/
│ │ │ ├── index.html
│ │ │ └── style.css
│ │ ├── 6-pointer-events/
│ │ │ ├── article.md
│ │ │ ├── ball-2.view/
│ │ │ │ └── index.html
│ │ │ ├── ball.view/
│ │ │ │ └── index.html
│ │ │ ├── multitouch.view/
│ │ │ │ └── index.html
│ │ │ ├── slider-html.view/
│ │ │ │ ├── index.html
│ │ │ │ └── style.css
│ │ │ └── slider.view/
│ │ │ ├── index.html
│ │ │ └── style.css
│ │ ├── 7-keyboard-events/
│ │ │ ├── 2-check-sync-keydown/
│ │ │ │ ├── solution.md
│ │ │ │ ├── solution.view/
│ │ │ │ │ └── index.html
│ │ │ │ └── task.md
│ │ │ ├── article.md
│ │ │ └── keyboard-dump.view/
│ │ │ ├── index.html
│ │ │ ├── script.js
│ │ │ └── style.css
│ │ ├── 8-onscroll/
│ │ │ ├── 1-endless-page/
│ │ │ │ ├── solution.md
│ │ │ │ ├── solution.view/
│ │ │ │ │ └── index.html
│ │ │ │ ├── source.view/
│ │ │ │ │ └── index.html
│ │ │ │ └── task.md
│ │ │ ├── 2-updown-button/
│ │ │ │ ├── solution.md
│ │ │ │ ├── solution.view/
│ │ │ │ │ └── index.html
│ │ │ │ ├── source.view/
│ │ │ │ │ └── index.html
│ │ │ │ └── task.md
│ │ │ ├── 3-load-visible-img/
│ │ │ │ ├── solution.md
│ │ │ │ ├── solution.view/
│ │ │ │ │ └── index.html
│ │ │ │ ├── source.view/
│ │ │ │ │ └── index.html
│ │ │ │ └── task.md
│ │ │ └── article.md
│ │ └── index.md
│ ├── 4-forms-controls/
│ │ ├── 1-form-elements/
│ │ │ ├── 1-add-select-option/
│ │ │ │ ├── solution.md
│ │ │ │ └── task.md
│ │ │ └── article.md
│ │ ├── 2-focus-blur/
│ │ │ ├── 3-editable-div/
│ │ │ │ ├── solution.md
│ │ │ │ ├── solution.view/
│ │ │ │ │ ├── index.html
│ │ │ │ │ └── my.css
│ │ │ │ ├── source.view/
│ │ │ │ │ ├── index.html
│ │ │ │ │ └── my.css
│ │ │ │ └── task.md
│ │ │ ├── 4-edit-td-click/
│ │ │ │ ├── solution.md
│ │ │ │ ├── solution.view/
│ │ │ │ │ ├── bagua.css
│ │ │ │ │ ├── index.html
│ │ │ │ │ ├── my.css
│ │ │ │ │ └── script.js
│ │ │ │ ├── source.view/
│ │ │ │ │ ├── bagua.css
│ │ │ │ │ ├── index.html
│ │ │ │ │ ├── my.css
│ │ │ │ │ └── script.js
│ │ │ │ └── task.md
│ │ │ ├── 5-keyboard-mouse/
│ │ │ │ ├── solution.md
│ │ │ │ ├── solution.view/
│ │ │ │ │ └── index.html
│ │ │ │ ├── source.view/
│ │ │ │ │ └── index.html
│ │ │ │ └── task.md
│ │ │ └── article.md
│ │ ├── 3-events-change-input/
│ │ │ ├── 1-deposit-calculator/
│ │ │ │ ├── solution.md
│ │ │ │ ├── solution.view/
│ │ │ │ │ └── index.html
│ │ │ │ ├── source.view/
│ │ │ │ │ └── index.html
│ │ │ │ └── task.md
│ │ │ └── article.md
│ │ ├── 4-forms-submit/
│ │ │ ├── 1-modal-dialog/
│ │ │ │ ├── solution.md
│ │ │ │ ├── solution.view/
│ │ │ │ │ ├── index.html
│ │ │ │ │ └── style.css
│ │ │ │ ├── source.view/
│ │ │ │ │ ├── index.html
│ │ │ │ │ └── style.css
│ │ │ │ └── task.md
│ │ │ └── article.md
│ │ └── index.md
│ ├── 5-loading/
│ │ ├── 01-onload-ondomcontentloaded/
│ │ │ ├── article.md
│ │ │ ├── readystate.view/
│ │ │ │ ├── iframe.html
│ │ │ │ └── index.html
│ │ │ └── window-onbeforeunload.view/
│ │ │ └── index.html
│ │ ├── 02-script-async-defer/
│ │ │ ├── article.md
│ │ │ ├── long.js
│ │ │ └── small.js
│ │ ├── 03-onload-onerror/
│ │ │ ├── 1-load-img-callback/
│ │ │ │ ├── solution.md
│ │ │ │ ├── solution.view/
│ │ │ │ │ └── index.html
│ │ │ │ ├── source.view/
│ │ │ │ │ └── index.html
│ │ │ │ └── task.md
│ │ │ ├── article.md
│ │ │ └── crossorigin.view/
│ │ │ └── error.js
│ │ └── index.md
│ ├── 99-ui-misc/
│ │ ├── 01-mutation-observer/
│ │ │ └── article.md
│ │ ├── 02-selection-range/
│ │ │ └── article.md
│ │ ├── 03-event-loop/
│ │ │ ├── 2-micro-macro-queue/
│ │ │ │ ├── solution.md
│ │ │ │ └── task.md
│ │ │ └── article.md
│ │ └── index.md
│ └── index.md
├── 3-frames-and-windows/
│ ├── 01-popup-windows/
│ │ └── article.md
│ ├── 03-cross-window-communication/
│ │ ├── article.md
│ │ ├── postmessage.view/
│ │ │ ├── iframe.html
│ │ │ └── index.html
│ │ └── sandbox.view/
│ │ ├── index.html
│ │ └── sandboxed.html
│ ├── 06-clickjacking/
│ │ ├── article.md
│ │ ├── clickjacking-visible.view/
│ │ │ ├── facebook.html
│ │ │ └── index.html
│ │ ├── clickjacking.view/
│ │ │ ├── facebook.html
│ │ │ └── index.html
│ │ ├── protector.view/
│ │ │ ├── iframe.html
│ │ │ └── index.html
│ │ └── top-location.view/
│ │ ├── iframe.html
│ │ └── index.html
│ └── index.md
├── 4-binary/
│ ├── 01-arraybuffer-binary-arrays/
│ │ ├── 01-concat/
│ │ │ ├── _js.view/
│ │ │ │ ├── solution.js
│ │ │ │ ├── source.js
│ │ │ │ └── test.js
│ │ │ ├── solution.md
│ │ │ └── task.md
│ │ └── article.md
│ ├── 02-text-decoder/
│ │ └── article.md
│ ├── 03-blob/
│ │ └── article.md
│ ├── 04-file/
│ │ └── article.md
│ └── index.md
├── 5-network/
│ ├── 01-fetch/
│ │ ├── 01-fetch-users/
│ │ │ ├── _js.view/
│ │ │ │ ├── solution.js
│ │ │ │ ├── source.js
│ │ │ │ └── test.js
│ │ │ ├── solution.md
│ │ │ └── task.md
│ │ ├── article.md
│ │ └── post.view/
│ │ └── server.js
│ ├── 02-formdata/
│ │ ├── article.md
│ │ └── post.view/
│ │ └── server.js
│ ├── 03-fetch-progress/
│ │ ├── article.md
│ │ └── progress.view/
│ │ ├── index.html
│ │ └── long.txt
│ ├── 04-fetch-abort/
│ │ ├── article.md
│ │ └── demo.view/
│ │ └── server.js
│ ├── 05-fetch-crossorigin/
│ │ ├── 1-do-we-need-origin/
│ │ │ ├── solution.md
│ │ │ └── task.md
│ │ └── article.md
│ ├── 06-fetch-api/
│ │ ├── article.md
│ │ └── post.view/
│ │ ├── index.html
│ │ └── server.js
│ ├── 07-url/
│ │ └── article.md
│ ├── 08-xmlhttprequest/
│ │ ├── article.md
│ │ ├── example.view/
│ │ │ ├── index.html
│ │ │ └── server.js
│ │ ├── hello.txt
│ │ ├── phones-async.view/
│ │ │ ├── index.html
│ │ │ ├── phones.json
│ │ │ └── server.js
│ │ ├── phones.json
│ │ ├── phones.view/
│ │ │ ├── index.html
│ │ │ ├── phones.json
│ │ │ └── server.js
│ │ └── post.view/
│ │ ├── index.html
│ │ └── server.js
│ ├── 09-resume-upload/
│ │ ├── article.md
│ │ └── upload-resume.view/
│ │ ├── index.html
│ │ ├── server.js
│ │ └── uploader.js
│ ├── 10-long-polling/
│ │ ├── article.md
│ │ └── longpoll.view/
│ │ ├── browser.js
│ │ ├── index.html
│ │ └── server.js
│ ├── 11-websocket/
│ │ ├── article.md
│ │ ├── chat.view/
│ │ │ ├── index.html
│ │ │ └── server.js
│ │ └── demo.view/
│ │ └── server.js
│ ├── 12-server-sent-events/
│ │ ├── article.md
│ │ └── eventsource.view/
│ │ ├── index.html
│ │ └── server.js
│ └── index.md
├── 6-data-storage/
│ ├── 01-cookie/
│ │ ├── article.md
│ │ └── cookie.js
│ ├── 02-localstorage/
│ │ ├── 1-form-autosave/
│ │ │ ├── solution.md
│ │ │ ├── solution.view/
│ │ │ │ └── index.html
│ │ │ ├── source.view/
│ │ │ │ └── index.html
│ │ │ └── task.md
│ │ ├── article.md
│ │ └── sessionstorage.view/
│ │ ├── iframe.html
│ │ └── index.html
│ ├── 03-indexeddb/
│ │ ├── article.md
│ │ └── books.view/
│ │ └── index.html
│ └── index.md
├── 7-animation/
│ ├── 1-bezier-curve/
│ │ └── article.md
│ ├── 2-css-animations/
│ │ ├── 1-animate-logo-css/
│ │ │ ├── solution.md
│ │ │ ├── solution.view/
│ │ │ │ └── index.html
│ │ │ ├── source.view/
│ │ │ │ └── index.html
│ │ │ └── task.md
│ │ ├── 2-animate-logo-bezier-css/
│ │ │ ├── solution.md
│ │ │ ├── solution.view/
│ │ │ │ └── index.html
│ │ │ └── task.md
│ │ ├── 3-animate-circle/
│ │ │ ├── solution.md
│ │ │ ├── solution.view/
│ │ │ │ └── index.html
│ │ │ ├── source.view/
│ │ │ │ └── index.html
│ │ │ └── task.md
│ │ ├── 4-animate-circle-callback/
│ │ │ ├── solution.md
│ │ │ ├── solution.view/
│ │ │ │ └── index.html
│ │ │ └── task.md
│ │ ├── article.md
│ │ ├── boat.view/
│ │ │ ├── index.html
│ │ │ └── style.css
│ │ ├── digits-negative-delay.view/
│ │ │ ├── index.html
│ │ │ ├── script.js
│ │ │ └── style.css
│ │ ├── digits.view/
│ │ │ ├── index.html
│ │ │ ├── script.js
│ │ │ └── style.css
│ │ ├── step-end.view/
│ │ │ ├── index.html
│ │ │ └── style.css
│ │ ├── step-list.view/
│ │ │ ├── index.html
│ │ │ └── style.css
│ │ ├── step.view/
│ │ │ ├── index.html
│ │ │ └── style.css
│ │ ├── train-linear.view/
│ │ │ ├── index.html
│ │ │ └── style.css
│ │ ├── train-over.view/
│ │ │ ├── index.html
│ │ │ └── style.css
│ │ └── train.view/
│ │ ├── index.html
│ │ └── style.css
│ ├── 3-js-animation/
│ │ ├── 1-animate-ball/
│ │ │ ├── solution.md
│ │ │ ├── solution.view/
│ │ │ │ ├── index.html
│ │ │ │ └── style.css
│ │ │ ├── source.view/
│ │ │ │ ├── index.html
│ │ │ │ └── style.css
│ │ │ └── task.md
│ │ ├── 2-animate-ball-hops/
│ │ │ ├── solution.md
│ │ │ ├── solution.view/
│ │ │ │ ├── index.html
│ │ │ │ └── style.css
│ │ │ └── task.md
│ │ ├── article.md
│ │ ├── back.view/
│ │ │ ├── index.html
│ │ │ └── style.css
│ │ ├── bounce-easeinout.view/
│ │ │ ├── index.html
│ │ │ └── style.css
│ │ ├── bounce-easeout.view/
│ │ │ ├── index.html
│ │ │ └── style.css
│ │ ├── bounce.view/
│ │ │ ├── index.html
│ │ │ └── style.css
│ │ ├── circ.view/
│ │ │ ├── index.html
│ │ │ └── style.css
│ │ ├── elastic.view/
│ │ │ ├── index.html
│ │ │ └── style.css
│ │ ├── move-raf.view/
│ │ │ └── index.html
│ │ ├── move.view/
│ │ │ └── index.html
│ │ ├── quad.view/
│ │ │ ├── index.html
│ │ │ └── style.css
│ │ ├── quint.view/
│ │ │ ├── index.html
│ │ │ └── style.css
│ │ ├── text.view/
│ │ │ ├── index.html
│ │ │ └── style.css
│ │ └── width.view/
│ │ ├── animate.js
│ │ └── index.html
│ └── index.md
├── 8-web-components/
│ ├── 1-webcomponents-intro/
│ │ ├── .vs/
│ │ │ ├── 1-webcomponents-intro/
│ │ │ │ └── v15/
│ │ │ │ └── .suo
│ │ │ └── VSWorkspaceState.json
│ │ └── article.md
│ ├── 2-custom-elements/
│ │ ├── 1-live-timer/
│ │ │ ├── solution.md
│ │ │ ├── solution.view/
│ │ │ │ ├── index.html
│ │ │ │ ├── live-timer.js
│ │ │ │ └── time-formatted.js
│ │ │ ├── source.view/
│ │ │ │ ├── index.html
│ │ │ │ ├── live-timer.js
│ │ │ │ └── time-formatted.js
│ │ │ └── task.md
│ │ ├── article.md
│ │ └── head.html
│ ├── 3-shadow-dom/
│ │ └── article.md
│ ├── 4-template-element/
│ │ └── article.md
│ ├── 5-slots-composition/
│ │ ├── article.md
│ │ └── menu.view/
│ │ └── index.html
│ ├── 6-shadow-dom-style/
│ │ └── article.md
│ ├── 7-shadow-dom-events/
│ │ └── article.md
│ └── index.md
├── 9-regular-expressions/
│ ├── 01-regexp-introduction/
│ │ └── article.md
│ ├── 02-regexp-character-classes/
│ │ └── article.md
│ ├── 03-regexp-unicode/
│ │ └── article.md
│ ├── 04-regexp-anchors/
│ │ ├── 1-start-end/
│ │ │ ├── solution.md
│ │ │ └── task.md
│ │ └── article.md
│ ├── 05-regexp-multiline-mode/
│ │ └── article.md
│ ├── 06-regexp-boundary/
│ │ ├── 1-find-time-hh-mm/
│ │ │ ├── solution.md
│ │ │ └── task.md
│ │ └── article.md
│ ├── 07-regexp-escaping/
│ │ └── article.md
│ ├── 08-regexp-character-sets-and-ranges/
│ │ ├── 1-find-range-1/
│ │ │ ├── solution.md
│ │ │ └── task.md
│ │ ├── 2-find-time-2-formats/
│ │ │ ├── solution.md
│ │ │ └── task.md
│ │ └── article.md
│ ├── 09-regexp-quantifiers/
│ │ ├── 1-find-text-manydots/
│ │ │ ├── solution.md
│ │ │ └── task.md
│ │ ├── 2-find-html-colors-6hex/
│ │ │ ├── solution.md
│ │ │ └── task.md
│ │ └── article.md
│ ├── 10-regexp-greedy-and-lazy/
│ │ ├── 1-lazy-greedy/
│ │ │ ├── solution.md
│ │ │ └── task.md
│ │ ├── 3-find-html-comments/
│ │ │ ├── solution.md
│ │ │ └── task.md
│ │ ├── 4-find-html-tags-greedy-lazy/
│ │ │ ├── solution.md
│ │ │ └── task.md
│ │ └── article.md
│ ├── 11-regexp-groups/
│ │ ├── 01-test-mac/
│ │ │ ├── solution.md
│ │ │ └── task.md
│ │ ├── 02-find-webcolor-3-or-6/
│ │ │ ├── solution.md
│ │ │ └── task.md
│ │ ├── 03-find-decimal-numbers/
│ │ │ ├── solution.md
│ │ │ └── task.md
│ │ ├── 04-parse-expression/
│ │ │ ├── solution.md
│ │ │ └── task.md
│ │ └── article.md
│ ├── 12-regexp-backreferences/
│ │ └── article.md
│ ├── 13-regexp-alternation/
│ │ ├── 01-find-programming-language/
│ │ │ ├── solution.md
│ │ │ └── task.md
│ │ ├── 02-find-matching-bbtags/
│ │ │ ├── solution.md
│ │ │ └── task.md
│ │ ├── 03-match-quoted-string/
│ │ │ ├── solution.md
│ │ │ └── task.md
│ │ ├── 04-match-exact-tag/
│ │ │ ├── solution.md
│ │ │ └── task.md
│ │ └── article.md
│ ├── 14-regexp-lookahead-lookbehind/
│ │ ├── 1-find-non-negative-integers/
│ │ │ ├── solution.md
│ │ │ └── task.md
│ │ ├── 2-insert-after-head/
│ │ │ ├── solution.md
│ │ │ └── task.md
│ │ └── article.md
│ ├── 15-regexp-catastrophic-backtracking/
│ │ └── article.md
│ ├── 16-regexp-sticky/
│ │ └── article.md
│ ├── 17-regexp-methods/
│ │ └── article.md
│ └── index.md
├── AUTHORING.md
├── LICENSE.md
├── README.md
├── changes.sketch
├── css.md
├── figures.sketch
├── property-accessors.md
├── script/
│ └── clean-unused-png.php
└── todo.md
================================================
FILE CONTENTS
================================================
================================================
FILE: .gitattributes
================================================
* text=auto eol=lf
*.svg binary
================================================
FILE: .gitignore
================================================
*.diff
*.err
*.orig
*.log
*.rej
*.swo
*.swp
*.vi
*~
*.sass-cache
# OS or Editor folders
.DS_Store
.idea
.cache
.project
.settings
.tmproj
.nvmrc
sftp-config.json
Thumbs.db
tags
/svgs
================================================
FILE: 1-js/01-getting-started/1-intro/article.md
================================================
# Une Introduction à JavaScript
Voyons ce qui est spécial à propos de JavaScript, ce qu'il nous permet de faire et avec quelles autres technologies il s'accorde bien.
## Qu'est-ce que JavaScript ?
_JavaScript_ a été initialement créé pour "rendre les pages web vivantes".
Les programmes dans ce langage sont appelés _scripts_. Ils peuvent être écrits directement dans une page HTML et exécutés automatiquement au chargement des pages.
Les scripts sont fournis et exécutés en texte brut. Ils n'ont pas besoin d'une préparation spéciale ou d'une compilation pour fonctionner.
De par cet aspect, JavaScript est très différent d'un autre langage appelé [Java]().
```smart header="Pourquoi est-il appelé JavaScript ?"
Quand JavaScript a été créé, il portait initialement un autre nom : "LiveScript". Mais à cette époque le langage Java était très populaire, il a donc été décidé que positionner un nouveau langage en tant que "petit frère" de Java pourrait aider.
Mais au fur et à mesure de son évolution, JavaScript est devenu un langage totalement indépendant, avec ses propres spécifications appelées [ECMAScript](https://fr.wikipedia.org/wiki/ECMAScript), aujourd'hui il n'a aucun rapport avec Java.
```
Aujourd'hui, JavaScript peut s'exécuter non seulement dans le navigateur, mais également sur un serveur, ou encore sur n'importe quel appareil dans lequel existe un programme appelé [le moteur JavaScript](https://fr.wikipedia.org/wiki/Moteur_JavaScript).
Le navigateur a un moteur intégré, parfois il peut être également appelé "la machine virtuelle JavaScript".
Différents moteurs ont différents "nom de code", par exemple :
- [V8]() -- dans Chrome et Opera.
- [SpiderMonkey](https://fr.wikipedia.org/wiki/SpiderMonkey) -- dans Firefox.
- … Il existe d'autres noms de code comme "Chakra" pour IE, "JavaScriptCore", "Nitro" et "SquirrelFish" pour Safari etc.
Les termes ci-dessus sont bons à retenir, car ils sont utilisés dans les articles destinés aux développeurs sur Internet. Nous les utiliserons aussi. Par exemple, si "une fonctionnalité X est prise en charge par V8", cela fonctionne probablement dans Chrome, Edge et Opera.
```smart header="Comment fonctionnent les moteurs ?"
Les moteurs sont compliqués. Mais le fonctionnement de base est facile à comprendre.
1. Le moteur (intégré si c’est un navigateur) lit ("analyse") le script.
2. Ensuite, il convertit ("compile") le script en langage machine.
3. Enfin le code machine s'exécute, très rapidement.
Le moteur applique des optimisations à chaque étape du processus. Il surveille même le script compilé en cours d'exécution, analyse les données qui le traversent et applique des optimisations au code machine en fonction de ces informations.
```
## Que peut faire JavaScript dans le navigateur ?
Le JavaScript moderne est un langage de programmation "sûr". Il ne fournit pas d'accès de bas niveau à la mémoire ou au processeur, parce qu'il a été initialement conçu pour les navigateurs qui n'en ont pas besoin.
Les fonctionnalités dépendent grandement de l'environnement qui exécute JavaScript. Par exemple, [Node.js](https://fr.wikipedia.org/wiki/Node.js) prend en charge les fonctions qui permettent à JavaScript de lire / écrire des fichiers arbitrairement, d'exécuter des requêtes réseau, etc.
JavaScript intégré au navigateur peut faire tout ce qui concerne la manipulation des pages Web, l'interaction avec l'utilisateur et le serveur Web.
Par exemple, JavaScript dans le navigateur est capable de :
- Ajouter un nouveau code HTML à la page, modifier le contenu existant, modifier les styles.
- Réagir aux actions de l'utilisateur, s'exécuter sur des clics de souris, des mouvements de pointeur, des appuis sur des touches.
- Envoyer des requêtes sur le réseau à des serveurs distants, télécharger et envoyer des fichiers (technologies [AJAX]() et [COMET]()).
- Obtenir et définir des cookies, poser des questions au visiteur, afficher des messages.
- Se souvenir des données du côté client ("stockage local").
## Qu'est-ce que JavaScript ne peut pas faire dans le navigateur ?
Les capacités de JavaScript dans le navigateur sont limitées pour la sécurité de l'utilisateur. L'objectif est d'empêcher une page Web malveillante d'accéder à des informations privées ou de nuire aux données de l'utilisateur.
Les exemples de telles restrictions sont :
- JavaScript sur une page Web ne peut pas lire/écrire des fichiers arbitrairement sur le disque dur, les copier ou exécuter des programmes. Il n'a pas d'accès direct aux fonctions du système d'exploitation.
Les navigateurs modernes lui permettent de fonctionner avec des fichiers, mais l'accès est limité et n'est fourni que si l'utilisateur effectue certaines actions, comme «déposer» un fichier dans une fenêtre de navigateur ou le sélectionner via une balise ``.
Il existe des moyens d’interagir avec une webcam/microphone et d’autres périphériques, mais ils nécessitent une autorisation explicite de l’utilisateur. Ainsi, une page contenant du JavaScript ne permet pas d'activer une caméra Web, d'observer l'environnement et d'envoyer les informations à la [NSA](https://fr.wikipedia.org/wiki/National_Security_Agency).
- Différents onglets / fenêtres ne se connaissent généralement pas. Parfois, ils se croisent, par exemple lorsqu'une fenêtre utilise JavaScript pour ouvrir l'autre. Mais même dans ce cas, le JavaScript d'une page ne peut pas accéder à l'autre si elle provient de sites différents (provenant d'un autre domaine, protocole ou port).
C'est ce qu'on appelle la "politique de même origine" (“Same Origin Policy”). Pour contourner cette sécurité, _les deux pages_ doivent se mettre d'accord et contenir un code JavaScript spécial qui gère l'échange de données. Nous verrons cela plus loin dans ce tutoriel.
Cette limitation concerne également la sécurité de l'utilisateur. Une page de `http://autresite.com` qu'un utilisateur a ouvert ne doit pas pouvoir accéder à un autre onglet du navigateur avec l'URL `http://gmail.com` et y voler des informations.
- JavaScript peut facilement communiquer sur le net avec le serveur d'où provient la page. Mais sa capacité à recevoir des données d'autres sites / domaines est paralysée. Bien que possible, il nécessite un accord explicite (exprimé dans les en-têtes HTTP) du côté distant. Encore une fois, ce sont des limites de sécurité.

De telles limites n'existent pas si JavaScript est utilisé en dehors du navigateur, par exemple sur un serveur. Les navigateurs modernes permettent également l’installation de plug-ins / extensions susceptibles d’obtenir des autorisations étendues.
## Qu'est-ce qui rend JavaScript unique ?
Il y a au moins trois bonnes choses à propos de JavaScript :
```compare
+ Intégration complète avec HTML / CSS.
+ Les choses simples sont faites simplement.
+ Pris en charge par tous les principaux navigateurs et activé par défaut.
```
JavaScript est la seule technologie de navigateur qui combine ces trois éléments.
C’est ce qui rend JavaScript unique. C’est pourquoi il l’outil le plus répandu pour créer des interfaces de navigateur.
Cela dit, JavaScript permet également de créer des serveurs, des applications mobiles, etc.
## Les langages "par dessus" JavaScript
La syntaxe de JavaScript ne convient pas aux besoins de tous. Différentes personnes veulent des fonctionnalités différentes.
Il faut s’y attendre, parce que besoins sont différents pour tous.
Donc, récemment, une pléthore de nouveaux langages sont apparus, qui sont _transpilés_ (convertis) en JavaScript avant leur exécution dans le navigateur.
Les outils modernes rendent la [transpilation](https://fr.wiktionary.org/wiki/transpilation) très rapide et transparente, permettant aux développeurs de coder dans un autre langage et de le convertir automatiquement "sous le capot".
Les exemples de ce genre de langages :
- [CoffeeScript](http://coffeescript.org/) est un "sucre syntaxique" pour JavaScript, il introduit une syntaxe plus courte, permettant d’écrire du code plus précis et plus clair. Habituellement, les développeurs Ruby l'aiment bien.
- [TypeScript](http://www.typescriptlang.org/) se concentre sur l'ajout de "typage strict des données" pour simplifier le développement et la prise en charge de systèmes complexes. Il est développé par Microsoft.
- [Flow](http://flow.org/) ajoute également la saisie de données, mais de manière différente. Développé par Facebook.
- [Dart](https://www.dartlang.org/) est un langage autonome doté de son propre moteur qui s'exécute dans des environnements autres que les navigateurs (comme les applications mobiles), mais peut aussi être transpilé en JavaScript. Développé par Google.
- [Brython](https://brython.info/) est un transpiler (ou transpileur en bon français) Python vers JavaScript qui permet d'écrire des applications en Python pur sans JavaScript.
- [Kotlin](https://kotlinlang.org/docs/reference/js-overview.html) est un langage de programmation moderne, concis et sûr qui peut cibler le navigateur ou Node.js
Il en existe évidemment bien plus, cela dit, même si nous utilisons un de ces langages transpilés, nous devrions également connaître le langage JavaScript, pour bien comprendre ce que nous faisons.
## Résumé
- JavaScript a été initialement créé en tant que langage de navigateur uniquement, mais il est désormais également utilisé dans de nombreux autres environnements.
- En ce moment, JavaScript occupe une position unique en tant que langage de navigateur le plus largement adopté avec une intégration complète avec HTML/CSS.
- De nombreux langages sont _transpilés_ en JavaScript et fournissent certaines fonctionnalités. Il est recommandé d'y jeter un coup d'œil, au moins brièvement, après avoir maîtrisé JavaScript.
================================================
FILE: 1-js/01-getting-started/2-manuals-specifications/article.md
================================================
# Manuels et spécifications
Ce livre est un *tutoriel*. Il vise à vous aider à apprendre progressivement le langage. Mais une fois que vous maîtriserez les bases, vous aurez besoin d’autres ressources.
## Spécification
[The ECMA-262 specification](https://www.ecma-international.org/publications/standards/Ecma-262.htm) contient les informations les plus détaillées et formalisées sur JavaScript. C'est elle qui définit le langage.
Une nouvelle version de la spécification est publiée chaque année. La dernière version en cours est disponible à cette adresse : .
Pour en savoir plus sur les fonctionnalités à venir, y compris celles qui sont "presque standards" (appelées aussi "stage 3"), vous pouvez consulter les propositions à cette adresse : .
De plus, si vous développez pour le navigateur, d'autres spécifications sont couvertes dans la [seconde partie](info:browser-environment) du tutoriel.
## Manuels
- **La référence MDN (Mozilla) JavaScript** est le principal manuel avec des exemples et d’autres informations. C’est une excellente source pour obtenir des informations détaillées sur les fonctions linguistiques, les méthodes, etc.
On peut la trouver à cette adresse : .
Cependant, il est souvent préférable d’utiliser une recherche sur Internet. Utilisez simplement "MDN [terme]" dans la requête, par exemple pour rechercher la fonction `parseInt`.
## Tableaux de compatibilité
JavaScript est un langage en développement, de nouvelles fonctionnalités sont ajoutées régulièrement.
Pour voir si elles sont supportées dans les moteurs, au sein des navigateurs et autres, voir :
- - tables de prise en charge par fonctionnalité, par exemple pour voir quels moteurs supportent les fonctions de cryptographie modernes : .
- - un tableau avec les fonctionnalités linguistiques et les moteurs qui les prennent en charge ou non.
Toutes ces ressources sont utiles dans le quotidien des développeurs, parce qu'elles contiennent des informations précieuses sur les fonctionnalités du langage, leur support, etc.
Veuillez vous en souvenir (ou de cette page) pour les cas où vous avez besoin d'informations détaillées sur une fonctionnalité particulière.
================================================
FILE: 1-js/01-getting-started/3-code-editors/article.md
================================================
# Les éditeurs de code
Un éditeur de code est l'endroit où les programmeurs passent la plus grande partie de leur temps.
Il existe deux archétypes: IDE et les éditeurs légers. Beaucoup de personnes se sentent à l'aise pour choisir un outil de chaque type.
## IDE
Le terme [IDE](https://fr.wikipedia.org/wiki/Environnement_de_développement) (Integrated Development Environment) signifie un éditeur puissant avec de nombreuses fonctionnalités qui fonctionne généralement sur un "projet entier". Comme son nom l’indique, ce n’est pas seulement un éditeur, mais un environnement de développement complet.
Un IDE charge le projet (peut contenir de nombreux fichiers), permet la navigation entre les fichiers, fournit une auto-complétion basée sur l'ensemble du projet (pas seulement le fichier ouvert), s'intègre à un système de gestion de version (comme [git](https://git-scm.com/)), un environnement de test et d’autres éléments au niveau du projet.
Si vous n'avez pas encore pensé à sélectionner un IDE, examinez les variantes suivantes :
- [Visual Studio Code](https://code.visualstudio.com/) (cross-platform, free).
- [WebStorm](https://www.jetbrains.com/webstorm/) (cross-platform, payant).
Pour Windows, il existe également "Visual Studio", à ne pas confondre avec "Visual Studio Code ". "Visual Studio" est un IDE payant et puissant, disponible sur Windows et Mac, bien adapté à la plate-forme .NET. C’est aussi bon en JavaScript. Il y a aussi une version gratuite [Visual Studio Community](https://www.visualstudio.com/vs/community/).
La plupart des IDE sont payants, mais ont une période d'essai. Leur coût est généralement négligeable par rapport au salaire d’un développeur qualifié, alors choisissez le meilleur pour vous.
## Les éditeurs légers
"Les éditeurs légers" ne sont pas aussi puissants que les IDE, mais ils sont rapides, élégants et simples.
Ils sont principalement utilisés pour ouvrir et éditer instantanément un fichier.
La principale différence entre un "éditeur léger" et un "IDE" réside dans le fait qu’un environnement de développement intégré fonctionne au niveau du projet. Il charge donc beaucoup plus de données au démarrage, analyse la structure du projet si nécessaire, etc. Un éditeur léger est beaucoup plus rapide si nous avons besoin d'un seul fichier.
En pratique, les éditeurs légers peuvent avoir beaucoup de plug-ins, y compris des analyseurs de syntaxe au niveau des répertoires et des autocompléteurs. Il n’y a donc pas de frontière stricte entre un éditeur léger et un IDE.
Il existe de nombreuses options, par exemple :
- [Sublime Text](http://www.sublimetext.com) (multiplateforme, payant).
- [Notepad++](https://notepad-plus-plus.org/) (Windows, gratuit).
- [Vim](https://www.vim.org/) et [Emacs](https://www.gnu.org/software/emacs/) sont également cool, si vous savez comment les utiliser.
## Ne discutons pas
Les éditeurs des listes ci-dessus sont ceux que moi-même ou mes amis, que je considère comme de bons développeurs, utilisent depuis longtemps et en sont satisfaits.
Il y a d'autres grands éditeurs dans notre vaste monde. Veuillez choisir celui que vous aimez le plus.
Le choix d'un éditeur, comme tout autre outil, est individuel et dépend de vos projets, de vos habitudes, de vos préférences personnelles.
L'avis personnel de l'auteur :
- J'utilise [Visual Studio Code](https://code.visualstudio.com/) si je développe principalement du frontend.
- Sinon, s'il s'agit principalement d'un autre langage/plate-forme et partiellement d'un frontend, envisagez d'autres éditeurs, tels que XCode (Mac), Visual Studio (Windows) ou la famille Jetbrains (Webstorm, PHPStorm, RubyMine, etc., selon le langage).
================================================
FILE: 1-js/01-getting-started/4-devtools/article.md
================================================
# La console de développement
Le code est sujet aux erreurs. Vous êtes susceptible de faire des erreurs … Oh, de quoi je parle ? Vous allez absolument faire des erreurs, du moins si vous êtes un humain, pas un [robot](https://fr.wikipedia.org/wiki/Bender_Tordeur_Rodr%C3%ADguez).
Mais dans le navigateur, un utilisateur ne voit pas les erreurs par défaut. Ainsi, si quelque chose ne va pas dans le script, nous ne verrons pas ce qui ne va pas et nous ne pourrons pas le réparer.
Pour voir les erreurs et obtenir beaucoup d’informations utiles sur les scripts, les navigateurs intègrent des "outils de développement".
Le plus souvent, les développeurs se tournent vers Chrome ou Firefox pour le développement, car ces navigateurs disposent des meilleurs outils de développement. D'autres navigateurs fournissent également des outils de développement, parfois dotés de fonctions spéciales, mais jouent généralement le rôle de "rattrapage" pour Chrome ou Firefox. Donc, la plupart des gens ont un navigateur "favori" et passent à d'autres si un problème est spécifique au navigateur.
Les outils de développement sont très puissants ; ils possèdent de nombreuses fonctionnalités. Pour commencer, nous allons apprendre à les ouvrir, à examiner les erreurs et à exécuter des commandes JavaScript.
## Google Chrome
Ouvrez la page [bug.html](bug.html).
Il y a une erreur dans le code JavaScript. Elle est invisible à un visiteur habituel, alors ouvrons les outils de développement pour la voir.
Appuyez sur `key:F12` ou, si vous êtes sur Mac, utilisez la combinaison `key:Cmd+Opt+J`.
Les outils de développement s'ouvriront sous l'onglet Console par défaut.
Cela ressemble un peu à ceci :

L'aspect exact des outils de développement dépend de votre version de Chrome. Cela change de temps en temps, mais devrait être similaire.
- Ici, nous pouvons voir le message d'erreur de couleur rouge. Dans ce cas, le script contient une commande "lalala" inconnue.
- Sur la droite, il y a un lien cliquable vers le code source bug.html:12 avec le numéro de ligne où l'erreur s'est produite.
Sous le message d'erreur, il y a un symbole bleu `>`. Il marque une "ligne de commande" où l'on peut taper des commandes JavaScript et appuyer sur `key:Enter` pour les exécuter.
Nous pouvons maintenant voir les erreurs et c’est suffisant pour le début. Nous reviendrons plus tard sur les outils de développement et approfondirons le débogage plus loin dans le chapitre .
```smart header="Multi-line input"
Habituellement, quand on met une ligne de code dans la console, puis qu'on appuie sur `key:Enter`, elle s'exécute.
Pour insérer plusieurs lignes, appuyez sur `key:Shift+Enter`. De cette façon, on peut saisir de longs fragments de code JavaScript.
```
## Firefox, Edge et autres
La plupart des autres navigateurs utilisent `key:F12` pour ouvrir les outils de développement.
Leur apparence est assez similaire. Une fois que vous savez comment utiliser l'un d'entre eux (vous pouvez commencer avec Chrome), vous pouvez facilement passer à un autre.
## Safari
Safari (navigateur Mac, non pris en charge par Windows / Linux) est un peu spécial ici. Nous devons d'abord activer le menu "Développement".
Ouvrez les préférences et accédez au volet "Avancé". Il y a une case à cocher en bas :

Maintenant `key:Cmd+Opt+C` peut activer la console. Notez également que le nouvel élément de menu supérieur nommé "Développement" est apparu. Il a beaucoup de commandes et d'options.
## Résumé
- Les outils de développement nous permettent de voir les erreurs, d'exécuter des commandes, d'examiner des variables et bien plus encore.
- Ils peuvent être ouverts avec `key:F12` pour la plupart des navigateurs sous Windows. Chrome pour Mac nécessite la combinaison `key:Cmd+Opt+J`, Safari: `key:Cmd+Opt+C` (doit être activé avant).
Nous avons maintenant notre environnement prêt. Dans la section suivante, nous passerons à JavaScript.
================================================
FILE: 1-js/01-getting-started/4-devtools/bug.html
================================================
There is an error in the script on this page.
================================================
FILE: 1-js/01-getting-started/index.md
================================================
# Une introduction
A propos du langage JavaScript et de l'environnement pour le développeur.
================================================
FILE: 1-js/02-first-steps/01-hello-world/1-hello-alert/index.html
================================================
================================================
FILE: 1-js/02-first-steps/01-hello-world/1-hello-alert/solution.md
================================================
[html src="index.html"]
================================================
FILE: 1-js/02-first-steps/01-hello-world/1-hello-alert/solution.view/index.html
================================================
================================================
FILE: 1-js/02-first-steps/01-hello-world/1-hello-alert/task.md
================================================
importance: 5
---
# Afficher une alerte
Créez une page qui affiche un message "Je suis JavaScript!".
Faites-le dans un bac à sable ou sur votre disque dur, peu importe, assurez-vous simplement que cela fonctionne.
[demo src="solution"]
================================================
FILE: 1-js/02-first-steps/01-hello-world/2-hello-alert-ext/alert.js
================================================
alert("I'm JavaScript!");
================================================
FILE: 1-js/02-first-steps/01-hello-world/2-hello-alert-ext/index.html
================================================
================================================
FILE: 1-js/02-first-steps/01-hello-world/2-hello-alert-ext/solution.md
================================================
The HTML code:
[html src="index.html"]
pour le fichier `alert.js` dans le même dossier :
[js src="alert.js"]
================================================
FILE: 1-js/02-first-steps/01-hello-world/2-hello-alert-ext/task.md
================================================
importance: 5
---
# Afficher une alerte avec un script externe
Prendre la solution de l'exercice précédent . Modifiez-le en extrayant le contenu du script dans un fichier externe `alert.js`, résidant dans le même dossier.
Ouvrez la page, assurez-vous que l'alerte fonctionne.
================================================
FILE: 1-js/02-first-steps/01-hello-world/article.md
================================================
# Hello, world!
Cette partie du tutoriel est à propos du coeur de JavaScript, le langage lui même.
Mais nous avons besoin d'un environnement de travail pour exécuter nos scripts et, étant donné que ce guide est en ligne, le navigateur est un bon choix. Nous allons nous efforcer d'utiliser les commandes spécifiques au navigateur (comme `alert`) au minimum afin de ne pas y consacrer du temps si vous prévoyez de vous concentrer sur un autre environnement tel que Node.JS. Par ailleurs, les détails du navigateur sont expliqués dans [la partie suivante](/ui) du didacticiel.
Alors, voyons d'abord comment intégrer un script à une page Web. Pour les environnements côté serveur, vous pouvez simplement l'exécuter avec une commande comme `"node mon.js"` pour Node.JS.
## La balise "script"
Les programmes JavaScript peuvent être insérés dans n'importe quelle partie d'un document HTML à l'aide de la balise `
*/!*
...After the script.