Руби в JavaScript
Краткое руководство для рубистов, начинающих JS210
Переменные
- Объявление локальной переменной:
let schoolName = 'Launch School';
- Объявление постоянной переменной:
const SCHOOL_NAME = 'Launch School';
- Необъявленная переменная с глобальной областью действия:
schoolName = 'Launch School';
(не делайте этого)
camelCase
для локальных переменных (и функций)SCREAMING_SNAKE_CASE
для констант- Мы также можем создавать переменные с помощью оператора
var
с датой:var weather = 'Sunny';
var
— это функция (странно), аlet
— блочная область (нормально)
Кое-что, о чем нужно знать, потому чтоlet
иconst
— недавние добавления - Локальные переменные имеют ожидаемую область действия блока, за исключением того, что они доступны внутри функций (эквивалент методов JS):
// Example 1 let dog = 'Banjo'; function example() { // curly braces delimit the function body console.log(dog); } example(); // Banjo console.log(dog); // Banjo // Example 2 function example() { let dog = 'Banjo'; console.log(dog); } example(); // Banjo console.log(dog); // ReferenceError: dog is not defined
Функции
- С точки зрения Ruby, функции JS — это методы с мягкой логикой и тем, что по сути является блочной областью действия.
- Фигурные скобки
{}
, окружающие тело функции, не определяют блок. Тела функций и блоки различны. Однако они настолько похожи, что тела функций обычно называют блоками. - Неявный возврат
undefined
за исключениемпри использовании стрелочной функции с одним выражением. В этом случае JS позволяет нам опустить ключевое словоreturn
. - Для явного возврата требуется ключевое слово
return
- Параметры по умолчанию работают как положено
- Объявление функции:
function hello() { …
(начинается сfunction
) - Выражение именованной функции:
let hello = function hello() { …
(полезно для отладки) - Выражение анонимной функции:
let hello = function () { …
(обычное) - Стрелочная функция: сокращенный способ написания выражения функции:
let greeting = (arg1, arg2) => { …
Обычно используется в функциях обратного вызова: функция передается в качестве аргумента другой функции. :
// Example 1 arr.forEach((ele, idx) => console.log(ele, idx)); // Example 2 arr.forEach((ele, idx) => { console.log(ele, idx); if (ele === 1) arr2.push(ele); })
- Чистая функция:функция без побочных эффектов и с возвращаемым значением, определяемым только ее аргументами.
- Параметр Rest:похож на splat в Ruby, принимает любое количество аргументов и делает их доступными в виде элементов массива:
function dogNames(…args) { …
- Функции — это объекты первого класса: они могут быть назначены переменной или элементу коллекции, переданы в качестве аргумента функции или возвращены функцией.
Объекты
- Мы можем думать об объекте JS как о хеше Ruby.
- У объектов есть пары имя/значение, называемые свойствами.
- На свойства ссылаются и создают с помощью точечной нотации (предпочтительно) или скобочной нотации:
let obj = {num: 5, str: 'dog'}; console.log(obj.num); // 5 console.log(obj['num']); // 5 obj.wowz = 'powz'; console.log(obj); // { num: 5, str: 'dog', wowz: 'powz' } obj.wowz = 'zowz'; console.log(obj); // { num: 5, str: 'dog', wowz: 'zowz' }
- Имя свойства должно быть строкой (кавычки можно не ставить, как указано выше). Значение свойства может быть выражением функции, массивом, объектом, строкой, числом или любым допустимым выражением:
let obj = { num: 5, str: 'dog', arr: [1, 2, 3], obj: {hello: 'goodbye'}, bool: true, add(num1, num2) { // compact method syntax return num1 + num2; }, 'multiple words': 'this works', }; console.log(obj.add(1, 2)); // 3 // add is a 'method' because it is part of an object // compact method syntax saves us from // add: function add(num1, num2) { // return num1 + num2; // },
Массивы
- Массивы работают почти так же, как и в Ruby. Они имеют нулевой индекс: индексы начинаются с 0, а
arr.length
возвращает последний индекс + 1. - Массивы — это тип объекта: индексы — это имена, а элементы — значения.
arr[-1]
не ссылается на последний индекс- Мы можем создавать разные пары n/v в массиве, но не в литерале:
let arr = [1, 2, 3]; arr[3] = 4; arr[-11] = 'wow!'; arr['hello'] = 'bye'; console.log(arr[3]); // 4 console.log(arr['hello']); // bye console.log(arr[-11]); // wow! console.log(arr); // [ 1, 2, 3, 4, '-11': 'wow!', hello: 'bye' ] let arr2 = [1, 2, 3, 4, '-11': 'wow!', hello: 'bye']; // SyntaxError: Unexpected token ':' // Note the type coercion
- Все пары n/v являются свойствами. Неотрицательные целые имена по умолчанию являются обычными свойствами индекса. Все остальные свойства не учитываются при определении длины массива. Они также не обрабатываются другими методами массива:
let arr = [1, 2, 3]; arr[3] = 4; // new element increases length arr[-11] = 'wow!'; // does not increase length arr['hello'] = 'bye'; // does not increase length console.log(arr.length); // 4 console.log(arr); // [ 1, 2, 3, 4, '-11': 'wow!', hello: 'bye' ] arr.forEach(ele => console.log(ele)); // 1 // 2 // 3 // 4
- Свойства массива обозначаются точечной нотацией (предпочтительнее) или скобочными скобками:
console.log(arr.hello); // bye
илиconsole.log(arr['hello']); // bye
. - Просмотреть все названия свойств с
console.log(Object.keys(arr));
- В разреженном массиве есть пробелы. Промежутки можно создать, увеличив свойство
length
:
console.log(arr); // [ 1, 2, 3, 4, '-11': 'wow!', hello: 'bye' ] arr.length = 20; console.log(arr); // [ 1, 2, 3, 4, <16 empty items>, '-11': 'wow!', hello: 'bye' ]
Заявление о переключении
- JS-эквивалент оператора case в Ruby
- Используйте
break
в каждой ветке. Break предотвращает «выпадение» выполнения из истинной ветки:
let dog = 'Banjo'; // Example 1 switch (dog.charAt(1)) { case 'a': console.log('a is at 1'); break; case 'n': console.log('n is at 1'); break; default: console.log('neither'); break; } // => a is at 1 // Example 2 switch (dog.charAt(2)) { case 'a': console.log('a is at 2'); break; case 'n': console.log('n is at 2'); default: console.log('neither'); break; } // n is at 2 // neither
Разнообразный
- Нет синтаксического сахара для
()
- Заканчивайте операторы с помощью
;
, кроме объявленийfunction
иclass
и операторовif
,for
,while
. - Строки неизменяемы
===
вместо==
(==
выполняет приведение типов)console.log(arg)
вместоputs arg
- Фальшивые:
0
,false
,‘’
,undefined
,null
,NaN
if
синтаксис оператора:
let type = 'Dog'; if (type === 'Dog') { console.log('Banjo'); } else if (type === 'Cat') { console.log('Scruffers'); } else { console.log('Crumps'); }
if (var) console.log(var2);
orvar && console.log(var2);
`hello ${name}`
вместо"hello #{name}"
{}
ограничивает блок, за исключением объявления функции или окружения литерала объекта.typeof
вместо.class
forEach
вместоeach
(но нельзя преждевременно прерывать итерацию)- CoderPad JS по умолчанию использует строгий режим