В данной статье я хочу немного рассказать о возможностях 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/
10.12.2014