Значение или ссылка при копировании объекта, и что производительнее?
Есть некоторый объект, в моём случае это карта уровня(речь пойдёт о значениях в массивах):
var levelTest={ "y":{ "20":[[20,100]], "24":[[40]], "28":[[75]], "30":[[20,50],[60,100]] }, "x":{ "20":[[20]], "40":[[20,24],[32,40]], "75":[[20,28],[36,40]] } }; Есть функция копирующая этот объект попутно преобразующая значения координат из относительных(100 в ширину и 120 в высоту) в реальные положения пикселей(конкретные места присвоения указаны комментариями) function testLevelToPixel(){ levelTestPix.x={}; levelTestPix.x.mass=[]; for (xx in levelTest.x){ levelTestPix.x.mass.push(xPixel(xx)); levelTestPix.x[xPixel(xx)]=[]; for (var i=0;i<levelTest.x[xx].length;i++){ levelTestPix.x[xPixel(xx)][i]=[]; levelTestPix.x[xPixel(xx)][i][0]=function(){return yPixel(levelTest.x[xx][i][0])};//Присвоение первого элемента if(levelTest.x[xx][i][1]){ levelTestPix.x[xPixel(xx)][i][1]=function(){return yPixel(levelTest.x[xx][i][1])+xPixel(1);}//Присвоение второего эелемента if (levelTest.x[xx][i][0]%1>0&&levelTest.x[xx][i][1]%1>0) levelTestPix.x[xPixel(xx)][i][2]="<>"; else if(levelTest.x[xx][i][0]%1>0) levelTestPix.x[xPixel(xx)][i][2]=">"; else if(levelTest.x[xx][i][1]%1>0) levelTestPix.x[xPixel(xx)][i][2]="<"; }else{ levelTestPix.x[xPixel(xx)][i][1]=yPixel(levelTest.x[xx][i][0])+xPixel(1);//Присвоение второго элемента, при особых случаях } wallRender(xPixel(xx),levelTestPix.x[xPixel(xx)][i],true); } } } функция приведена не полностью, так как вторая часть функции абсолютно такая же, только для "y". Встала задача сделать значения в массивах изменяемыми путём замены в копируемом объекте констант на функции. levelTestPix.x[xPixel(xx)][i][1]=yPixel(levelTest.x[xx][i][1])+xPixel(1); --> levelTestPix.x[xPixel(xx)][i][1]=function(){return yPixel(levelTest.x[xx][i][1])+xPixel(1) /*+T*/;} Вопрос номер один, в такой компоновки внутри функции будет ссылка на функцию yPixel() и соответственно ссылки на levelTest.x[xx][i][1], или же всё таки значения? И в случае таком, что будет фигурировать в конечной функции, или как в конечную функцию прописать значения? var const=yPixel(levelTest.x[xx][i][1])+xPixel(1); levelTestPix.x[xPixel(xx)][i][1]=function(){return const/*+T*/;} И второй вопрос производительности, есть функция которая использует скопированный объект, что будет отрабатываться быстрее: Если я каждое значение сделаю функцией и буду каждый раз вызывать эту функцию даже если она function(){return const} obj[aaa][i][0]=obj[aaa][i][0](); Или же добавить проверку на функцию: if (typeof obj[aaa][i][0] == 'function') { obj[aaa][i][0]=obj[aaa][i][0]()} else{ obj[aaa][i][0]=obj[aaa][i][0] } функции yPixel и xPixel имеют следующих вид: wID = window.innerHeight<window.innerWidth?window.innerHeight:window.innerWidth; hEI = window.innerHeight>window.innerWidth?window.innerHeight:window.innerWidth; yZer = Math.round(hEI-wID*1.2); function yPixel(y){ return Math.round(y*wID/100+yZer); } function xPixel(x){ return Math.round(x*wID/100); } Всё это подели лежит на http://poe.bl.ee/ipoint, текст рассматриваемой функции на http://poe.bl.ee/ipoint/point.js |
https://jsperf.com/ -тест производительности
|
Часовой пояс GMT +3, время: 15:33. |