From 6a891403fdefec9952adb7c7047c9e7b731e223b Mon Sep 17 00:00:00 2001 From: Ilya Kantor Date: Sun, 27 Sep 2020 13:18:00 +0300 Subject: [PATCH 1/7] readme --- README.md | 173 +++++++++++++++++++++++++++++++++++++++++++++++------- 1 file changed, 152 insertions(+), 21 deletions(-) diff --git a/README.md b/README.md index 4b19fc5cf4..f8eb47dad8 100755 --- a/README.md +++ b/README.md @@ -1,39 +1,170 @@ -# The Modern JavaScript Tutorial +# The Modern JavaScript Tutorial in v2 -This repository hosts the English content of the Modern JavaScript Tutorial, published at [https://javascript.info](https://javascript.info). +This repository hosts the translation of in v2. -## Translations -We'd like to make the tutorial available in many languages. Please help us to translate. +**That's how you can contribute:** -See for the details. +- See the [v2 Translate Progress](https://github.com/javascript-tutorial/v2.javascript.info/issues/1) issue. +- Choose an unchecked article you'd like to translate. +- Add a comment with the article title to the issue, e.g. `An Introduction to JavaScript`. + - Our bot will mark it in the issue, for everyone to know that you're translating it. + - Your comment should contain only the title. +- Fork the repository, translate and send a PR when done. + - PR title should match article title, the bot will write it's number into the issue. -## Contributions +Please kindly allow maintainers to review and merge or request changes in your translation. + +If maintainers do not respond, or if you'd like to become a maintainer, write us at the [main repo](https://github.com/javascript-tutorial/en.javascript.info/issues/new). + +**Let others know what you're translating, in message boards or chats in your language. Invite them to join!** -We'd also like to collaborate on the tutorial with other people. +🎉 Thank you! -Something's wrong? A topic is missing? Explain it to people, add as PR 👏 +Your name and the contribution size will appear in the "About project" page when the translation gets published. -**You can edit the text in any editor.** The tutorial uses enhanced "markdown" format, easy to grasp. And if you want to see how it looks on-site, there's a server to run the tutorial locally at . - -The list of contributors is available at . +P.S. The full list of languages can be found at . ## Structure -Every chapter, article or a task has its folder. +Every chapter, an article or a task resides in its own folder. + +The folder is named `N-url`, where `N` – is the number for sorting (articles are ordered), and `url` is the URL-slug on the site. + +The folder has one of files: + +- `index.md` for a section, +- `article.md` for an article, +- `task.md` for a task formulation (+`solution.md` with the solution text if any). + +A file starts with the `# Title Header`, and then the text in Markdown-like format, editable in a simple text editor. + +Additional resources and examples for the article or the task, are also in the same folder. + +## Translation Tips + +Please keep line breaks and paragraphs "as is": don't add newlines and don't remove existing ones. Makes it easy to merge future changes from the English version into the translation. + +If you see that the English version can be improved – great, please send a PR to it. + +### Terms + +- Some specification terms are not to be translated, e.g. "Function Declaration" can be left "as is". +- For other terms like `resolved promise`, `slash`, `regexp`, and so on - look for a glossary, hopefully there's one for your language already. If not, look for translations in manuals, such as [MDN](https://developer.mozilla.org/en-US/). + + +### Terms with meaning + +In English many terms have an obvious meaning. For a person who doesn't understand English, there's no such meaning. + +Please keep that in mind, sometimes explanations or additional translations are needed, e.g. + +```md +`ReadableStream` objects allows to read data chunk-by-chunk. +``` + +```md +`ReadableStream` ("flujo legible") objeto ... +``` + +### Text in Code Blocks + +- Translate comments. +- Translate user-messages and example strings. +- Don't translate variables, classes, identifiers. +- Ensure that the code works after the translation :) + +Example: + +```js +// Example +const text = "Hello, world"; +document.querySelector('.hello').innerHTML = text; +``` + +✅ DO (translate comment): + +```js +// Ejemplo +const text = 'Hola mundo'; +document.querySelector('.hello').innerHTML = text; +``` + +❌ DON'T (translate class): -The folder is named like `N-url`, where `N` is a number for the sorting purposes and `url` is the URL part with title of the material. +```js +// Ejemplo +const text = 'Hola mundo'; +// ".hello" is a class +// DO NOT TRANSLATE +document.querySelector('.hola').innerHTML = text; +``` -The type of the material is defined by the file inside the folder: +Please note, that sometimes code is followed by pictures, and if you translate text `Hello` -> `Hola` in the code, you need to translate text in picturess as well. - - `index.md` stands for a chapter - - `article.md` stands for an article - - `task.md` stands for a task (solution must be provided in `solution.md` file aswell) +In that case it's probably easier not to translate such text. See more about translating images later. -Each of these files starts from the `# Main header`. -It's very easy to add something new. +### External Links + +If an external link is to Wikipedia, e.g. `https://en.wikipedia.org/wiki/JavaScript`, and a version of that article exists in your language that is of decent quality, link to that version instead. + +Example: + +```md +[JavaScript](https://en.wikipedia.org/wiki/JavaScript) is a programming language. +``` + +✅ OK (en -> es): + +```md +[JavaScript](https://es.wikipedia.org/wiki/JavaScript) es un lenguaje de programación. +``` + +For links to MDN, a partially translated version is ok. + +If a linked article has no translated version, leave the link "as is". + +### Metadata + +Some files, usually tasks, have YAML metadata at the top, delimited by `---`: + +```md +importance: 5 --- -♥ -Ilya Kantor @iliakan +... +``` + +Please don't translate "importance" (and other top metadata). + +### Anchors + +Some headers have `[#anchor]` at the end, e.g. + +```md +## Spread operator [#spread-operator] +``` + +Please don't translate or remove the `[#...]` part, it's for URL anchors. + + +### Images + +Most illustrations use SVG format, the text in there can be replaced with a translated variant. + +The translated text is in `images.yml` file in the tutorial root. + +The file format is YAML: +```yaml +image.svg: # image file + "hello world": # English phrase + text: "Hola mundo" # translation + position: "centre" # "center" or "right", if needed to center or right-align the translation +``` + +## Running locally + +You can run the tutorial server locally to see how the translation looks. + +The server and install instructions are at . From db4a88097469307ee93c3f54545857236518fa99 Mon Sep 17 00:00:00 2001 From: Ilya Kantor Date: Thu, 29 Oct 2020 21:46:52 +0300 Subject: [PATCH 2/7] WIP --- .../01-hello-javascript/article.md | 33 ++ .../01-hello-javascript/javascript-engine.svg | 1 + 1-js/01-getting-started/02-basics/article.md | 406 ++++++++++++++++++ .../02-basics/use-strict.svg | 1 + .../02-basics/variable-change.svg | 1 + .../02-basics/variable-copy-value.svg | 1 + .../01-getting-started/02-basics/variable.svg | 1 + 1-js/01-getting-started/1-intro/article.md | 121 ------ .../1-intro/limitations.svg | 1 - .../2-manuals-specifications/article.md | 42 -- .../3-code-editors/article.md | 46 -- 1-js/01-getting-started/4-devtools/article.md | 63 --- 1-js/01-getting-started/4-devtools/bug.html | 17 - 1-js/01-getting-started/4-devtools/chrome.png | Bin 42131 -> 0 bytes .../4-devtools/[email protected] | Bin 69383 -> 0 bytes 1-js/01-getting-started/4-devtools/safari.png | Bin 109313 -> 0 bytes .../4-devtools/[email protected] | Bin 272413 -> 0 bytes 1-js/02-first-steps/04-variables/article.md | 2 +- .../04-variables/variable-change.svg | 1 - 1-js/02-first-steps/04-variables/variable.svg | 1 - .../02-object-copy/variable-copy-value.svg | 2 +- figures.sketch | Bin 9539299 -> 9567064 bytes 22 files changed, 446 insertions(+), 294 deletions(-) create mode 100644 1-js/01-getting-started/01-hello-javascript/article.md create mode 100644 1-js/01-getting-started/01-hello-javascript/javascript-engine.svg create mode 100644 1-js/01-getting-started/02-basics/article.md create mode 100644 1-js/01-getting-started/02-basics/use-strict.svg create mode 100644 1-js/01-getting-started/02-basics/variable-change.svg create mode 100644 1-js/01-getting-started/02-basics/variable-copy-value.svg create mode 100644 1-js/01-getting-started/02-basics/variable.svg delete mode 100644 1-js/01-getting-started/1-intro/article.md delete mode 100644 1-js/01-getting-started/1-intro/limitations.svg delete mode 100644 1-js/01-getting-started/2-manuals-specifications/article.md delete mode 100644 1-js/01-getting-started/3-code-editors/article.md delete mode 100644 1-js/01-getting-started/4-devtools/article.md delete mode 100644 1-js/01-getting-started/4-devtools/bug.html delete mode 100644 1-js/01-getting-started/4-devtools/chrome.png delete mode 100644 1-js/01-getting-started/4-devtools/[email protected] delete mode 100644 1-js/01-getting-started/4-devtools/safari.png delete mode 100644 1-js/01-getting-started/4-devtools/[email protected] delete mode 100644 1-js/02-first-steps/04-variables/variable-change.svg delete mode 100644 1-js/02-first-steps/04-variables/variable.svg diff --git a/1-js/01-getting-started/01-hello-javascript/article.md b/1-js/01-getting-started/01-hello-javascript/article.md new file mode 100644 index 0000000000..76e055756d --- /dev/null +++ b/1-js/01-getting-started/01-hello-javascript/article.md @@ -0,0 +1,33 @@ +# Hello, JavaScript! + +The programs in JavaScript are called *scripts*. They can be embedded right into HTML using ` +``` + +JavaScript can execute not only in a browser, but also on a server, or actually on any device that has a special program called [the JavaScript engine](https://en.wikipedia.org/wiki/JavaScript_engine). + +Browsers have built-in JavaScript engines, so they can run scripts. + +We can also run scripts using [Node.js](https://nodejs.org), it's commonly used to build server-side applications. + +Depending on the environment, JavaScript may provide platform-specific functionality. + +- In a web browser, JavaScript can manipulate the web-page, send network requests, show messages and so on. +- Node.js allows to run a web-server. + +...And so on. Even a coffee machine may include its own JavaScript engine, that could allow us to program its recipes. + +![](javascript-engine.svg) + +In this tutorial we concentrate on the "core JavaScript", that's the same everywhere.** + +After you learn it, you can go in any direction: learn browser functionality, how to write servers and so on. + +Please turn the page to start learning JavaScript! diff --git a/1-js/01-getting-started/01-hello-javascript/javascript-engine.svg b/1-js/01-getting-started/01-hello-javascript/javascript-engine.svg new file mode 100644 index 0000000000..493aef701f --- /dev/null +++ b/1-js/01-getting-started/01-hello-javascript/javascript-engine.svg @@ -0,0 +1 @@ +javascript enginejavascript enginejavascript engine \ No newline at end of file diff --git a/1-js/01-getting-started/02-basics/article.md b/1-js/01-getting-started/02-basics/article.md new file mode 100644 index 0000000000..80c8d039d4 --- /dev/null +++ b/1-js/01-getting-started/02-basics/article.md @@ -0,0 +1,406 @@ + +# Basic concepts + +Let's take a piece of JavaScript code and discuss it line by line. + +Please don't hesitate to open "read more" sections below. They aren't strictly required, but contain valueable information. + +```js run +"use strict"; + +let message = "Hello!"; + +alert(message); +``` + +Click the "run" icon â–· in the right-upper corner to see how it works. + +Now we'll go over it line by line. + +## Strict mode + +The first line: + +```js +"use strict"; +``` + +The code starts with the special directive: `"use strict"`. + +To understand what it means, let's make a short dive into the history of JavaScript. + +JavaScript appeared many years ago, in 1995. For a long time, it evolved without compatibility issues. New features were added to the language while old functionality didn't change. + +That had the benefit of never breaking existing code. But the downside was that any mistake or an imperfect decision made by JavaScript's creators got stuck in the language forever. + +This was the case until 2009, when the 5th version of the standard appeared. It added new features to the language and modified some of the existing ones. + +Now the important part. + +**To keep the old code working, these modernizations are off by default.** We need to explicitly enable them with a special directive: `"use strict"` + +With that directive on top the script runs in so-called "strict mode". Or, we'd better say "modern mode", because that's what it essentially is. + +![](use-strict.svg) + +Some JavaScript features enable strict mode automatically, e.g. classes and modules, so that we don't need to write `"use strict"` for them. We'll cover these features later. + +**Here, in the tutorial, we'll always use strict mode, unless explicitly stated otherwise.** + +We're studying modern JavaScript after all. But you'll also see notes about how things work without `use strict`, just in case you come across an old script. + +## Variables + +A [variable](https://en.wikipedia.org/wiki/Variable_(computer_science)) is a "named storage" for data. We can use variables to store goodies, visitors, and so on. + +The second line declares (creates) a variable with the name `message` and stores the string `"John"` in it: + +```js +let message = "Hello!"; +``` + +We could also split this line into two: + +```js +let message; +message = "Hello!"; +``` + +Here, we first declare the variable with `let message`, and then assign the value. + +We can easily grasp the concept of a "variable" if we imagine it as a "box" for data, with a uniquely-named sticker on it. + +For instance, the variable `message` can be imagined as a box labeled `"message"` with the value `"Hello!"` in it: + +![](variable.svg) + +We can put any value in the box. + +We can also change it as many times as we want: +```js +let message; + +message = "Hello!"; + +message = "World!"; // value changed +``` + +When the value is changed, the old data is removed from the variable: + +![](variable-change.svg) + +We can also declare multiple variables and copy data from one into another. + +```js run +let hello = "Hello!"; + +let message; + +*!* +// copy the value "Hello!" from hello into message +message = hello; +*/!* +``` + +Now we have two variables, both store the same string: + +![](variable-copy-value.svg) + +````warn header="Re-declaration triggers an error" +A variable can be declared only once. + +A repeated declaration of the same variable is an error: + +```js run +let message = "One"; + +// repeated 'let' leads to an error +let message = "Two"; // SyntaxError: 'message' has already been declared +``` +So, we should declare a variable once and then refer to it without `let`. +```` + +````warn header="Omitting `let` is possible without `use strict`" +In the old times, it was possible to create a variable by a mere assignment of the value without using `let`. This still works now if the script runs in the "compatibility mode", without `use strict`: + +```js run no-strict +// note: no "use strict" in this example + +num = 5; // the variable "num" is created if it didn't exist + +alert(num); // 5 +``` + +This is a bad practice and would cause an error in strict mode. +```` + +### Variable naming + +There are two limitations on variable names in JavaScript: + +1. The name must contain only letters, digits, or the symbols `$` and `_`. +2. The first character must not be a digit. + +Examples of valid names: + +```js +let userName; +let test123; +``` + +When the name contains multiple words, [camelCase](https://en.wikipedia.org/wiki/CamelCase) is commonly used. That is: words go one after another, each word after the first one starts with a capital letter: `myVeryLongName`. + +Examples of incorrect variable names: + +```js no-beautify +let 1a; // cannot start with a digit + +let my-name; // hyphens '-' aren't allowed in the name +``` + +```smart header="Case matters" +Variables named `apple` and `AppLE` are two different variables. +``` + +````smart header="Non-Latin letters are allowed, but not recommended" +It is possible to use any language, including cyrillic letters or even hieroglyphs, like this: + +```js +let имя = "..."; +let 我 = "..."; +``` + +Technically, there is no error here. Such names are allowed, but there is an international convention to use English in variable names. Even if you're writing a small script, it may have a long life ahead. People from other countries may need to read it in the future. +```` + +````warn header="Reserved names" +There is a [list of reserved words](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Lexical_grammar#Keywords), which cannot be used as variable names because they are used by the language itself. + +For example: `let`, `class`, `return`, and `function` are reserved. + +The code below gives a syntax error: + +```js run no-beautify +let let = 5; // can't name a variable "let", error! +let return = 5; // also can't name it "return", error! +``` +```` + +### Other ways to declare a variable + +Besides `let`, there are two other keywords that declare a variable: + +- `var` (e.g. `var message`) -- the outdated way to declare a variable, you can meet it in really old scripts. + Please don't use it. +- `const` (e.g. `const message`) -- declares a *constant* variable. + +A constant variable must be declared with the initial value, and afterwards it can't be reassigned. + +For example: +```js run +const birthday = "18.04.1982"; + +birthday = "01.01.1970"; // Error: Assignment to constant variable. +``` + +A person might change their name, but not the birthday. The idea of `const` is to let everyone (including the JavaScript engine)¸know about it. + +## Statements and semicolons + +The third line of our code is: + +```js +alert(message); +``` + + +


+ + + +It means that the script should run in the "strict mode". + +Historically, + +If we omit it, then some language features will work a little bit differently. We'll mention the differences later as + + + or, in other words, in the modern mode of execution. + +There are basically two modes of script execution of a script: +- The "strict mode", . +- The "strict mode". + +What does it mean? + +Well, + + +There was a time long ago when JavaScript was a bit different language. + +The core elements of scripts are statements. + +Statements are syntax constructs and commands that perform actions, make JavaScript "do" something. + +Here's an example of a statement: + +```js run +alert('Hello, world!'); +``` + +Click the "run" icon ▷ in the right-upper corner to see how it works. + +We can have as many statements in our code as we want. + +Statements can be separated with a semicolon. + +For example, here we split "Hello World" into two alerts: + +```js run no-beautify +alert('Hello'); alert('World'); +``` + +Usually, statements are written on separate lines to make the code more readable: + +```js run no-beautify +alert('Hello'); +alert('World'); +``` + +A semicolon may be omitted in most cases when a line break exists. + +This would also work: + +```js run no-beautify +alert('Hello') +alert('World') +``` + +Here, JavaScript interprets the line break as an "implicit" semicolon. This is called an [automatic semicolon insertion](https://tc39.github.io/ecma262/#sec-automatic-semicolon-insertion). + +**In most cases, a newline implies a semicolon. But "in most cases" does not mean "always"!** + +There are cases when a newline does not mean a semicolon. + +For example: + +```js run no-beautify +alert(1 + +2); +``` + +The code outputs `3` because JavaScript does not insert semicolons after the plus `+`. It is intuitively obvious that if the line ends with a plus `"+"`, then it is an incomplete expression, that's continued on the next line. And in this case that works as intended. + +**But there are situations where JavaScript "fails" to assume a semicolon where it is really needed.** + +**TODO: The section below is optional, so it's collapsed by default - make it a hint on first open?** + +**TODO: design this.** + +````spoiler header="Read more about it" + +If you're curious to see a concrete example of such an error, check this code out: + +```js run +[1, 2].forEach(alert) +``` + +If the code is too complex to understand, that's all right. You don't have to. + +All you need now is to run the code and remember the result: it shows `1` then `2`. + +Let's add an `alert` before the code and *not* finish it with a semicolon: + +```js run no-beautify +alert("Without a semicolon after me - error") + +[1, 2].forEach(alert) +``` + +Now if you run the code, only the first `alert` is shown and then there's an error! + +...But everything becomes fine again we add a semicolon after the `alert`: +```js run +alert("With a semicolon after me - all ok"); + +[1, 2].forEach(alert) +``` + +The error in the no-semicolon variant occurs because JavaScript doesn't "auto-insert" a semicolon on a newline before square brackets `[...]`. + +So, because the semicolon is not auto-inserted, the code in the first example is treated as a single statement. Here's how the engine sees it: + +```js run no-beautify +alert("There will be an error")[1, 2].forEach(alert) +``` + +But such a merge in this case is just wrong, hence the error. This can happen in other situations as well. +```` + + +We recommend putting semicolons between statements even if they are separated by newlines. This rule is widely adopted by the community. Let's note once again -- *it is possible* to leave out semicolons most of the time. But it's safer -- +especially for a beginner -- to use them. + +## Comments + +As time goes on, programs become more and more complex. It becomes necessary to add *comments* which describe what the code does and why. + +Comments can be put into any place of a script. They don't affect its execution because the engine simply ignores them. + +**One-line comments start with two forward slash characters `//`.** + +The rest of the line is a comment. It may occupy a full line of its own or follow a statement. + +Like here: +```js run +// This comment occupies a line of its own +alert('Hello'); + +alert('World'); // This comment follows the statement +``` + +**Multiline comments start with a forward slash and an asterisk /* and end with an asterisk and a forward slash */.** + +Like this: + +```js run +/* An example with two messages. +This is a multiline comment. +*/ +alert('Hello'); +alert('World'); +``` + +The content of comments is ignored, so if we put code inside /* ... */, it won't execute. + +Sometimes it can be handy to temporarily disable a part of code: + +```js run +/* Commenting out the code +alert('Hello'); +*/ +alert('World'); +``` + +```smart header="Use hotkeys!" +In most editors, a line of code can be commented out by pressing the `key:Ctrl+/` hotkey for a single-line comment and something like `key:Ctrl+Shift+/` -- for multiline comments (select a piece of code and press the hotkey). For Mac, try `key:Cmd` instead of `key:Ctrl` and `key:Option` instead of `key:Shift`. +``` + +````warn header="Nested comments are not supported!" +There may not be `/*...*/` inside another `/*...*/`. + +Such code will die with an error: + +```js run no-beautify +/* + /* nested comment ?!? */ +*/ +alert( 'World' ); +``` +```` + +Please, don't hesitate to comment your code. + +Comments increase the overall code footprint, but that's not a problem at all. There are many tools which minify code before publishing to a production server. They remove comments, so they don't appear in the working scripts. Therefore, comments do not have negative effects on production at all. + +Later in the tutorial there will be a chapter that also explains how to write better comments. diff --git a/1-js/01-getting-started/02-basics/use-strict.svg b/1-js/01-getting-started/02-basics/use-strict.svg new file mode 100644 index 0000000000..b53758c04b --- /dev/null +++ b/1-js/01-getting-started/02-basics/use-strict.svg @@ -0,0 +1 @@ +"use strict"...modern code... \ No newline at end of file diff --git a/1-js/01-getting-started/02-basics/variable-change.svg b/1-js/01-getting-started/02-basics/variable-change.svg new file mode 100644 index 0000000000..82ace911ac --- /dev/null +++ b/1-js/01-getting-started/02-basics/variable-change.svg @@ -0,0 +1 @@ +"World!""Hello!"message \ No newline at end of file diff --git a/1-js/01-getting-started/02-basics/variable-copy-value.svg b/1-js/01-getting-started/02-basics/variable-copy-value.svg new file mode 100644 index 0000000000..34056e1a5b --- /dev/null +++ b/1-js/01-getting-started/02-basics/variable-copy-value.svg @@ -0,0 +1 @@ +"Hello!"message"Hello!"hello \ No newline at end of file diff --git a/1-js/01-getting-started/02-basics/variable.svg b/1-js/01-getting-started/02-basics/variable.svg new file mode 100644 index 0000000000..d6b09f150f --- /dev/null +++ b/1-js/01-getting-started/02-basics/variable.svg @@ -0,0 +1 @@ +"Hello!"message \ No newline at end of file diff --git a/1-js/01-getting-started/1-intro/article.md b/1-js/01-getting-started/1-intro/article.md deleted file mode 100644 index af201373ff..0000000000 --- a/1-js/01-getting-started/1-intro/article.md +++ /dev/null @@ -1,121 +0,0 @@ -# An Introduction to JavaScript - -Let's see what's so special about JavaScript, what we can achieve with it, and which other technologies play well with it. - -## What is JavaScript? - -*JavaScript* was initially created to "make web pages alive". - -The programs in this language are called *scripts*. They can be written right in a web page's HTML and run automatically as the page loads. - -Scripts are provided and executed as plain text. They don't need special preparation or compilation to run. - -In this aspect, JavaScript is very different from another language called [Java](https://en.wikipedia.org/wiki/Java_(programming_language)). - -```smart header="Why is it called JavaScript?" -When JavaScript was created, it initially had another name: "LiveScript". But Java was very popular at that time, so it was decided that positioning a new language as a "younger brother" of Java would help. - -But as it evolved, JavaScript became a fully independent language with its own specification called [ECMAScript](http://en.wikipedia.org/wiki/ECMAScript), and now it has no relation to Java at all. -``` - -Today, JavaScript can execute not only in the browser, but also on the server, or actually on any device that has a special program called [the JavaScript engine](https://en.wikipedia.org/wiki/JavaScript_engine). - -The browser has an embedded engine sometimes called a "JavaScript virtual machine". - -Different engines have different "codenames". For example: - -- [V8](https://en.wikipedia.org/wiki/V8_(JavaScript_engine)) -- in Chrome and Opera. -- [SpiderMonkey](https://en.wikipedia.org/wiki/SpiderMonkey) -- in Firefox. -- ...There are other codenames like "Chakra" for IE, "ChakraCore" for Microsoft Edge, "Nitro" and "SquirrelFish" for Safari, etc. - -The terms above are good to remember because they are used in developer articles on the internet. We'll use them too. For instance, if "a feature X is supported by V8", then it probably works in Chrome and Opera. - -```smart header="How do engines work?" - -Engines are complicated. But the basics are easy. - -1. The engine (embedded if it's a browser) reads ("parses") the script. -2. Then it converts ("compiles") the script to the machine language. -3. And then the machine code runs, pretty fast. - -The engine applies optimizations at each step of the process. It even watches the compiled script as it runs, analyzes the data that flows through it, and further optimizes the machine code based on that knowledge. -``` - -## What can in-browser JavaScript do? - -Modern JavaScript is a "safe" programming language. It does not provide low-level access to memory or CPU, because it was initially created for browsers which do not require it. - -JavaScript's capabilities greatly depend on the environment it's running in. For instance, [Node.js](https://wikipedia.org/wiki/Node.js) supports functions that allow JavaScript to read/write arbitrary files, perform network requests, etc. - -In-browser JavaScript can do everything related to webpage manipulation, interaction with the user, and the webserver. - -For instance, in-browser JavaScript is able to: - -- Add new HTML to the page, change the existing content, modify styles. -- React to user actions, run on mouse clicks, pointer movements, key presses. -- Send requests over the network to remote servers, download and upload files (so-called [AJAX](https://en.wikipedia.org/wiki/Ajax_(programming)) and [COMET](https://en.wikipedia.org/wiki/Comet_(programming)) technologies). -- Get and set cookies, ask questions to the visitor, show messages. -- Remember the data on the client-side ("local storage"). - -## What CAN'T in-browser JavaScript do? - -JavaScript's abilities in the browser are limited for the sake of the user's safety. The aim is to prevent an evil webpage from accessing private information or harming the user's data. - -Examples of such restrictions include: - -- JavaScript on a webpage may not read/write arbitrary files on the hard disk, copy them or execute programs. It has no direct access to OS functions. - - Modern browsers allow it to work with files, but the access is limited and only provided if the user does certain actions, like "dropping" a file into a browser window or selecting it via an `` tag. - - There are ways to interact with camera/microphone and other devices, but they require a user's explicit permission. So a JavaScript-enabled page may not sneakily enable a web-camera, observe the surroundings and send the information to the [NSA](https://en.wikipedia.org/wiki/National_Security_Agency). -- Different tabs/windows generally do not know about each other. Sometimes they do, for example when one window uses JavaScript to open the other one. But even in this case, JavaScript from one page may not access the other if they come from different sites (from a different domain, protocol or port). - - This is called the "Same Origin Policy". To work around that, *both pages* must agree for data exchange and contain a special JavaScript code that handles it. We'll cover that in the tutorial. - - This limitation is, again, for the user's safety. A page from `http://anysite.com` which a user has opened must not be able to access another browser tab with the URL `http://gmail.com` and steal information from there. -- JavaScript can easily communicate over the net to the server where the current page came from. But its ability to receive data from other sites/domains is crippled. Though possible, it requires explicit agreement (expressed in HTTP headers) from the remote side. Once again, that's a safety limitation. - -![](limitations.svg) - -Such limits do not exist if JavaScript is used outside of the browser, for example on a server. Modern browsers also allow plugin/extensions which may ask for extended permissions. - -## What makes JavaScript unique? - -There are at least *three* great things about JavaScript: - -```compare -+ Full integration with HTML/CSS. -+ Simple things are done simply. -+ Support by all major browsers and enabled by default. -``` -JavaScript is the only browser technology that combines these three things. - -That's what makes JavaScript unique. That's why it's the most widespread tool for creating browser interfaces. - -That said, JavaScript also allows to create servers, mobile applications, etc. - -## Languages "over" JavaScript - -The syntax of JavaScript does not suit everyone's needs. Different people want different features. - -That's to be expected, because projects and requirements are different for everyone. - -So recently a plethora of new languages appeared, which are *transpiled* (converted) to JavaScript before they run in the browser. - -Modern tools make the transpilation very fast and transparent, actually allowing developers to code in another language and auto-converting it "under the hood". - -Examples of such languages: - -- [CoffeeScript](http://coffeescript.org/) is a "syntactic sugar" for JavaScript. It introduces shorter syntax, allowing us to write clearer and more precise code. Usually, Ruby devs like it. -- [TypeScript](http://www.typescriptlang.org/) is concentrated on adding "strict data typing" to simplify the development and support of complex systems. It is developed by Microsoft. -- [Flow](http://flow.org/) also adds data typing, but in a different way. Developed by Facebook. -- [Dart](https://www.dartlang.org/) is a standalone language that has its own engine that runs in non-browser environments (like mobile apps), but also can be transpiled to JavaScript. Developed by Google. -- [Brython](https://brython.info/) is a Python transpiler to JavaScript that allow to write application in pure Python without JavaScript. - -There are more. Of course, even if we use one of transpiled languages, we should also know JavaScript to really understand what we're doing. - -## Summary - -- JavaScript was initially created as a browser-only language, but is now used in many other environments as well. -- Today, JavaScript has a unique position as the most widely-adopted browser language with full integration with HTML/CSS. -- There are many languages that get "transpiled" to JavaScript and provide certain features. It is recommended to take a look at them, at least briefly, after mastering JavaScript. diff --git a/1-js/01-getting-started/1-intro/limitations.svg b/1-js/01-getting-started/1-intro/limitations.svg deleted file mode 100644 index a7863c63cc..0000000000 --- a/1-js/01-getting-started/1-intro/limitations.svg +++ /dev/null @@ -1 +0,0 @@ -https://javascript.info<script> ... </script>https://gmail.comhttps://javascript.info \ No newline at end of file diff --git a/1-js/01-getting-started/2-manuals-specifications/article.md b/1-js/01-getting-started/2-manuals-specifications/article.md deleted file mode 100644 index 85a7737cb0..0000000000 --- a/1-js/01-getting-started/2-manuals-specifications/article.md +++ /dev/null @@ -1,42 +0,0 @@ - -# Manuals and specifications - -This book is a *tutorial*. It aims to help you gradually learn the language. But once you're familiar with the basics, you'll need other sources. - -## Specification - -[The ECMA-262 specification](https://www.ecma-international.org/publications/standards/Ecma-262.htm) contains the most in-depth, detailed and formalized information about JavaScript. It defines the language. - -But being that formalized, it's difficult to understand at first. So if you need the most trustworthy source of information about the language details, the specification is the right place. But it's not for everyday use. - -A new specification version is released every year. In-between these releases, the latest specification draft is at . - -To read about new bleeding-edge features, including those that are "almost standard" (so-called "stage 3"), see proposals at . - -Also, if you're in developing for the browser, then there are other specs covered in the [second part](info:browser-environment) of the tutorial. - -## Manuals - -- **MDN (Mozilla) JavaScript Reference** is a manual with examples and other information. It's great to get in-depth information about individual language functions, methods etc. - - One can find it at . - - Although, it's often best to use an internet search instead. Just use "MDN [term]" in the query, e.g. to search for `parseInt` function. - - -- **MSDN** – Microsoft manual with a lot of information, including JavaScript (often referred to as JScript). If one needs something specific to Internet Explorer, better go there: . - - Also, we can use an internet search with phrases such as "RegExp MSDN" or "RegExp MSDN jscript". - -## Compatibility tables - -JavaScript is a developing language, new features get added regularly. - -To see their support among browser-based and other engines, see: - -- - per-feature tables of support, e.g. to see which engines support modern cryptography functions: . -- - a table with language features and engines that support those or don't support. - -All these resources are useful in real-life development, as they contain valuable information about language details, their support etc. - -Please remember them (or this page) for the cases when you need in-depth information about a particular feature. diff --git a/1-js/01-getting-started/3-code-editors/article.md b/1-js/01-getting-started/3-code-editors/article.md deleted file mode 100644 index d03f03defb..0000000000 --- a/1-js/01-getting-started/3-code-editors/article.md +++ /dev/null @@ -1,46 +0,0 @@ -# Code editors - -A code editor is the place where programmers spend most of their time. - -There are two main types of code editors: IDEs and lightweight editors. Many people use one tool of each type. - -## IDE - -The term [IDE](https://en.wikipedia.org/wiki/Integrated_development_environment) (Integrated Development Environment) refers to a powerful editor with many features that usually operates on a "whole project." As the name suggests, it's not just an editor, but a full-scale "development environment." - -An IDE loads the project (which can be many files), allows navigation between files, provides autocompletion based on the whole project (not just the open file), and integrates with a version management system (like [git](https://git-scm.com/)), a testing environment, and other "project-level" stuff. - -If you haven't selected an IDE yet, consider the following options: - -- [Visual Studio Code](https://code.visualstudio.com/) (cross-platform, free). -- [WebStorm](http://www.jetbrains.com/webstorm/) (cross-platform, paid). - -For Windows, there's also "Visual Studio", not to be confused with "Visual Studio Code". "Visual Studio" is a paid and mighty Windows-only editor, well-suited for the .NET platform. It's also good at JavaScript. There's also a free version [Visual Studio Community](https://www.visualstudio.com/vs/community/). - -Many IDEs are paid, but have a trial period. Their cost is usually negligible compared to a qualified developer's salary, so just choose the best one for you. - -## Lightweight editors - -"Lightweight editors" are not as powerful as IDEs, but they're fast, elegant and simple. - -They are mainly used to open and edit a file instantly. - -The main difference between a "lightweight editor" and an "IDE" is that an IDE works on a project-level, so it loads much more data on start, analyzes the project structure if needed and so on. A lightweight editor is much faster if we need only one file. - -In practice, lightweight editors may have a lot of plugins including directory-level syntax analyzers and autocompleters, so there's no strict border between a lightweight editor and an IDE. - -The following options deserve your attention: - -- [Atom](https://atom.io/) (cross-platform, free). -- [Visual Studio Code](https://code.visualstudio.com/) (cross-platform, free). -- [Sublime Text](http://www.sublimetext.com) (cross-platform, shareware). -- [Notepad++](https://notepad-plus-plus.org/) (Windows, free). -- [Vim](http://www.vim.org/) and [Emacs](https://www.gnu.org/software/emacs/) are also cool if you know how to use them. - -## Let's not argue - -The editors in the lists above are those that either I or my friends whom I consider good developers have been using for a long time and are happy with. - -There are other great editors in our big world. Please choose the one you like the most. - -The choice of an editor, like any other tool, is individual and depends on your projects, habits, and personal preferences. diff --git a/1-js/01-getting-started/4-devtools/article.md b/1-js/01-getting-started/4-devtools/article.md deleted file mode 100644 index 50926d4f76..0000000000 --- a/1-js/01-getting-started/4-devtools/article.md +++ /dev/null @@ -1,63 +0,0 @@ -# Developer console - -Code is prone to errors. You will quite likely make errors... Oh, what am I talking about? You are *absolutely* going to make errors, at least if you're a human, not a [robot](https://en.wikipedia.org/wiki/Bender_(Futurama)). - -But in the browser, users don't see errors by default. So, if something goes wrong in the script, we won't see what's broken and can't fix it. - -To see errors and get a lot of other useful information about scripts, "developer tools" have been embedded in browsers. - -Most developers lean towards Chrome or Firefox for development because those browsers have the best developer tools. Other browsers also provide developer tools, sometimes with special features, but are usually playing "catch-up" to Chrome or Firefox. So most developers have a "favorite" browser and switch to others if a problem is browser-specific. - -Developer tools are potent; they have many features. To start, we'll learn how to open them, look at errors, and run JavaScript commands. - -## Google Chrome - -Open the page [bug.html](bug.html). - -There's an error in the JavaScript code on it. It's hidden from a regular visitor's eyes, so let's open developer tools to see it. - -Press `key:F12` or, if you're on Mac, then `key:Cmd+Opt+J`. - -The developer tools will open on the Console tab by default. - -It looks somewhat like this: - -![chrome](chrome.png) - -The exact look of developer tools depends on your version of Chrome. It changes from time to time but should be similar. - -- Here we can see the red-colored error message. In this case, the script contains an unknown "lalala" command. -- On the right, there is a clickable link to the source `bug.html:12` with the line number where the error has occurred. - -Below the error message, there is a blue `>` symbol. It marks a "command line" where we can type JavaScript commands. Press `key:Enter` to run them. - -Now we can see errors, and that's enough for a start. We'll come back to developer tools later and cover debugging more in-depth in the chapter . - -```smart header="Multi-line input" -Usually, when we put a line of code into the console, and then press `key:Enter`, it executes. - -To insert multiple lines, press `key:Shift+Enter`. This way one can enter long fragments of JavaScript code. -``` - -## Firefox, Edge, and others - -Most other browsers use `key:F12` to open developer tools. - -The look & feel of them is quite similar. Once you know how to use one of these tools (you can start with Chrome), you can easily switch to another. - -## Safari - -Safari (Mac browser, not supported by Windows/Linux) is a little bit special here. We need to enable the "Develop menu" first. - -Open Preferences and go to the "Advanced" pane. There's a checkbox at the bottom: - -![safari](safari.png) - -Now `key:Cmd+Opt+C` can toggle the console. Also, note that the new top menu item named "Develop" has appeared. It has many commands and options. - -## Summary - -- Developer tools allow us to see errors, run commands, examine variables, and much more. -- They can be opened with `key:F12` for most browsers on Windows. Chrome for Mac needs `key:Cmd+Opt+J`, Safari: `key:Cmd+Opt+C` (need to enable first). - -Now we have the environment ready. In the next section, we'll get down to JavaScript. diff --git a/1-js/01-getting-started/4-devtools/bug.html b/1-js/01-getting-started/4-devtools/bug.html deleted file mode 100644 index edb02375ca..0000000000 --- a/1-js/01-getting-started/4-devtools/bug.html +++ /dev/null @@ -1,17 +0,0 @@ - - - - - - - - - - There is an error in the script on this page. - - - - - \ No newline at end of file diff --git a/1-js/01-getting-started/4-devtools/chrome.png b/1-js/01-getting-started/4-devtools/chrome.png deleted file mode 100644 index 4cb3ea2f46450ca44c7aecd8200fc9688cd752e2..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 42131 zcmZs@1yoe;+Bb}aN~jzwD2nLT^hOAGj)i{_6M9${e>M&ceny9EC~jj`+#1uQI2Ml7rs{#aNCXYjv^SXeIHSXfJj zSXe^uv9L((q79m);kDRCax#)wXUKm()@H@Pzg)GK)pEkZB7t|4FrGs_Vc39wyzGop zkh(mHeUs?ceFGY%dblDMO7hWD_unhEZr+qF9vf$4wZ4}rJ=be*tSGDyHgT%FlMO+a znP|O{TOksD6C>aeb3FdTLDyKg%t)umL`(gSn(P}QVW}vi_1g0n&!xHP){mZ?IQ$~U zI!`0}N@~hmEcFP>ty)-kyK`lQujj#b*iOS`>TGgy@@#a-Lz){`E|#-}q+!vZ`t!Qm zpTFE2k25_`H|3ix+B<0eVjAjVi+}xa*pT{-T{P*&EzV)ff%mHmCRnx>qYHC+6 zo+rb@?ljxZ>yCK1Q7I8;s>?~*)zw8td#rr*e{bRQt*1`y3GOm$w75H7xXyu!zJl%V z{(y>|1eYmhQQaH`AJ?acxi`MldFA5ymk;e38BlaLuKe9T2rwmsm+pIunrKN!e-?H% zq`852Nt}EwaC8;>n{D~TQZDj_j}(dLElRZmdH*otJ|iZ%lAqd>%VsynKjNFdW)A`OT2~PoYoA9Mj~kXQ3v0xsdRyo~z$~4U46+ncjyF zcdXnYZmQ)W!@Ey;Ev(s^Ybe?FIb7h?C~?=VTX@)kJ@x`xS1xLZlO18tp-ZGu(fNG{PCqbj5qbyupEz_I2o4TlISy@>cdiv=q_EK%_yu7@X@!F)Vt*vuCrJC&T;^GLY zsr}^GvI;69wf!Bc#{$G@DX#^8m2~^mmQy}x5H~xz_Xro;zhcaG#r4Rge6yilX4*Bj zEqvy&zk>pmK#|j)XYKxpFC87-TZS(au3l`5IqT#h$ED@v1AToj+f3+$gl>g4rF9&b ziQs-xmc3p;f)j|%7`nD99utU0mzS&$j-S&OuF}`KBAO*jXvG|G)_=)6ONp@JX}C$D zQFmLDwq_U)Yo=0Qg_nVQ&iJK}G-VA98Eb2{#l=NQY3cFaBfZ6h+HrHw-dc5TGLw!t z4x90sN`np?H>eXq!Gsnnudr9IUM=UdOQ~E56lb_|=OzWkXd}+2lZoD5DDsL~u1rJj z*2RG=`0}1qYHEz|rk_8bj{BYYK(#7~9x$lq?3O*TvJIT=nBR8TnnA6&3VV2X9Ckb) z!*g8v$?`$*4s4lnwQ*Cexz;H9T&?1uJE`8$xw*L%js~dcjRS8=VOM$TE7CGDeBS%^ zgg0;6<&-(mtEk0>gy1YKFLSAel*T{u_I~i@&6^J*UU54+&V+=7LAs(80=6?hzoONFcv*D-s^5qK=2?^Yn z)4%D{8TOIc67{)&d#T4bl(UPsR-*?+c&a+LlXsQIZ&0?p& zeE5{1jwij4ODm-GE7=#Fi8N-MXo-`6piw{5YRG}Wnm?-f_I`!85n zTQ{y_ZjzD?(}y>FcFWsZT3InU*qViXk>azb<#Us)V7Q|_mW_pzlZlUSyU5Y4Clrl_ zuWQ7g^d=;vDu1zsEmlRf`Sy~R zMOR?Py)M6N8+=!JliF?!EW6Bcrj=lCWyHV1@Y_0OV0=7c%(lh0{3cEyGdsIU z|7TRq+38W|dmjG;KJ&fon7XY&10T$Av$nQ2d|rRvr_r+K^f#`&O-YI9GFw)az95n+ zal-Dh?nOsW?~>a8=H{KPZx^obxJT^_r|xveqtPoP#le}GOex-5DCoKIoO)9ymDBAohNDt$0&kR=?;6&pGvkCSbVzUjJ|~v1K%soL&l+*aWP*~8=J=SMt&n_?-{)2J7xG1}y1>$pH;68wqG9R( z#%kz)Dl8-@AMH|A5|Og9T2jym($UtgaNneR{`@)I9W>*ek+e@WN)i$msD1Zo@7=rS z?CQ#E+#E)A@~hHmUbD_yu(Y)Fy*v|>LZY(*$y82a4^E&sOsln8j6VF^)8(F_l$ zuKOKNQww@*&AipNWJG

8gY|-9kGdTJM)Cv{y99n-6uo6xig@& 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

{650{Zh01`8Yqc?>Af;`pv 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

>E6P^_0@M@A62beS4|Wg**#xf zeQJPyr1EZK)3^Qi^bt+}noqv#pLL8wU0U>BME9fe_?ITUZ^QCuf4wjz|Esxv_ejW; zd)QY$g%*~N4DW(=5FBy={2@Z5tEL7gE0E(t0M?$BY6Bhv*>(fY!os*~g@Cz~IZFjo zP&*wCEA{hVo#=bZvWoIQmbYO7C2-r`^*abJAiPbSVUS)9diN^5m}kg|=H;Uz?Z;0v zY3r##hx_;Y7Q^e?a9HQxuVdVODD>!oK37QE(n0iF;18?rS;kEEkBzRqO_MP8Pm75Xjw*5s-_snW@3jY z%$CcNJCl5_-)sr*GuVRL+CMo*M^7p89mlFYVRW^@iU&C(8z?6{9?zT2j3bJ!1IH zvfrnf{fycyv$|7w3q**TXo8)N#0 zZ=Q4G^fEP%)er8y72(!R)hxKu{Nf$z3>vP>FW}7M_V3Yk$3pb2;Kqh%DGZNKyWWbJ zdq5<=&D;|O4zZ)u3FWt`a!>^POo_oHobX#GUu_3kDDOMJ;}SdN)*`ojsy4haB+TYv z*q{qRY|ZLtxD@<$P0QO;U~>s9Q>`V4UV>Cy-G$(h5*Lcf5iOgE%A~N8yK$oK)QPp4 zaSZKjIqp6O)p%^2MyDSVM2w8&q9uLwMEpFBFG&S@d=T=97%=aNdiSnX0(ahNYQ}QN z_SdT}v)RdD636wi0m$B??+1$5R||so4GG{;s_{iO87L+w*S3=I|t(Idaka5soK3rvEv&fTI3~e z&Ra`KY|tO(J_T;uSyjhjK`UPKxy)Rz{05y(^GMfP5a!Ox>~kZ`5deTu?}X%29Rh;h|z3CTpH{4EToPFs3{Urf*&|B{C7m`!|~-=F)eQWM4;47t|e?-{rrzxjpY2+-Eqm8BALItV8`26Byst z*3JM$`s=*~D7h@Gt#<_Ogo+$pFY;-jGE+=KM~DJ}4?Cwr%`E@UP-C z8aZm+*2LYU{ngL{Zl^<{=E&P!aY~}Iq-RIxi`eTr>!eV%m9O3&Lz*C^?P`TW~% zwiH@VoIBl_!)cD7dNX1&rBUzmCUed#j>GqbgiOTt_l|<7l(_cSMNiZV#=h+(dwCqb zF@^S*mj0nt592W#K3h`mwz1HE+48wHy-@pAbV$o`M&Xx)tJBg1H*a?>+tvRYiEw%x zdhzjTWI>_Jks_7XKCO{)n%2Rjc6V}t;o-Y#W=>YauEVb5#V+CpCHCiBtHU+){V0MP zyHiDWFPitnZ)XW;a2qc%z&U4WC%Mptq)QNB2zs<@26__wAVm81_JOx=)P@Cg(Cc`;seYU=sDYni^jBOF`fX8k)an0cz zPTlru!N8yX_8#9|9U)=82Sv^VtGAPL-Pa{vHDJk6Yrk%sT+kq|F+U{Qa&mG%S;c_< zGUGLIz`rbD3pJo{ylUWcA*RiFfHbvI*H+)hNy;6qcL{7W3FDjU%jUQ@O3&pmpeRLM zUu}ipdSkfi8&(qds&dCf)eA;nGoW;eFB+akCUHv5&-E3P9=jN4c~vGXUv7x=v-bek$>xYKIo|^3#V{!DHP}@~AzHPEP~+)9z7`E+zsk4J7^IRwIwwzk^uNj;8E{4E4W zLzWFrct;Y*0hfu6m-)B8zOt6g1Cb==2uhKLl#^hK=hoA`QN~YoD_Y&^PVUY1RFbNx zK~yDIznb6xr~U5^iyM#c3Ul37h79sE9tQ=fr_nI)oF-~U

=Dj!)+h8qKR z;>!a;1h$Zv!Bcv1zneGEpaF_zwS8e;SLH8byP@6ZvKJ+2ppTbm4n4tfH5*;01yqLs zm7+l>#}2G1Be6ssLx2=*SndWbHMOjY$~&;C0nnD7`3^uDK!Sm>vYKl|2Yk|kCmz~T zV3fhINFyL{sn999jb5*1C#&-5t%NZHZL*&hjR@@hQ1Y&kJ;=z&T0RrJL=R=0TeH?G znz)TF{GzNF)FX6%IyY0XRWN>IdlRB3H`KeoJhFoCXE=MJx%@ep%q%YT

qeFZ)2 zO^*gdS_)LnZbF*%cfULX`vyQFA#p#_RfjeYFNyBU-$_hP_oujcHAHYjQk1HY`U^5J z1FBjX?#7#UhdAPANakwii@dz2%uT=JjAnDz?ynH+T77BkNTv?COF1HihErvo{tQZq z_e$T}pxS%>AP5X7?1d(zRfk&!Q?0=vIBbwHajNGg^mF1hD|+HgaEnRnqfW;pW>xo$ z%zume18|W_A67;4e17tBEc(W?=F>p0@x8Kbi&=KaG=ah&%1_OW6?{j}Z{<;>&?`~- z;4KJ39X`6h!>NEMk4U`eF+ZNWIx~Pew8DIg5w0Mr9EIXX(n$<-T}Q4>TQz4VEnj-r zzqEd&Ko~wY<}z8TPola;ilarsWgfX6LM?7xIjQDfm*Vr7Tp-&Mk}w$ggnNfD9^!)4 z!w-46I1

fl3f$25?`N+uk$5|{g}R+pzN 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

oHN&i6VF2QM2rz+m9IQy@Hnz;dba?*} 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

OU9-Lt98sspu3G*s}+YP@GcJcr`tB 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 diff --git a/1-js/01-getting-started/4-devtools/[email protected] b/1-js/01-getting-started/4-devtools/[email protected] deleted file mode 100644 index b87404a8f46751d7ed7f30436df4731f7feb58fb..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 69383 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