Автор оригинала: Johnny B. (Ionică Bizău).
Это быстрый обзор языка JavaScript. Чтение этого с самого начала до конца хорош, но идет в конкретный раздел, а также хорош.
В наши дни JavaScript работает на браузерах, серверах, инструментах командной строки Powers, и многое другое. В этом чит-листе мы включаем пару функций браузера, которые вы можете получить доступ к JavaScript на стороне клиента и платформы-агностические функции, которые вы можете использовать на клиенте, либо на сервере.
(ЧИТАТЬ ДАЛЕЕ: JavaScript лучшие практики: Советы и хитрости навыки вашего кода )
Быстрый пример
Когда он работает в браузере, вы можете настроить некоторые элементы GUI (графический интерфейс), такие как текстовые входы, кнопки и многое другое.
Давайте создадим небольшое приложение, которое проверяет, нечет ли номер или даже. Сохраните следующий кусок кода в файл с именем нечетное или-даже.html
:
Odd or Even? Enter a number and click the button to find out if the number is odd or even.
Теперь откройте это в вашем браузере и играйте с ним: напишите номер на входе, нажмите кнопку и наслаждайтесь.
Заметки
- Вам не нужно компилировать JavaScript. Вы можете интерпретировать его, используя браузер или платформы, такие как Node.js Отказ
- Запястья являются необязательными. Действительно. Это зависит от вас, если вы решите использовать их или нет. В Этот блог пост Вы найдете, почему это (не) хорошо использовать запястья везде. Короче говоря, вы решаете, хотите ли вы написать код с запятой или нет.
- Некоторые примеры содержат код, написанный в ES2015 (ES6) Не может работать на более старых браузерах/переводчиках. В таких случаях просто вставьте код В этом онлайн ES6 транспортер И вы получите эквивалент ES5.
- Этот документ может быть обновлен и улучшен время от времени.
Комментарии
Однострочные комментарии начинаются с //
Отказ Для многострочных команд вы используете /* ... */
// This is a single line comment /* And this is a multi-line comment */
Переменные
Вы можете создавать переменные, используя var
, Пусть
, Const
(последние два доступны только в ES6).
Имена переменных не могут начать с номера или содержат пробелы. Они могут содержать буквы, цифры, подчеркивание или $. Имена переменных чувствительны к регистру.
// This is how you define a variable // `x` will be `undefined` var x; // Declare a constant (the convention is to use CAPS for constants) const FOO = 42; // Declare another two variables, using `var` and `let` var hello = 'world'; let bar = 'baz';
Переменные не имеют типа. Пока они не являются константами, вы можете изменить свои данные:
let foo = 42; foo = 'bar'; foo → 'bar'
Пусть vs var.
Пусть
и var
довольно похоже, но в отличие от var
, Пусть
Объявляет локальную переменную область блока, необязательно инициализацию его до значения.
Пусть
Позволяет объявлять переменные, которые ограничены по объему блока, оператора или выражения, на котором он используется. var
Ключевое слово, которое определяет переменную для всей функции независимо от объема блока.
Давайте посмотрим на пример:
var a = 42; if (true) { var b = 7; let c = 123; } // Obviously, we can access the `a` variable console.log(a); // => 42 // We can access `b` as well, even it was assigned in the // if block (see below what happens if the expressions is // false). console.log(b); // => 7 // We cannot access `c` here because it was declared using // `let`, inside of the `if` block, therefore it's only // accessible in the `if` block. console.log(c); // => Error: c is not defined
Даже если Если
Состояние ложно, мы все еще можем получить доступ к var
Декларация внутри Если
блокировать. В этом случае значение будет undefined
Отказ
if (false) { var b = 7; } console.log(b); // => undefined
Это происходит из-за того, что переменные объявлены и назначены. Приведенный выше код похож на:
// Create the b variable (will take `undefined` by default) var b; if (false) { // Eventually assign it b = 7; } // Since we do *not* assign it, the value remains `undefined`
Действительно хорошее использование, чтобы использовать эту разницу между Пусть
и var
это для
петли с чем-то async в нем.
Обратите внимание, как в первом примере мы получаем окончательное значение Я
(Потому что мы распечатаем его через одну секунду). В других примерах (либо мы вручную создаем новый объем, используя функцию, либо использовать Пусть
– что это делает для нас), Я
ценность внутри из Сетримс
(Через одна секунда) это Текущий Значение Я Когда Сетримс
назывался.
for (var i = 0; i < 7; ++i) { setTimeout(function () { console.log(i); // => 8 // => 8 // => 8 // => 8 // => 8 // => 8 // => 8 // => 8 }, 1000); } for (let i = 0; i < 7; ++i) { setTimeout(function () { console.log(i); // => 0 // => 1 // => 2 // => 3 // => 4 // => 5 // => 6 // => 7 }, 1000); } // The above for loop, converted in ES5 looks like this: var _loop = function (i) { setTimeout(function () { console.log(i); // => 0 // => 1 // => 2 // => 3 // => 4 // => 5 // => 6 // => 7 }, 1000); }; for (var i = 0; i < 7; ++i) { _loop(i); }
Как Const работает?
Const
Просто: Вы можете использовать его для переменных, которые значения остаются прежними.
const PI = 3.14; PI = 3; → TypeError: Assignment to constant variable.
Примечание, это не замораживает объекты:
// Create an object const myObj = { foo: 'bar' }; // Update the `foo` field myObj.foo = 42; // Add a new field myObj.hello = 'world'; myObj → { foo: 42, hello: 'world' } // Tho, if you try to reset the whole thing, you can't myObj = {}; → TypeError: Assignment to constant variable.
Если заявления
Использовать Если (выражение) {...} else {...}
сделать что-то, если выражение
let foo = 42; if (foo > 40) { // do something } else { // do something else }
Переключатель
let planet = 'Earth'; switch (planet) { case "Mercury": case "Venus": console.log("Too hot here."); case 'Earth' : console.log("Welcome home!"); break; case 'Mars' : console.log("Welcome to the other home!"); break; case "Jupiter": case "Saturn": case "Uranus": case "Neptune": case "Pluto": console.log("You may get gold here."); break; default: console.log("Seems you found another planet."); break; }
Примитивные значения
Следующие, примитивы:
- Логин:
ложь
,правда
- Числа:
42
,3.14
,0b11010
,0x16
,Нан
(Проверить Магия чисел ) - Строки:
«Земля»
,"Марс"
- Специальные значения:
undefined
,ноль
Объекты
Общий способ объявления объектов связан с использованием фигурных скобок:
let myObj = { world: "Earth" };
Внимание : Объекты сравниваются со ссылкой. Что говорят, у нас есть это:
let firstObj = {}; let secondObj = {}; // Check if they are equal firstObj === secondObj → false // Comparing an object with itself... firstObj === firstObj → true // Let's point the secondObj to firstObj secondObj = firstObj // Now they are equal firstObj === secondObj → true
Внимание: у вас нет никакой гарантии, что добавление объектных клавиш в определенном порядке получит их в том же порядке. Объектные ключи являются не Приказал даже в общих интерпретатерах JavaScript, которые будут имитировать их в порядке добавления их в объект (опять же, делать не полагаться на эту функцию).
Массива
В дополнение к объектам данные массива заказываются индексами. Массивы на самом деле объекты, имеющие индексы (цифры из 0
на legnth - 1
) как Ключи Отказ
let fruits = ["apples", "pears", "oranges"]; fruits[1] → "pears"
Доступ, добавить, удалить и обновлять элементы
> let fruits = ["Apple"] // Add to the end of the array > fruits.push("Pear") 2 // < The new length of the array [ 'Apple', 'Pear' ] // ^ This was just added // Add to the start of the array > fruits.unshift("Orange") 3 // < The new length of the array [ 'Orange', 'Apple', 'Pear' ] // ^ This was just added // Access the element at index 1 (the second element) > fruits[1] 'Apple' // How many items do we have? > fruits.length 3 // Turn the Apple into Lemon > fruits[1] = "Lemon" 'Lemon' [ 'Orange', 'Lemon', 'Pear' ] // ^ This was before an Apple // Insert at index 1 a new element > fruits.splice(1, 0, "Grapes") [] // < Splice is supposed to delete things (see below) // In this case we're deleting 0 elements and // inserting one. [ 'Orange', 'Grapes', 'Lemon', 'Pear' ] // ^ This was added. // Get the Lemon's index > fruits.indexOf("Lemon") 2 // Delete the Lemon > fruits.splice(2, 1) [ 'Lemon' ] [ 'Orange', 'Grapes', 'Pear' ] // ^ Lemon is gone // Remove the last element > fruits.pop() 'Pear' [ 'Orange', 'Grapes' ] // ^ Pear is gone // Remove the first element > fruits.shift() 'Orange' [ 'Grapes' ] // ^ Orange is gone
Итализация по массивам
Есть несколько способов петли через массив.
// Using for-loop var arr = [42, 7, -1] for (var index = 0; index < arr.length; ++index) { var current = arr[index]; /* Do something with `current` */ } // Others prefer defining an additional `length` variable: for (var index = 0, length = arr.length; index < length; ++index) { var current = arr[index]; /* ... */ } // Another way i using `forEach`: arr.forEach((current, index, inputArray) => { /* Do something with `current` */ }); // Or using the for ... of: for (let current of arr) { /* current will be the current element */ }
Функции
Есть пара способов определить функции в JavaScript. Общие виды использования:
function sum (a, b) { return a + b; } var sum = function (a, b) { return a + b; } // Using the ES6 arrow functions let sum = (a, b) => a + b;
Тогда вы можете вызвать функцию, как:
let result = sum(40, 2); // => 42
Конструкторы и классы
Есть пара способов получить классическую функциональность в JavaScript.
Заводские функции
Создание объекта и возвращая его.
function Person (name) { var self = {}; // Public field self.name = name; // Public method self.getName = function () { // `this` is the `self` return this.name; }; return self; } var p = Person("Alice"); console.log(p.getName()); // => "Alice"
Используя прототипы
Добавляя метод в Прототип
Объект функции, вы добавляете этот метод как общественный метод для всех случаев этого класса.
function Person (name) { this.name = name; } Person.prototype.getName = function () { // `this` is the `self` return this.name; }; var p = new Person("Bob"); console.log(p.getName()); // => "Bob"
Используя классы ES6
class Person { constructor (name) { this.name = name; } getName () { return this.name; } } var p = new Person("Carol"); console.log(p.getName()); // => "Bob"
Также очень легко наследовать классы в ES6:
class Musician extends Person { constructor (name, instrument) { // Call the base class super(name); this.instrument = instrument; } play () { console.log(`${this.getName()} is playing ${this.instrument}`); } } var me = new Musician("Johnny B.", "piano"); // Get the name of the musician, who is also a person console.log(me.getName()); // => "Johnny B." me.play(); // => "Johnny B. is playing piano."
Async vs sync.
Иногда вам нужно немного ждать, чтобы вещи были сделаны: например, при создании торта, вы должны работать над ним, и вы должны ждать некоторое время, чтобы он был готов. Самые знакомые вещи в нашей жизни асинхронные.
Синхронизация
Обычно синхронные операции отправляют ответ напрямую, используя Возвращение
ключевое слово:
// Synchronous sum function sum (a, b) { return a + b; } var result = sum(40, 2); // => 42
Async.
Чтобы иметь функцию Async, вам нужен источник асинхронизации. В этом примере мы будем использовать Сетримс
функция. Он принимает функцию в качестве первого аргумента (которая называется Функция обратного вызова ) и номер в качестве второго аргумента – представляющий задержку времени после того, как называется функции:
function asyncSum (a, b, cb) { setTimeout(function () { cb(a + b); // -----------+ This is the place }, 1000); // | where we call then } // V callback function asyncSum(40, 2, function (result) { console.log(result); // => 42 });
Что такое обратные вызовы?
Обратный вызов
s – это функции, которые отправляются в качестве аргумента для другой функции и вызывают, когда что-то происходит.
function Cake() { /* Just a dummy class-like constructor for now */ } // We won't make a ckae if we're busy var busy = false; function makeCake ( callback) { // If we're busy making a cake, send back an error if (busy) { return callback(new Error("Already busy with creating a cake. Please wait a bit and try again later.")); } // Well, if we weren't busy before, we are now busy = true; // Wait one second setTimeout(function () { // <- This is a callback function too. It is called after one second. // After one second we call the callback function callback(null, new Cake()); // After sending the cake, we're not busy anymore busy = false; }, 1000); } makeCake(function (err, cake) { if (err) { console.error(err); } console.log("Made a cake."); // => "Made a cake." }); // This will end with an error because we're busy already makeCake(function (err, cake) { if (err) { console.error(err); } // !=> "Already busy with creating a cake. Please wait a bit and try again later." console.log("Made a cake."); }); // Wait 2 seconds setTimeout(function () { // This will work again makeCake(function (err, cake) { if (err) { console.error(err); } console.log("Made a cake."); // => "Made a cake." }); }, 2000);
Обещания
Есть вещь называется Обещание Отказ Давайте посмотрим пример:
function sum (a, b) { return Promise(function (resolve, reject) { // Let's wait a second and only then send the response setTimeout(function () { if (typeof a !== "number" || typeof b !== "number") { return reject(new TypeError("Please provide two numbers to sum.")); } resolve(a + b); }, 1000); }); } var myPromise = sum(40, 2); myPromsise.then(function (result) { // After one second we have the response here console.log("> Summed 40 + 2: ", result); // Let's pass some invalid data and return another promise return sum(null, "foo"); }).then(function () { // This won't be called because we have an error }).catch(function (err) { // Instead, this `catch` handler is called: (after another second) console.error(err); // => Please provide two numbers to sum. });
Обещание может быть в одном из этих трех государств:
В ожидании
: Операция ожидаетсяВыполнено
: операция была законченаотклонено
: появилась ошибка, поэтому обещание – отклоненный
Document Packoverflow имеет хороший раздел о обещаниях здесь Отказ
Создавать и бросать ошибки
Чтобы создать ошибку, вы должны использовать Ошибка
. конструктор:
let myError = new Error("Something went really wrong."); // You can even append custom data here myError.code = "MY_FANCY_ERROR_CODE";
Чтобы бросить ошибку, вы должны использовать бросить
утверждение:
throw new Error("Something bad happened.");
Есть несколько типов ошибок. Например, если вы проверяете аргументы, переданные функции, используйте Типеррор
:
function sayHello(message) { if (typeof message !== "string") { throw new TypeError("The message should be a string."); } console.log(message); }
Обратные вызовы
Когда у вас есть интерфейс обратного вызова, это дружелюбие, чтобы отправить ошибки, используя функции обратного вызова.
Обещания
В обещаниях (даже на интерфейсе) это дружелюбнее отправлять ошибки, используя функции отклонения.
Обработка ошибок
В целом, это хорошая практика для проверки данных, которые вы передаваете на функцию (особенно когда они исходят с пользовательского ввода). Таким образом, вы можете избежать Типеррор
быть брошенным.
Если есть функция, которая бросает ошибку по дизайну, вы можете поймать его, используя попробуй - поймать
:
function assert (truly) { if (!truly) { throw new Error("Not true."); } } try { // This will *not* throw an error assert(42 === 42); // This will throw an error, so that will go in the catch assert(42 === -1); // Everything put after the place where the error was thrown // is not executed } catch (e) { console.error(e); // => Not true. }
Примечание. Если у вас есть ASYNC-функция (либо на основе обратного вызова, либо возвращая обещание), вы сделаете что-то подобное:
// Callback fetchDataFromServer(function (err, data) { if (err) { /* do something if you have an error */ } else { /* Do something with `data` */ } }); // Promise fetchDataFromServer().then(function (data) { /* Do something with `data` */ }).catch(function (err) { /* do something if you have an error */ });
Увеличение/уменьшение чисел
Вы можете увеличить имя переменной х
Использование ++ x
или х ++
Отказ Точно так же вы можете уменьшить его по --x
или X--
Отказ
Разница в том, что ++ x
( --x
) Возвращает увеличенное (уменьшенное) значение, а х ++
( X--
) Возвращает предыдущее значение х
Отказ
// Let's declare x let x = 42; // Store in y, the result of ++x let y = ++x; // Let's see the result console.log(`x is ${x} and y is ${y}`); → 'x is 43 and y is 43' // Now, store in y the result of x++. Note, x is now 43. y = x++; // Let's see again console.log(`x is ${x} and y is ${y}`); → 'x is 44 and y is 43' // So, `y` is 43, because `x++` returned the pre-incremented value (which was 43)
Петли
Это распечатает все целые числа от 1
к 42
Отказ
для
for (var i = 1; i <= 42; ++i) { console.log(i); }
Использование Для ... в ...
Может использоваться для случайных клавиш объектов:
var name = { first: "Johnny", last: "B." }; for (var key in name) { if (name.hasOwnProperty(key)) { console.log(key, name[key]); // "first", "Johnny" // "last", "B." } }
В ES6 есть Для ...
| также. Это довольно аккуратно, поскольку оно иташивает какие-либо намеки (массивы, строки и т. Д.).
let numbers = [-1, 7, 42, 64]; for (let num of numbers) { console.log(num); } // -1 // 7 // 42 // 64
пока
var i = 1; while (i <= 42) { console.log(i); ++i; }
делать пока
var i = 0; do { ++i; console.log(i); } while (i < 42);
Строгий режим
Строгий режим, когда включен, показывает потенциальные ошибки, сделанные разработчиком:
a = 42; // 42 "use strict"; b = 42; // Error: `b` is not defined
Регулярные выражения
Регулярные выражения очень веселые. Они разграничены косулью:
/^[0-9]+$/gm.test("a") // => false /^[0-9]+$/gm.test("42") // => true
Регулярное выражение имеет шаблон и флаги. Узор в этом примере это ^ [0-9] + $
-Мебан, если вход один или несколько цифр (из 0
до 9
), мы подтверждаем его – пока флаги G
(глобальный) и м
(многослойное).
Regex101.com это хороший ресурс для визуализации и совместного использования регулярных выражений с другими:
Регулярные выражения могут быть использованы для сопоставления вещей в строках, таких как цифры:
// Get all the numbers from this input (note you'll get an array of strings) > "Alice was born in 1974, so she's 42 years old in 2016.".match(/[0-9]+/g) [ '1974', '42', '2016' ] // Want to get numbers? Map them using the `Number` function > "Alice was born in 1974, so she's 42 years old in 2016.".match(/[0-9]+/g).map(Number) [ 1974, 42, 2016 ] // BE CAREFUL that if there's no match `match` will return `null` > "Bob is seven years old.".match(/[0-9]+/g) null
Кроме того, их можно использовать для заменить
Части струн:
// Mask all the digits of a credit card number, but the last 4 > "1234234534564567".replace(/\d(?=\d{4})/g, "*"); '************4567'
Полезные математические функции и константы
// Get the PI number > Math.PI 3.141592653589793 // Get the E number > Math.E 2.718281828459045 // Maximum between two numbers > Math.max(7, 42) 42 // Minimum between numbers (arguments) > Math.min(7, 42, 255, 264) 7 // Power > Math.pow(2, 4) 16 // Random number between 0 (inclusive) and 1 (exclusive) > Math.random() 0.2114640628617317 // Round > Math.round(41.8) 42
Есть тригонометрические функции, а также: грех
, COS
, Тан
, Атан
И т. Д. Обратите внимание, что эти требуют радианов. π радианов градусов Отказ
Даты
Используйте Дата
Конструктор для создания объектов даты.
var now = new Date(); now.getFullYear(); // => 2016
Если вы хотите иметь модные вещи, такие как даты форматирования и т. Д., Используйте библиотеки, такие как момент
или Daty
Отказ
Если вы заметите все, что можно улучшить, просто оставьте комментарий, и я буду рад внести изменения. 📝.