понедельник, 22 сентября 2014 г.

Strict mode Java Scipt

Strict mode - специальный режим выполнения с более жестким следованием стандартам и измененной в ряде случаев семантикой.

Активируется директивами "use strict"; или 'use strict'; , введенными в начале области видимости (скрипт или функция) до любых других директив.

Особенности режима:

1. Невозможность использования необъявленных переменных (как глобальных, так и внутри функции). Выдает исключение (ReferenceError):

a = 3;       // Неправильно
var a = 3;   // Правильно

2. Исключение (ReferenceError) при некоторых присваиваниях (раньше просто подавлялось): глобальные переменные только для чтения (типа NaN), присваивание геттеру, присваивание non-extensible объекту).

3. Исключение (SyntaxError) при использовании delete в ряде случаев (удаление переменной, аргумента, функции, свойства с атрибутом configurable = false).

4. Исключение (SyntaxError) при дублировании свойств объекта или параметров функции при определении.

var someObj = { prop1: 10, prop2: 10, prop1: 10; } // Ошибка!
function x(param, param) { return param*param; }   // Ошибка!

5. Исключение (SyntaxError) при использовании зарезервированных слов:
implements, interface, package, private, protected, public, static, yield.

6. Исключение (SyntaxError) при использовании восьмеричных чисел:

var testoctal = 001; // Ошибка!

7. Исключение (SyntaxError) при использовании оператора with.

8. Исключение (SyntaxError) при использовании вложенных функций (если они объявляются не в теле функции, а внутри выражения или блока).

9. Исключение (SyntaxError) при использовании eval или arguments в качестве пользовательского идентификатора (переменная или имя функции).

10. Исключение (ReferenceError) при использовании переменной, объявленной внутри блока eval вне этого блока.

11. В strict mode массив arguments содержит копии параметров, переданных функции, поэтому его редактирование не изменяет сами параметры.

function x(param1, param2, param3) {
    arguments[0] = 4;
    return param1;
}

console.log(x(1,2,3));    // 1 - в обычном режиме, 4 - strict mode.

12. Исключение (ReferenceError) при использовании свойств caller, callee объекта arguments.

13. this не преобразуется в указатель на глобальный объект, если его значение null или undefined.

Для получения ссылки на Global Object можно использовать следующий код, работающий в обоих режимах:

var global = (0, eval)('this');

суббота, 20 сентября 2014 г.

ОПЕРАТОРЫ в JavaScript


Математические операции

Результаты мат. операций дополняются значениями Infinity, -Infinity, NaN


Унарные: +, -
Бинарные: +, -, *, /, % (остаток от деления).


Бинарный + при хотя бы одном нечисленном аргументе приводит оба аргумента к строковому типу (приведение к строке начинается на первом строковом аргументе, до этого все числовые операции выполняются. 2 + 2 + “aaa” = “4aaa”    “aaa” + 2 + 2 = “aaa22”). Все остальные армифметические операции приводят результат к числу.




Присваивание также возвращает значение (равное присвоенному значению)
alert (x = 3) присвоит значение 3 переменной х и вернет 3.


Побитовые операторы

Унарные: ~ - not
Бинарные: | - or, & - and, ^ - xor, сдвиги - <<, >>. >>>


<< n - сдвиг влево на n бит с заполнением нулями справа и отбрасыванием битов слева.
>> n - сдвиг влево на n бит с заполнением знаковым битом слева (0 для положительных и 1 для отрицательных чисел) и отбрасыванием битов справа.
>>> n - сдвиг влево на n бит с заполнением нулями слева и отбрасыванием битов справа


Применение:


a ^ b ^ b = a - xor можно использовать для примитивного шифрования.
a ^ 0 - получение целочисленной части числа a
|, & - битовые флаги при проверке прав доступа.
~n - проверка на -1 (только при n=-1 возвращается 0)
- степение двойки.

При использовании побитовых операторов переменные скрыто приводятся к 32-битовому знаковому целому.


Оператор запятая (,) - выполняет последовательность действий до и после запятой и возвращает значение последнего из них. Часто используется при определении переменных и задании начальных условий циклов.


При сравнении операнды преобразуются к числам (в т.ч. и булевские значения). Для строго сравнения без приведения типов используются операторы === и !==
null == undefined // true
null === undefined // false
null и undefined равны друг другу и не равны чему бы то ни было еще.


При этом
null >= 0, null <= 0 // true, true


Условные операторы


if (cond1) { do1; } else if (cond2) { do2; } else { do3; }

switch(x) {
 case 'value1':  // if (x === 'value1')
   ...
   [break]
 case 'value2':  // if (x === 'value2')
   ...
   [break]
 default:
   ...
   [break]
}

При отсутствии break выполняются все оставшиеся операторы switch без проверки условий.
Результат вычисления логического выражения 0, ‘’ (пустая строка), NaN, undefined расценивается как false, все остальные - true.


Важно! {}, [], “0”, “ “ - true.


Краткое условие - условие ? значение1 : значение2
Допускается составная конструкция:
var res = (x == 1) ? 'val1' :
(x == 2) ? 'val2' :
'val3';


Логические операторы


||, &&, ! - или, и, не

Если условий несколько, то для "И" выполнение прекращается на первом false, для "ИЛИ" - на первом true.

Вместо краткого условного оператора можно использовать логические операторы:

x === 3 && 10 || 5 эквивалентно x === 3 ? 10 : 5;
x === 1 && 10 || x === 2 && 20 || x === 3 && 30 : 40; - составной условный оператор.


Циклы


while (cond) { // body }
do { // body } while (cond)

for ([begin]; [cond]; [step]) { // body }

ТИПЫ ДАННЫХ JavaScript

Общие сведения


number, string, boolean, null, undefined, object
function - разновидность объекта, но тоже считается типом данных.


Для целочисленных и дробных значений выделяется 8 байт памяти (усекается до 4-х при битовых операциях).


Строковый тип


.length - возвращает длину строки
.charAt(n) - возвращает строку, содержающую символ в позиции n (нумерация с 0),
пустая строка, если символ отсутствует..
str[n] - аналогично charAt(), но возвращает undefined, если строка отсутствует.


Строки не меняются, не редактируются, только заменяются на новые (переопределяются).


.toLowerCase(), .toUpperCase() - приведение к нижнему/верхнему регистру.
.substring(start [, end]) - возвращает подстроку с позиции start до,
но не включая end (до конца, если end не указан). Отрицательные значения второго аргумента приравниваются к 0.
.substr(start [, length]) - как и substring, но второй аргумент содержит не конечную
позицию, а количество символов.
.slice(start [, end]) - как и substring, но отрицательные значения второго аргумента
отсчитываются от конца строки.
.fromCharCode(code) - возвращает символ по коду code.
.charCodeAt(pos) - возвращает код символа на позиции pos. Отсчет позиции
начинается с нуля.
Числа


Помимо десятичной возможно использование шестнадцатиричной (0x23ab) и восьмеричной (003, 07) системах, а также в “научном формате” (23e3 = 23 000, 23e-3 = 0,023). .toString([n])  - преобразование в систему по основанию n (по умолчанию 10, от 2 до 36). В т.ч. и дробные.


Приведение к числу производится унарным плюсом. Преобразование строгое (не число = NaN)
+false = 0 +true = 1 +null = 0 +undefined = NaN +”” = 0


Мягкое преобразование - parseInt(), parseFloat(). Отсекает пробельные символы в начале, останавливается на первой ошибке. При невозможности получить число возвращает NaN.
parseInt(“12px”) = 12; parseInt(“1.2.3”) = 1.2; parseInt(“str15”) = NaN;


0/0 = Infinity + -Infinity = Infinity / Infinity = Infinity - Infinity = NaN
a/0 = Infinity * Infinity = Infinity + Infinity = Infinity + a = Infinity (а - число)


isNan(n) = true не только для n = NaN, но и для любых нечисел ({}, undefined, "foo"), которые становятся NaN в результате преобразования к числу.

Для строгой проверки можно использовать функцию:

function isReallyNaN(x) { return x !== x; }

NaN в соответствии со стандартом не равно само себе любая операция с ним также возвращает NaN.

isFinite(Infinity) = isFinite(-Infinity) = isFinite(NaN) = false, иначе true

Существует два нуля (по стандарту IEEE754) - положительный и отрицательный. Оба равны друг другу и одинаково выглядят в консоли. В редких случаях, когда важен знак нуля (важно с какой стороны к нему подобрались) можно использовать функцию Object.is.

var x = -10/Infinity; // -0
Object.is(x, 0);      // > false
Object.is(x, -0);     // > true

Этой же функцией можно проверять объекты на равенство NaN.


Округление


Math.floor() - вверх, Math.ceil() - вниз, Math.round() - до ближайшего целого.


Побитовые операции, не изменяющие число, аналогичны Math.round().  Например, ~~x или x ^ 0.


.toFixed([n])- округляет до n-го знака после запятой (от 0 - по умолчанию до 20), возвращает строку.
+(price1 + price2).toFixed(2)


Преобразование типов


При преобразовании в число null становится 0, а undefined - NaN.
true/false => 1/0
Строки преобразуются по алгоритму:
  1. Отрезать все пробелы
  2. Если остается пустая строка, то 0.
  3. Если строка не пустая, то считываем число с начала. Если числа нет (буквы, пробелы, отделяющие точку от числа), то NaN.
Численное преобразование происходит при сравнении разных типов. Явно его можно произвести вызвом функции Number или использованием унарного плюса (var a = +”22”;)


При преобразовании в строку - ‘null’,‘undefined’,`true’, `false’ соответственно.
Строковое преобразование происходит в функциях вывода (console.log(), alarm()). Явно его можно произвести функцией String() или бинарным плюсом, если один из аргументов этого оператора - строка.

При преобразовании к логическому значению false становятся только undefined, null, 0, NaN, “”. Все остальное - true. Логическое преобразование происходит при использовании логических операторов или в логическом контексте (if, while). Явное преобразование можно произвести функцией Boolean() или двойным отрицанием (!!a).