# Javascript => Bases pour React
React à 2 paradigmes. Avant on utilisait les classes maitenant on utilise des fonctions. React tend vers la programmation fonctionnelle
[Hosting]
## Hoisting
```
foo();
function foo(){
console.log("hosting soit foo en avant ou apres ca affiche il recheche et le trouve")
}
//foo();`
```
## fonctions flechées et classiques
```
const add = (a,b) => {
return a +b
}
console.log(add(2,5))
```
devient quand on a just eun return
```
const add = (a,b) => a +b
console.log(add(2,5))
```
## THIS - Mot clé this
**exemple 1:**
fonction flechée
```
const myObj = {
foo:()=>{
console.log(this)
}
}
myObj.foo();
```
this avec une fonction flechée va faire appel au context engloblant donc windows
**Exemple 2:**
devient fonction classique
```
const myObj = {
foo(){
console.log(this)
}
}
myObj.foo();
```
le this appel au context appellant qui l'objet donc myObj
Autres exemples
```
console.log("affichage 1",this);=> window
function teste(){
console.log("affichage 2",this);
}
teste(); => window
const father = {
meth: ()=>{
console.log("affichage 3",this);
}
}
father.meth(); => window
const father1 = {
metha(){
console.log("affichage 4",this);
}
}
father1.metha(); => objet appelant
const father2 = {
metha:function(){
console.log("affichage 5",this);
}
}
father2.metha()=>objet appelant
```
### Spread operator (etendre) # Rest operator
pour copier le 1er niveau d'un tableau , on utilise le **spread operator**
```
const tab1 = [1, 2, 3];
const tab2 = [...tab1, 4];
console.log(tab2);
// on aura Array(4) [ 1, 2, 3, 4 ]
```
pour un objet
```
const myObj1 = {
a: 1,
b:2,
c:3
}
const myObj2 = {
...myObj1,
d: 4,
}
console.log(myObj2);
```
Le **rest operator** est utilsé quand on connait pas le nombre d'argument mettre dans une fonction
```
function add(... args){
let result = 0;
for (const arg of args){
result +=arg
}
return result
}
console.log(add(2,3,5,8,5))
```
## Fonctions pures
C'est une fonction qui retourne tout le temps la même chose si on lui passe tous le temps les meme arguments et qui ne va pas toucher à un environnement exterieur tout se passe dans la fonction.
**fonction impure**
```
let x =2;
function add1(y){
return x+= y // la fonction est dependante de la variable x
}
console.log(add1(6))
=>8
console.log(add1(6))
=>14
console.log(add1(6))
=>20
resultat different à chaque appel.
```
**fonction pure**
function add1(a,b){
return a+ b
}
console.log(add1(2,2))
=>4
console.log(add1(2,2))
=>4
console.log(add1(2,2))
=>4
meme resultat à chaque appel et ne depend pas d'un environnement exterieur.
## Fonctions d'ordre superieur
C'est quand une fonction prend en parametre une autre fonction.
> les fonctions d'ordre supérieur qui prennent d'autres fonctions comme arguments ou renvoient des fonctions comme résultats.
**Fonction callback** est une fonction qui se fait appeller par une autre fonction.
exemple on a ce code.
```
const rawArr = [233, 200, 100, 8099, 1500];
const tab = [];
for (let i = 0; i < rawArr.length; i++) {
if (rawArr[i]>500) {
tab.push(rawArr[i])
}
}
console.log(tab)
le resultat sera la valeur superieur à 500
```
devient
```
const rawArr = [233, 200, 100, 8099, 1500];
function add(arr, fn){
const tab = [];
for (let i = 0; i < arr.length; i++) {
if (fn(arr[i])) {
tab.push(arr[i])
}
}
return tab;
}
const tableau100 = add(rawArr, (item)=>{
if(item > 100){
return item;
}
})
const tableau500 = add(rawArr, (item)=>{
if(item > 500){
return item;
}
})
console.log(tableau100)
console.log(tableau500)
```
la fonction est devenue plus modulable.
Les fonctions d'ordre superieur avec map, filter, forEach, reduc, sort, every et some
voir :
https://ichi.pro/fr/7-fonctions-javascript-d-ordre-superieur-utiles-que-vous-devez-connaitre-92136447455531
Les fonctions d'ordre supérieur en JavaScript sont très utiles et importantes. Ils nous permettent de réaliser plus de choses avec moins et un code propre. Je recommande vraiment de les pratiquer car ils vous facilitent la vie en tant que développeur JavaScript.
## Destructuring
avec les tableaux ou les objets
```
const pays = {
nom: "Senegal",
pop: 100
}
pas gerable quand y'a trop de données. il faut à chaque fois ettre dans une variable.
const nom = pays.nom
const pop = pays.pop;
console.log(nom, pop);
```
vaut mieux utiiliser le destructuring
```
const pays = {
nom: "Senegal",
pop: 100
}
const {nom, pop} = pays
console.log(nom, pop)
```
ou pour un parametre avec la fonction flechée
```
ça attend un objet et ça vas creer une variable nom . on va l'utiliser avec les props
const pays = {
nom: "Senegal",
pop: 100
}
const data = ({nom})=> nom
console.log(data(pays));
```