Показать сообщение отдельно
  #1 (permalink)  
Старый 11.02.2018, 19:26
Аватар для Leon-on12
Аспирант
Отправить личное сообщение для Leon-on12 Посмотреть профиль Найти все сообщения от Leon-on12
 
Регистрация: 07.04.2015
Сообщений: 65

Значение или ссылка при копировании объекта, и что производительнее?
Есть некоторый объект, в моём случае это карта уровня(речь пойдёт о значениях в массивах):
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
Ответить с цитированием