Merge branch 'master' into patch-2
This commit is contained in:
commit
bc72141bb0
22 changed files with 43 additions and 39 deletions
|
@ -2,23 +2,22 @@
|
|||
|
||||
A code editor is the place where programmers spend most of their time.
|
||||
|
||||
There are two archetypes: IDE and lightweight editors. Many people feel comfortable choosing one tool of each type.
|
||||
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) means a powerful editor with many features that usually operates on a "whole project." As the name suggests, that's not just an editor, but a full-scale "development environment."
|
||||
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 (can be many files), allows navigation between files, provides autocompletion based on the whole project (not just the open file), integrates with a version management system (like [git](https://git-scm.com/)), a testing environment and other "project-level" stuff.
|
||||
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 considered selecting an IDE yet, look at the following variants:
|
||||
If you haven't selected an IDE yet, consider the following options:
|
||||
|
||||
- [WebStorm](http://www.jetbrains.com/webstorm/) for frontend development and other editors of the same company if you need additional languages (paid).
|
||||
- [Visual Studio Code](https://code.visualstudio.com/) (free).
|
||||
- [WebStorm](http://www.jetbrains.com/webstorm/) for frontend development. The same company offers other editors for other languages (paid).
|
||||
- [Netbeans](http://netbeans.org/) (paid).
|
||||
|
||||
All of the IDEs are cross-platform.
|
||||
All of these IDEs are cross-platform.
|
||||
|
||||
For Windows, there's also a "Visual Studio" editor, don't confuse it with "Visual Studio Code." "Visual Studio" is a paid and mighty Windows-only editor, well-suited for the .NET platform. A free version of it is called ([Visual Studio Community](https://www.visualstudio.com/vs/community/).
|
||||
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. A free version of it is called [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.
|
||||
|
||||
|
@ -34,7 +33,7 @@ In practice, lightweight editors may have a lot of plugins including directory-l
|
|||
|
||||
The following options deserve your attention:
|
||||
|
||||
- [Visual Studio Code](https://code.visualstudio.com/) (cross-platform, free).
|
||||
- [Visual Studio Code](https://code.visualstudio.com/) (cross-platform, free) also has many IDE-like features.
|
||||
- [Atom](https://atom.io/) (cross-platform, free).
|
||||
- [Sublime Text](http://www.sublimetext.com) (cross-platform, shareware).
|
||||
- [Notepad++](https://notepad-plus-plus.org/) (Windows, free).
|
||||
|
@ -46,7 +45,7 @@ The personal preference of the author is to have both an IDE for projects and a
|
|||
|
||||
I'm using:
|
||||
|
||||
- [WebStorm](http://www.jetbrains.com/webstorm/) for JS, and if there is one more language in the project, then I switch to one of the other JetBrains offerings listed above.
|
||||
- As an IDE for JS -- [WebStorm](http://www.jetbrains.com/webstorm/) (I switch to one of the other JetBrains offerings when using other languages)
|
||||
- As a lightweight editor -- [Sublime Text](http://www.sublimetext.com) or [Atom](https://atom.io/).
|
||||
|
||||
## Let's not argue
|
||||
|
@ -55,4 +54,4 @@ The editors in the lists above are those that either I or my friends whom I cons
|
|||
|
||||
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, personal preferences.
|
||||
The choice of an editor, like any other tool, is individual and depends on your projects, habits, and personal preferences.
|
||||
|
|
|
@ -206,6 +206,7 @@ function showMessage(from, text = anotherFunction()) {
|
|||
|
||||
```smart header="Evaluation of default parameters"
|
||||
In JavaScript, a default parameter is evaluated every time the function is called without the respective parameter. In the example above, `anotherFunction()` is called every time `someMessage()` is called without the `text` parameter. This is in contrast to some other languages like Python, where any default parameters are evaluated only once during the initial interpretation.
|
||||
|
||||
```
|
||||
|
||||
|
||||
|
|
|
@ -56,7 +56,7 @@ A *breakpoint* is a point of code where the debugger will automatically pause th
|
|||
|
||||
While the code is paused, we can examine current variables, execute commands in the console etc. In other words, we can debug it.
|
||||
|
||||
We can always find a list of breakpoints in the right pane. That's useful when we have many breakpoints in various files. It allows to:
|
||||
We can always find a list of breakpoints in the right pane. That's useful when we have many breakpoints in various files. It allows us to:
|
||||
- Quickly jump to the breakpoint in the code (by clicking on it in the right pane).
|
||||
- Temporarily disable the breakpoint by unchecking it.
|
||||
- Remove the breakpoint by right-clicking and selecting Remove.
|
||||
|
|
|
@ -233,7 +233,7 @@ Grouping is done with a nested `describe`:
|
|||
describe("pow", function() {
|
||||
|
||||
*!*
|
||||
describe("raises x to power n", function() {
|
||||
describe("raises x to power 3", function() {
|
||||
*/!*
|
||||
|
||||
function makeTest(x) {
|
||||
|
|
|
@ -1,6 +1,6 @@
|
|||
describe("pow", function() {
|
||||
|
||||
describe("raises x to power n", function() {
|
||||
describe("raises x to power 3", function() {
|
||||
|
||||
function makeTest(x) {
|
||||
let expected = x * x * x;
|
||||
|
|
|
@ -1,6 +1,6 @@
|
|||
describe("pow", function() {
|
||||
|
||||
describe("raises x to power n", function() {
|
||||
describe("raises x to power 3", function() {
|
||||
|
||||
function makeTest(x) {
|
||||
let expected = x * x * x;
|
||||
|
|
|
@ -1,6 +1,6 @@
|
|||
describe("pow", function() {
|
||||
|
||||
describe("raises x to power n", function() {
|
||||
describe("raises x to power 3", function() {
|
||||
|
||||
function makeTest(x) {
|
||||
let expected = x * x * x;
|
||||
|
|
|
@ -1 +1,5 @@
|
|||
|
||||
```js run
|
||||
function extractCurrencyValue(str) {
|
||||
return +str.slice(1);
|
||||
}
|
||||
```
|
||||
|
|
|
@ -1,6 +1,6 @@
|
|||
```js run no-beautify
|
||||
function sortByName(arr) {
|
||||
arr.sort((a, b) => a.name > b.name);
|
||||
arr.sort((a, b) => b.name > a.name ? 1 : -1);
|
||||
}
|
||||
|
||||
let john = { name: "John", age: 25 };
|
||||
|
|
|
@ -45,7 +45,7 @@ let user = {
|
|||
};
|
||||
```
|
||||
|
||||
- `Object.keys(user) = [name, age]`
|
||||
- `Object.keys(user) = ["name", "age"]`
|
||||
- `Object.values(user) = ["John", 30]`
|
||||
- `Object.entries(user) = [ ["name","John"], ["age",30] ]`
|
||||
|
||||
|
|
|
@ -475,7 +475,7 @@ They look like this:
|
|||
|
||||
Here a Function Expression is created and immediately called. So the code executes right away and has its own private variables.
|
||||
|
||||
The Function Expression is wrapped with brackets `(function {...})`, because when JavaScript meets `"function"` in the main code flow, it understands it as the start of a Function Declaration. But a Function Declaration must have a name, so there will be an error:
|
||||
The Function Expression is wrapped with parenthesis `(function {...})`, because when JavaScript meets `"function"` in the main code flow, it understands it as the start of a Function Declaration. But a Function Declaration must have a name, so there will be an error:
|
||||
|
||||
```js run
|
||||
// Error: Unexpected token (
|
||||
|
@ -497,7 +497,7 @@ function go() {
|
|||
}(); // <-- can't call Function Declaration immediately
|
||||
```
|
||||
|
||||
So, round brackets are needed to show JavaScript that the function is created in the context of another expression, and hence it's a Function Expression. It needs no name and can be called immediately.
|
||||
So, parenthesis are needed to show JavaScript that the function is created in the context of another expression, and hence it's a Function Expression. It needs no name and can be called immediately.
|
||||
|
||||
There are other ways to tell JavaScript that we mean Function Expression:
|
||||
|
||||
|
|
|
@ -112,7 +112,7 @@ let rabbit = {
|
|||
let longEar = {
|
||||
earLength: 10,
|
||||
__proto__: rabbit
|
||||
}
|
||||
};
|
||||
|
||||
// walk is taken from the prototype chain
|
||||
longEar.walk(); // Animal walk
|
||||
|
@ -146,7 +146,7 @@ let animal = {
|
|||
|
||||
let rabbit = {
|
||||
__proto__: animal
|
||||
}
|
||||
};
|
||||
|
||||
*!*
|
||||
rabbit.walk = function() {
|
||||
|
|
|
@ -2,7 +2,7 @@ importance: 5
|
|||
|
||||
---
|
||||
|
||||
# The difference beteeen calls
|
||||
# The difference between calls
|
||||
|
||||
Let's create a new `rabbit` object:
|
||||
|
||||
|
|
|
@ -185,7 +185,7 @@ try {
|
|||
|
||||
The new class `PropertyRequiredError` is easy to use: we only need to pass the property name: `new PropertyRequiredError(property)`. The human-readable `message` is generated by the constructor.
|
||||
|
||||
Please note that `this.name` in `PropertyRequiredError` constructor is again assigned manually. That may become a bit tedius -- to assign `this.name = <class name>` when creating each custom error. But there's a way out. We can make our own "basic error" class that removes this burden from our shoulders by using `this.constructor.name` for `this.name` in the constructor. And then inherit from it.
|
||||
Please note that `this.name` in `PropertyRequiredError` constructor is again assigned manually. That may become a bit tedious -- to assign `this.name = <class name>` when creating each custom error. But there's a way out. We can make our own "basic error" class that removes this burden from our shoulders by using `this.constructor.name` for `this.name` in the constructor. And then inherit from it.
|
||||
|
||||
Let's call it `MyError`.
|
||||
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue