JavaScript – стандартный (де-факто) язык скриптования Web-страниц, выполняемый в браузере. По сей причине является наиболее используемым языком программирования, несмотря на значительные проблемы языка (поведение кода нередко оказывается неочевидным, разительно различается для разных типов, и даже может зависеть от используемого браузера – написание кода, гарантированно работающего везде и всегда как задумано, задача весьма нетривиальная). Общую справку по стандарту JavaScript можно найти, в частности, здесь и здесь.
В браузерах реализована возможность использовать написанные на JavaScript интерпретаторы/трансляторы (в JS) для выполнения скриптов на других (более удобных) языках; также транслирование в JS может выполняться предварительно, как компиляция (в этом случае транслятор может быть написан не на JavaScript). Примеры: CoffeeScript, ClojureScript.
Также виртуальные машины для выполнения JS существуют отдельно от браузеров ("headless WebKit"); они предназначены для автоматизированного тестирования JS-кода, и для повторного использования части кода на сервере (хотя в последнее время для этой цели нередко используются транслируемые на JS языки). На DL для тестирования JS используется PhantomJS версии 1.9.8.
(Внимание: запуск на DL выполняется внутри скрипта, изменяющего поведение по умолчанию: в частности, при ошибке работа PhantomJS завершается с кодом 1, а отсутствующие методы строк заменены эквивалентными реализациями.)
Вместо компиляции производится проверка синтаксиса программой JavaScript Lint (основанной на JS-движке Firefox) со слегка изменённым набором правил (заархивированная версия).
Основы языка
true, false null undefined 5, 5., .5, 0.5, Infinity, NaN 'a', "b", 'cd', "ef" [], [1, 2, 'a', null, NaN] {}, {key: 'value'}, ...
Синтаксис заимствован большей частью из C, так что операторы похожи.
a == b, a != b a === b, a !== b +a, a + b, a += b, a++ -a, a - b, a -= b, a-- a * b, a / b, a % b a *= b, a /= b, a %= b a & b, a | b, a ^ b a && b, a || b a << b, a >> b a <<= b, a >>= b (a ? b : c)
Правда, с операторами нужно быть осторожным – их поведение может оказаться довольно неожиданным:
'5,6' == [5.0,6.] '5, 6' != [5, 6] 5 === 5.0000000000000001 null !== undefined [] + [] [] - [] [] + {} {} + [] {} + {} [5] + "9" [5] - "9" null || undefined || NaN || 0 undefined || 0 || 9 || 0
Общие правила синтаксиса похожи на C.
something { do1();
do2();
}
p = 'a';
q = "b";
var x = {value: 0};
var
y = "1",
z = [y, 3];
let i = 0;
let
j = 4,
k = [3, j];
const
a = 9;
const
b = "8",
c = [b, NaN];
if (condition)
doSomething();
else
doSomethingElse();
switch (variable) {
case value1:
do1();
break;
case value2:
case value3:
do2();
break;
default:
do3();
}
for (init(); condition; step())
doStuff(i);
while (condition)
doSomething();
do {
doSomething();
} while (condition);
function s (arg1, arg2) {
doThings([arg1, arg2]);
}
var func = function (args) { doThings(args) };
const f = function fact (n) {
return ((n < 2) ? n : (n * fact(n-1)));
};
Ввод-вывод (+PhantomJS)
Для доступа к операциям ввода-вывода нужно использовать библиотеку PhantomJS:
const
sys = require('system'), fs = require('fs');
Также имеется модуль под названием phantom, подключаемый автоматически.
Поскольку обычный JS-скрипт (в web-странице) никогда не "завершается", при решении задач на программирование вызывается команда завершения:
Поскольку в браузере JavaScript всегда подключён к (обычно скрытому) REPL, в нём есть команды вывода в консоль:
console.log(some, things); console.error(message);
PhantomJS предоставляет ввод-вывод посредством файловых объектов:
var
fin = fs.open("input.txt", 'r'),
s1 = fin.readLine(), s2 = fin.read(L), s3 = fin.read(); fin.close();
var
fout = fs.open("output.txt", 'w');
fout.write(s2); fout.writeLine(s1); fout.close();
Для работы с консолью он предоставляет файловые объекты stdin, stdout и stderr:
const s = sys.stdin.readLine();
sys.stdout.writeLine(s);
sys.stderr.writeLine(s);
Примеры
const sys = require('system');
function readAll (fin) {
const l = fin.readLine().split(' ');
return {a: parseInt(l[0]),
b: parseInt(l[1])};
}
function printAll (fout, res) {
fout.writeLine(res);
}
calc = function (o) { return o.a + o.b };
printAll(sys.stdout, calc( readAll(sys.stdin) ));
или
const sys = require('system');
const
l = sys.stdin.readLine().split(' '),
a = l[0], b = l[1];
console.log(parseInt(a) + parseInt(b));