Destructuring assignment

0
        set(x, y, element) {
		var coord;

		if(typeof arguments[0] === "object") {
			[coord, element] = arguments;
			({x, y} = coord); // hmm Oo
		}

		this.grid[x][y] = element;
	}

	get(x, y) {
		if(typeof arguments[0] === "object") {
			var {x, y} = arguments[0]; // no wlasnie.. 
		}
		
		return this.grid[x][y];
	}

Kod testowy

                let coord = {
			x: 10, y: 10
		};
		this.grid.set(coord, "coord");
		console.log(this.grid.get(10, 10));


		this.grid.set(15, 15, "normal");
		console.log(this.grid.get(15, 15));

Pierwsze z arrayem jak najbardziej działa bez podania var, bo element jest zadeklarowany jako parametr, a coord kilka linijek wyżej.
Zgodznie z tym co piszą na mozilli:

The ( .. ) around the assignment statement is required syntax when using object literal destructuring assignment without a declaration.

Nie powinno być konieczne użycie nawiasów.. a jednak. ({x, y} = coord); - wtf przecież x, y też są zadeklarowane jako parametry (tak samo jak element). Wciskanie var'a tam odpada bo biorąc pod uwagę hoisting to jak nie podam obiektu to otrzymam 2x undefined. W takim razie co robią te nawiasy i dlaczego są konieczne?

Dałem tam console.log i wypluł 2x undefined (x i y), a dla foo Uncaught ReferenceError: foo is not defined więc wychodzi na to, że są zadeklarowane, ale w tej linijce var {x, y} = arguments[0]; // no wlasnie.. js juz o tym zapomina

0
Desu napisał(a):

Nie powinno być konieczne użycie nawiasów.. a jednak. ({x, y} = coord); - wtf przecież x, y też są zadeklarowane jako parametry (tak samo jak element). Wciskanie var'a tam odpada bo biorąc pod uwagę hoisting to jak nie podam obiektu to otrzymam 2x undefined. W takim razie co robią te nawiasy i dlaczego są konieczne?

Czytaj ze zrozumieniem przede wszystkim, bo w dokumentacji jest opisane, że nawiasy są konieczne jeśli nie połączysz przypisania z deklaracją... I nie robisz tego w swoim kodzie, więc wszystko się zgadza. Reguła, żeby nie zaczynać wyrażenia od nawiasu klamrowego w JS (co prowadzi do dwuznaczności dla parsera) nie istnieje od wczoraj, tak samo jak możliwość ominięcia tego przez zastosowanie nawiasów okrągłych.

Desu napisał(a):

Dałem tam console.log i wypluł 2x undefined (x i y), a dla foo Uncaught ReferenceError: foo is not defined więc wychodzi na to, że są zadeklarowane, ale w tej linijce var {x, y} = arguments[0]; // no wlasnie.. js juz o tym zapomina

Tam w sensie gdzie? Foo jest undefined, bo nie ma tego w Twoim kodzie. Co więcej, wyrwałeś ten fragment trochę z kontekstu, bo nie mam pojęcia na co wskazuje this, ani czym jest grid... Nie można po prostu wstawić kodu do jsfiddle?

0

A ja zawsze myślałem, że:

function foo(a, b) {console.log(a, b, c);} 

// to
//function foo( var a = undefined, var b = undefined ) {} 

foo(); // undefined, undefined, Uncaught ReferenceError: c is not defined(…)

Z tego wynika, że a i b zostają zadeklarowane, bo tylko c sypie errorem.

Rozumiem w takim razie, że zadeklarowanie musi być dokładnie w tej lini gdzie korzystam z destructuring assignment mimo to, że zmienne są już zadeklarowane??

W takim razie myliłem się w jeszcze jednej rzeczy. Myślałem, że hoisting tak działa, że przeniesie mi to na góre i var a spowoduje var a = undefined, a tu sie okazuje ze tez g**no prawda?

1 użytkowników online, w tym zalogowanych: 0, gości: 1