Que se passe-t-il avec les boolean du Javascript ?

L'objet boolean et la valeur boolean.

Le problème exposé dans ce sujet a été résolu.

Bonjour les agrumes :D

En ce moment je vois certaines choses à propos du javascript que je ne comprends pas.

Je ne parle pas de choses comme cela:

new Date("nonsens") // InvalidDate

Je comprends que le javascript prend une voie sur laquel il doit fonctionner à tout prix plutôt que de relever une erreur?

Je pense plutôt à des choses comme celles-ci:

var b = new Boolean(false)

if (b) {
    console.log("b is true")
} else {
    console.log("b is false")
} // b is true

Le type Boolean du javascript me fais penser à ce qui se passe en java (avec la différence entre int et Integer).
Cependant ce que je ne comprends pas c’est que le comportement de l’objet Boolean soit différent du comportement avec la valeur boolean.

Cependant si on prend ce code:

var b = new Boolean(true)

if (b == true) {
    console.log("b is true")
} else {
    console.log("b is false")
} // b is true

Il fonctionne comme prévu.

Il est vrai que le javascript à un typage faible, auquel cas il y a une conversion de l’objet Boolean en valeur. En prenant en compte cet élement on comprend ce qui se passe dans le premier exemple (comme expliqué dans la documentation).

Cependant l’exemple suivant n’est pas intuitif.

var b = new Boolean(true)

if (b === true) {
    console.log("b is true")
} else {
    console.log("b is false")
} // b is false

On utilise l’opérateur === qui n’effectue pas de convertion de type.

Pourquoi avoir un objet Boolean si troublant ?

+0 -0

Salut,

Boolean est un objet, il se comporte donc comme tous les autres objets en JavaScript. Il n’y a pas d’exception qui a été créé pour donner le résultat qu’on attend. C’est écrit dans la doc, d’ailleurs :

Any object of which the value is not undefined or null, including a Boolean object whose value is false, evaluates to true when passed to a conditional statement.

Boolean dans la documentation MDN

La vraie question est : pourquoi existe-t-il un wrapper du genre ?

Autre chose bizarre : comment ont-ils décidé que Boolean(a) !== new Boolean(a) était une bonne idée ?

Le fait que Boolean(a) !== new Boolean(a) me semble assez intuitif.
D’un coté il y a un type converti (donc sans doute un objet) et de l’autre un a une nouvelle instance d’un objet.

Si les objets référencent les données en mémoire, les références ne sont pas identique, c’est pourquoi on a un différence.

+1 -0

Salut,

Si les objets référencent les données en mémoire, les références ne sont pas identique, c’est pourquoi on a un différence.

C’est pas super convaincant. Quand on fait du JS, on s’intéresse pas souvent à la position en mémoire des objets manipulés, mais plutôt à leur valeur.

De la même façon, avoir un cast automatique de n’importe quel type vers des booléens qui soit fondamentalement réduit à un is_null() plutôt que d’avoir un rôle potentiel de la valeur pour caster la valeur plutôt que la validité (qui devrait être encodée dans le type en premier lieu !) n’est pas très satisfaisant.

Le fond de la réponse à la question "Pourquoi avoir un objet Boolean si troublant ?" est "parce que concevoir un bon système de types ne s’improvise pas". Dans ce cas particulier, le type Boolean est un patch bricolé pour avoir des booléens nullables.

+5 -0

La vraie question est : pourquoi existe-t-il un wrapper du genre ?

tleb

En fait, il existe un wrapper pour chaque type primitif. On se rend compte qu’ils correspondent aux constructeurs de chacun de ces types:

> [1, "str", true].map(x => x.constructor)
[ [Function: Number], [Function: String], [Function: Boolean] ]

La principale utilité que je connaisse (si ce n’est la seule) est celle de pouvoir stocker un "type" dans une variable. Cela permet par exemple de valider le type d’une autre variable:

let type = Boolean
let b = true
console.assert(b.constructor == type, "b doit être un booléen")

C’est d’ailleurs ce qu’on fait notamment avec Vue.js lorsqu’on définit les props d’un composant:

app.component("truc", {
  props: {
    name: String,
    amount: Number,
    enabled: Boolean
  },
  template: `
    <p v-if="enabled">{{ name }}: {{ amount }}</p>
  `,
})
Connectez-vous pour pouvoir poster un message.
Connexion

Pas encore membre ?

Créez un compte en une minute pour profiter pleinement de toutes les fonctionnalités de Zeste de Savoir. Ici, tout est gratuit et sans publicité.
Créer un compte