Управленческий консалтинг
Бизнес-решения и приложения
Инновации и разработки
Поддержка и сопровождение

В данной статье я хочу немного рассказать о возможностях js-а, о которых я не находил документации на scn-е, но о которых, на мой взгляд было бы полезно знать тем, кто изучает или работает с SAP HANA XS. В статье будут рассмотрены итераторы, динамические аргументы функций, простой способ копирования объектов, объект Map , небольшой пример по каррингу, ну и на закуску пример по типизированным массивам.

Код, описания, пояснения:

Итератор – это объект, который представляет из себя некую последовательно и позволяет обратиться к следующему объекту этой последовательность с помощью специального метода – next() Для понимания принципа работы итератора – достаточно посмотреть на следующий код:

function Generator(){

yield "num1";

yield "num2";

for (var i = 0; i < 3; i++)

yield i;

}

var g = Generator();

var temp1 = g.next();

var temp2 = g.next();

var temp3 = g.next();

$.response.setBody(temp1+', '+temp2+', '+temp3+' ');

$.response.contentType = "text/html";

Результатом данного теста будет строка –

num1, num2, 0

Оператор yield – позволяет сформировать генератор, который ставит на «паузу» а также запускает далее выполнение кода.

Предлагаю рассмотреть более комплексный пример:

function vals() {

for (var i = 0; i < arguments.length; i++) {

yield arguments[i];

}

}

var o = vals(1, 2, 'abc');

var temp = o.next();

temp = temp+o.next();

temp = temp+o.next();

$.response.setBody(temp);

$.response.contentType = "text/html";

В этом примере также формируется итератор. Но уже количество в последовательности зависит от количества аргументов в функции.

Результатом здесь будет

3abc

Почему 3 – потому что o.next() вернёт по очереди все аргументы, но переменная temp сначала будет Number, а после того, как вернётся третий аргумент – станет string-ом.

Если же мы поменяем порядок вызова аргументов, например так:

var o = vals('abc',1, 2);

То результат уже будет такой:

аbc12

В следующем примере представлена функция, которая превращает любые объекты в символьное представление. Функция, обратная функции eval – uneval. Один из самых очевидных способов её применения – это копирование объектов.

var m = function () {this.a = 1};

var temp = new m();

temp.am_i_copy = 0;

var h = temp;

var h2 = eval(uneval(temp)); //easy method to copy objects

h2.am_i_copy = 1;

$.response.setBody(h2.am_i_copy+' - '+h.am_i_copy);

$.response.contentType = "text/html";

Результатом будут

1 – 0

То есть h – ссылается на temp. Оператором = мы указали на него же.

А объект h2 – это уже новый объект – клон, поэтому когда мы присваем свойству am_i_copy - 1-у исходный h – не меняется.

Следующий пример – это описание объекта Map(). Map позволяет оперировать парой – ключ, значение. Здесь мы формируем массив пар значений, а потом добавляем к нему результат выполнения метода.

var res = [];

var Maper = new Map();

Maper.set(0, "zero");

Maper.set(1, "one");

Maper.set(2,function() {return 1;})

for (var [key, value] of Maper) {

res.push({k:key,v:value});

}

var temp = Maper.get(2)();

res.push({t:temp});

$.response.setBody(JSON.stringify({res:res}));

$.response.contentType = "text/html";

Результат выполнения будет таков:

{"res":[{"k":0,"v":"zero"},{"k":1,"v":"one"},{"k":2},{"t":1}]}

Тут хочется отметить случай, когда ключ равен 2-ум. JSON не понимает функций, поэтому значения value здесь нет. Если же мы слегка изменим строку

res.push({k:key,v:value});

на строку

res.push({k:key,v:uneval(value)});

с уже известным uneval, то результатом будет описание всех объектов, которые были добавлены в объект Maper:

{"res":[{"k":0,"v":"\"zero\""},{"k":1,"v":"\"one\""},{"k":2,"v":"(function () {\n\"use strict\";\nreturn 1;})"},{"t":1}]}

Следующий пример будет интересен тем, кто никогда не видел карринга на java-script-е.

Здесь представлен пример возможностей java-script, а именно при первом вызове curry_concat – возвращается другая функция, которую мы опять вызываем:

function curry_concat(x){

return function(y){

return x +' '+ y;

}

}

var a = curry_concat('Test')('Curry');

$.response.setBody(a);

$.response.contentType = "text/html";

Результатом будет :

Test Curry

Ниже вариант проверки себя. Я специально не стал приводить результат выполнения. Что вернут эти 4 строчки кода, как Вы думаете?

var x = new Uint8ClampedArray([-47]);

var x1 = new Uint8Array([-47]);

$.response.setBody('Clamped -' + x[0]+'; NoClamped'+x1[0]);

$.response.contentType = "text/html";

Заключение

По поводу последнего примера – если сообществу будет интересна данная тема – в будущем напишу подробную статью о плюсах и минусах использования типизированных массивов.

Кроме представленных здесь функций – есть также и другие, которые не представлены в стандартной документации. Возможно, это тоже будет интересно…

(Если у вас код не отработал – не спешите писать в комментарий, что он не работает, а попробуйте понять сами;) )

Автор – Дмитрий Буслов, ведущий консультант группы компаний БДО Юникон

Источник: http://sapland.ru/