Pourquoi
"JavaScript c'est nul ?"

C'est populaire

Les memes marchent mieux ^^

There are only two kinds of languages: the ones people complain about and the ones nobody uses.

Fait en 10 jours

en 1995, rien à voir avec le JavaScript aujourd'hui

Langage forcé

Pas le choix côté navigateur

Runtime imprévisible

Les navigateurs ont leur propre implémentation du JavaScript

Trop d'outils

Prendre en compte les navigateurs

Trop de modules !

A

C v1.0

B

C v2.0

node_modules

a

b

node_modules

c

node_modules

c

A

C ^1.0

B

C ^1.1

node_modules

a

b

c

A

C v1.0

B

C v2.0

Accident left-pad

Le problème n'est pas lié au JavaScript

Trop de librairies

Revenons au langage

Asynchrone & Callback

fs.readdir(source, function (err, files) {
  if (err) {
    console.log('Error finding files: ' + err)
  } else {
    files.forEach(function (filename, fileIndex) {
      console.log(filename)
      gm(source + filename).size(function (err, values) {
        if (err) {
          console.log('Error identifying file size: ' + err)
        } else {
          console.log(filename + ' : ' + values)
          aspect = (values.width / values.height)
          widths.forEach(function (width, widthIndex) {
            height = Math.round(width / aspect)
            console.log('resizing ' + filename + 'to ' + height + 'x' + height)
            this.resize(width, height).write(dest + 'w' + width + '_' + filename, function(err) {
              if (err) console.log('Error writing file: ' + err)
            })
          }.bind(this))
        }
      })
    })
  }
})

Asynchrone & Callback

Résolu grâce aux promesses

const files = await readdir(source)

for (const file of files) {
	const file = await readFile(file)
    // ...
}
const files = await readdir(source)
const filesContent = await Promise.all(
  files.map(file => readFile(file))
)

Langage incohérent

[] + [] // ''
[] + {} // Object
{} + [] // 0
{} + {} // NaN

Langage incohérent

[3, 10, 1].sort() // [1, 10, 3]
['1', '2', '3']
  .map(parseInt) // [1, NaN, NaN]

Pas de typage

Mais il y a TypeScript

Seulement à la compilation

Injection de dépendance

<?php
class MaClass {

  private Dep1 $dep;

  function __construct(Dep1 $dep) {
  	  $this->dep = $dep;
  }

}

NestJS

import { Injectable } from '@nestjs/common';
import { Cat } from './interfaces/cat.interface';

@Injectable()
export class CatsService {
  private readonly cats: Cat[] = [];

  findAll(): Cat[] {
    return this.cats;
  }
}
import { Controller, Get } from '@nestjs/common';
import { CatsService } from './cats.service';
import { Cat } from './interfaces/cat.interface';

@Controller('cats')
export class CatsController {
  constructor(private catsService: CatsService) {}

  @Get()
  async findAll(): Promise<Cat[]> {
    return this.catsService.findAll();
  }
}

Adonis

import Route from '@ioc:Adonis/Core/Route'

Route.post('add-to-cart', async ({ request, response }) => {
  /**
   * Read cookie by name
   */
  const existingItems = request.cookie('cart-items', [])

  /**
   * Set/update cookie
   */
  const newItems = existingItems.concat([{ id: 10 }])
  response.cookie('cart-items', newItems)
})

Route.delete('clear-cart', async ({ response }) => {
  /**
   * Clear cookie
   */
  response.clearCookie('cart-items')
})

Single thread

Single thread

slice := []string{"a", "b", "c", "d", "e"}
sliceLength := len(slice)
var wg sync.WaitGroup
wg.Add(sliceLength)
for i := 0; i < sliceLength; i++ {
    go func(i int) {
        defer wg.Done()
        slowFunction(slice[i])
    }(i)
}
wg.Wait()
const slice = ["a", "b", "c", "d", "e"]
for (const item of items) {
    slowFunction(item)
}
function readFile(id) {
  const {file} = await mysql.first('SELECT file FROM files WHERE id = ?', [id])
  const content = await readFile(file)
  await mysql.execute('INSERT INTO post SET content = ?', [content])
}

await readFile(3)

Être critique est important

Comprendre c'est mieux

JavaScript c'est nul

By Jonathan Boyer

JavaScript c'est nul

  • 411