Sto provando a scrivere una funzione di aggiunta che funzionerà in molti scenari.Funzione "aggiungi" che funziona con diverse combinazioni di concatenamento/argomenti
add(2,2,2) //6
add(2,2,2,2) //8
add(2)(2)(2) // 6
add(2)(2)(2,2).value() //8
add(2,2)(2) + 2 //8
add(2).add(2) //4
add(2,2,2).add(2).add(2,2).value() //12
add(2,2,2).add(2).value() //8
Questo è quello che ho finora:
function add(){
var sum = 0;
for(var i in arguments){
sum += arguments[i];
}
var ret = add.bind(null, sum);
ret.value = function() {
return sum;
}
ret.add = function() {
for(var i in arguments){
sum += arguments[i];
}
return sum;
}
ret.valueOf = function(){ return sum; };
return ret;
}
console.log(add(2,2,2));
console.log(add(2,2,2,2));
console.log(add(2)(2)(2));
console.log(add(2)(2)(2,2).value());
console.log(add(2,2)(2) + 2);
console.log(add(2).add(2));
console.log(add(2,2,2).add(2).value());
console.log(add(2,2,2).add(2).add(2,2).value());
Sto avendo un problema con gli ultimi due casi:
add(2,2,2).add(2).add(2,2).value() //12
add(2,2,2).add(2).value() //8
Sembra che io dovrebbe continuare a nidificare le funzioni di aggiunta se volessi fare catena più di due insieme e aggiungiamo anche la funzione valore a ciascuno di essi, ma ovviamente mi manca qualcosa di semplice che mi permetta di incatenarli quanto mi piace e di chiamare il valore su ognuno di essi.
Inoltre devono sempre restituire int (non stringhe) e sembra che a volte lo facciano e altre volte no?
btw, non utilizzare "al" loop per scorrere array, poiché il ciclo for-in non ha ordine di iterazione garantita e può anche un'iterazione sulle proprietà non interi. Usa invece un ciclo regolare 'for (i = 0, i
hugomg
Stai provando a fare ** way ** a molto qui. Come esercizio di apprendimento potrebbe essere divertente, ma spero davvero che tu non stia cercando di usarlo al di fuori della sperimentazione inattiva. Questo tipo di ridicolo ingannevole sovraccarico di sintassi non ha spazio nel codice del mondo reale. – meagar
Se proprio ne hai bisogno, puoi semplicemente aggiungere la funzione al prototipo Number. Oppure creare un wrapper personalizzato che estenda l'oggetto Number in modo da non sporcare il prototipo originale. Non sono proprio sicuro del motivo per cui non puoi usare '+' anche se .. – SmokeyPHP