On Github get-focus / formation-js
A retenir on utilise const au maximum et let dans les autres cas
'déjà' < 'demain' // => false
'déjà'.localeCompare('demain') // => -1 ('déjà' avant 'demain')
'déjà !'.toLocaleUpperCase() // => 'DÉJÀ !'
'ÇA POUTRE'.toLocaleLowerCase() // => 'ça poutre'
'one,two,three'.split(',') // => ['one', 'two', 'three']
'one,,two,three'.split(/\W+/) // => ['one', 'two']
'hello'.substring(1) // => 'ello'
'hello'.slice(1, -2) // => 'el' -> [1;length-2[
new Date // maintenant ! new Date(y,m,d[,h,m,s,ms]) // Valeur découpée. (un peu lourd...) date.getFullYear() // JAMAIS date.getMonth() // NAZE Java-like qui démarre à… zéro (janvier). #ugly date.getDay() // PERDUUUU ! C'est le DOW (Day Of Week), 0 = dim., 6 = s date.getDate() // Le jour du mois. Super logique. date.getHours() date.getMinutes() date.getSeconds() date.getMilliseconds() // "Milliseconds", un seul mot : une seule initiale. // Heure locale du navigateur/système. On a les mêmes en getUTCXxx()…
// "J'ai bien lu la doc" date.getTime() // => ex. 1290852603042 // "#superSmart" +date // Et sinon… new Date(1301733937452) // Mais aussi (car souci pour partir de composantes UTC) : Date.UTC(y, m, d, h, mn, s, ms) // => numérique
let obj = { first: 'David', last: 'Lopez', age: 77 };
obj.first // => 'David'
obj['age'] // => 42
obj.first = 'pierr';
obj['first'] // => 'pierr'
obj[77] = 'roberto';
obj[77] // => 'roberto'
obj['77'] // => 'roberto'
obj.77 // => SyntaxError
let defaults = { first: 'John', last: 'Doe', age: 42 };
let trainer = { last: 'Smith', age: 35 };
trainer = { ...defaults, ...trainer, age: 36 }
// => { first: 'John', last: 'Smith', age: 36 }
trainers['a'+ 12] = 'Gino';
trainers.a12;
// Gino
let names = ['John', 'David', 'Rodrigo']; names.length // => 3. R/W : astuce pour réutiliser un tableau! names[0] // => 'John' names[12] = 'Pierre'; names.length // => 13 names[9] // => undefined (comme 10 et 11): c'est appelé "sparse array"
const ARRAY = [1,2,3,4];
for(let i = 0, _l=ARRAY.length; i < _l; i++ ){console.log(ARRAY[i])}
ARRAY.forEach(function(element, idx){console.log(element, idx)});
ARRAY.map(function(element, idx){console.log(element, idx)});
function maFonction() {
return 'test';
}
maFonction() // test;
const a = () => 'test';
a(); //test
== ou === ?! 42 == '42' // => true -- Argh, ça sent le PHP, là… null == undefined // => true -- hmmm… null == 0 // => false -- heureusement ! 0 == undefined // => false -- heureusement ! 0 == false // => true -- Façon C… 1 == true // => true -- Façon C… 42 == true // => false -- Watcha ?! (x == ToNumber(y), ES3 §11.9.3) '0' == false // => true -- Woah ! '' == false // => true -- Yowza ! 8-O On y reviendra… NaN == NaN // => false -- Bin oué, c’est le principe…
// avec ===, fini de jouer : vérif valeur ET TYPE ! 42 === '42' // => false null === undefined // => false null === 0 // => false 0 === undefined // => false 0 === false // => false '0' === false // => false NaN === NaN // => false -- rien à faire !On utilise toujours le ===
let person = { name: 'Joe', langs: ['fr', 'en'] };
'name' in person // => true
person.age = 35;
'age' in person // => true
person.age = null;
'age' in person // => true
delete person.age
'age' in person // => false
person.age // => undefined
0 in person.langs // => true
'0' in person.langs // => true
person.langs[3] = 'de';
2 in person.langs // => false
3 in person.langs // => true
delete person.langs[3]
person.langs // => ['fr', 'en', undefined, undefined]
<menu id="file" value="File">
<popup>
<menuitem value="New" onclick="CreateNewDoc()"></menuitem>
<menuitem value="Open" onclick="OpenDoc()"></menuitem>
<menuitem value="Close" onclick="CloseDoc()"></menuitem>
</popup>
</menu>
{
"menu": {
"id": "file",
"value": "File",
"popup": {
"menuitem": [
{ "value": "New", "onclick": "CreateNewDoc()" },
{ "value": "Open", "onclick": "OpenDoc()" },
{ "value": "Close", "onclick": "CloseDoc()" }
]
}
}
}
//Avant
const monElement = $('[data-my-selector]');
//Après
const monElement = document.querySelector('[data-my-selector]');
/* bling.js */
window.$ = document.querySelectorAll.bind(document);
Node.prototype.on = window.on = function (name, fn) {
this.addEventListener(name, fn);
}
NodeList.prototype.__proto__ = Array.prototype;
NodeList.prototype.on = NodeList.prototype.addEventListener = function (name, fn) {
this.forEach(function (elem, i) {
elem.on(name, fn);
});
}
Voir le gist de Paul Irish
function Person(first, last) {
this.first = first;
this.last = last;
}
var joeLopezPerson = new Person('Joe', 'Lopez');
var davidLopezz = new Person('David', 'lopez');
joeLopezPerson.first // => 'Joe'
davidLopezz.first // => 'David'
// Si on jouait aux cons ?!
function LopezPerson(first, last) {
this.first = first;
this.last = last;
return { first: 'Anne', last: 'Pas Lopez' };
}
var oops = new LopezPerson('Henry', 'Lopez');
oops.first // => Anne
function Person(first, last) {
this.first = first;
this.last = last;
}
// On augmente l'existant…
Person.prototype.fullName = function fullName() {
return this.first + ' ' + this.last;
}
Person.prototype.greet = function greet() {
alert('Salut je m’appelle ' + this.first);
}
var john = new Person('John', 'Smith');
john.fullName() // => 'John Smith'
john.greet() // 'Salut je m’appelle John'
function Person(first, last) {
this.first = first;
this.last = last;
this.fullName = function fullName() {
return this.first + ' ' + this.last;
}
this.greet = function greet() {
alert('Salut je m’appelle ' + this.first);
}
}
var john = new Person('John', 'Smith');
john.fullName() // => 'John Smith'
john.greet() // 'Salut je m’appelle John'
Pas bon... on copie le truc dans chaque constructeur
class TodoItem extends Component {
constructor(props, context) {
super(props, context);
this.state = {
editing: false
};
}
handleDoubleClick() {
this.setState({ editing: true });
}
…
}
Attention il s'agit de sucre syntaxique pas d'une classe comme en Java ou .NET. Le JS reste un langage prototypale.
function Person(first, last) {
this.first = first;
this.last = last;
}
Person.prototype.fullName = function fullName() {
return this.first + ' ' + this.last;
};
const davidLopez = new Person('David', 'Lopez');
davidLopez.first // => 'David', own property
davidLopez.fullName() // => 'David Lopez', Person.prototype
davidLopez.toString() // => '[object Object]', Object.prototype
Person.prototype.toString = function personToString() {
return '#Person ' + this.fullName();
};
davidLopez.toString() // => "#Person David Lopez"
function publicFx() {
let dateAppel = Date.now();
return function() { console.log(dateAppel); };
}
let privilegedFx1 = publicFx();
// Attendre un bref instant
let privilegedFx2 = publicFx();
// privilegedFx(1,2) sont en fait les fonctions internes construites au
// sein de publicFx, qui grâce aux règles de portée "voient"
// dateAppel. Elles sont *closed over* par publicFx, ce qui fait
// que les valeurs de dateAppel au moment où les fonctions ont été
// renvoyéees sont préservées
privilegedFx1(); // => affiche la dateAppel du moment de la création de la fonction privilegedFx1!
privilegedFx2(); // => affiche la dateAppel d'après !
function yourModule(require, module, exports) {
let widgets = {};
let util = require('util');
let Widget = require('widgets/base');
function CoolWidget(elt) { … }
util.inherits(CoolWidget, Widget);
// …
module.exports = Widget;
}
Dans node on ne voit pas la fonction enrobante...
var name = 'Mr X';
let obj = {
name: 'Joe Lopez',
greet: function greet(whom) {
console.log(this)
console.log(this.name + ' salue ' + whom);
},
greetAll: function greetAll(first, second, last) {
console.log(this)
[first, second, last].forEach(this.greet);
}
};
obj.greet("les lopezs de France");
// => 'Joe Lopez salut les lopezs de France !'
let fx = obj.greet;
fx("l’atelier") // => '"Mr X salue l’atelier"'
obj.greetAll('David', 'Joe', 'Guénolé'); // => 'Mr X salue David, Mr X salue Joe, Mr X salue undefined'
const obj = {
// …
greetAll: function greetAll(first, second, last) {
var that = this;
[first, second, last].forEach(function(name) {
that.greet(name);
});
}
}
const obj = {
// …
greetAll(first, second, last) {
[first, second, last].forEach(name => this.greet(name));
//Ultra fat
}
}
//let fx = obj.greet;
fx.call(obj, 'les singes') // Joe Lopez salue les singes
let xy = { 0: 'Zero', 1: 'One', length: 2 };
Array.prototype.join.call(xy, '-') // 'Zero-One'
fx.apply(obj, ['']) // => 'Joe salue l’atelier'
Array.prototype.push.apply(xy, ['Two', 'Three', 'Four']) // => 5
xy // => { 0: 'Zero', 1: 'One', 2: 'Two', 3: 'Three', 4: 'Four', length: 5 }
function delayedAlert() {
window.setTimeout(slowAlert, 2000);
}
function slowAlert() {
alert("That was really slow!");
}
Une promesse a un état (pending, fullfilled, rejected). Elle est asynchrone, et se termine soit par un succès soit par une erreur et renvoie une nouvelle promesse.
promise.then(successCb,errorCb).then(otherSuccess, otherCb).catch(errorHandlingFn)
const myPromise = new Promise((resolve, reject) => {
ajaxCall({success: resolve, error: reject});
})
Promise.resolve([1,2,3,4]);
Promise.reject('ma super erreur')
fetch('/users.json')
.then(function(response) {
return response.json()
}).then(function(json) {
console.log('parsed json', json)
}).catch(function(ex) {
console.log('parsing failed', ex)
})
//Dans un fichier
module.exports = monObjetAExporter;
//Utilisation
require('./mon_module_locale');
//Utilisation d'un module npm
require('mon_module');
import * as types from '../constants/ActionTypes';
export function addTodo(text) {
return { type: types.ADD_TODO, text };
}
import React, { PropTypes, Component } from 'react';
import classnames from 'classnames';
import { SHOW_ALL, SHOW_COMPLETED, SHOW_ACTIVE } from '../constants/TodoFilters';
import 'http://material.js'
…
export default Footer;
export const ADD_TODO = 'ADD_TODO';
export const DELETE_TODO = 'DELETE_TODO';
export const EDIT_TODO = 'EDIT_TODO';
const { activeCount } = this.props;
…
const { filter: selectedFilter, onShow } = this.props;
const [, filters] = output.props.children;
…
const [,, clear] = output.props.children;
var { op: a, lhs: { op: b }, rhs: c } = getASTNode();
Détails
const person = { first: 'Thomas', last: 'Anderson', age: 25, nickname: 'Neo' };
// Interpolation de JS quelconque
console.log(`${person.first} aka ${person.nickname}`)
// => 'Thomas aka Neo'
// Multi-ligne !
const markup = `<li>
${person.first} ${person.last}, age ${person.age}
</li>`;
function add(source, numToAdd = 1){
return source + numToAdd;
}
function editTodo(id, text) {
return { type: types.EDIT_TODO, id, text };
//On créé un objet avec pour clef le nom de la variable.
}
const FILTERS = {
[maVar1]: 'All',
[maVar2]: 'Active',
[maVar3]: 'Completed'
};