Aller au contenu principal
Version: 20

Null et Undefined

Null et Undefined sont des types de données qui gèrent les cas où la valeur d'une expression n'est pas connue.

Null

Null est un type de données particulier avec une seule valeur possible : null. Cette valeur est retournée par une expression qui ne contient aucune valeur. Trying to read a property of a null value returns an error.

Dans le langage de 4D et pour les attributs des champs objets, les valeurs null sont gérées via la commande Null. Cette commande peut être utilisée avec les expressions suivantes pour fixer ou comparer la valeur null :

  • attributs d'objets
  • éléments de collections
  • variables of the object, collection, pointer, picture, or variant type (see also Null as default value.

Undefined

Undefined (Indéfinie) n'est pas véritablement un type de données. Il indique une variable n'ayant pas encore été définie. L'évaluation d'une propriété d'objet peut également produire une valeur undefined. Reading a property of an undefined value returns undefined.

A variant variable has undefined as default value.

Un champ ne peut pas être indéfini (la commande Indefinie retourne toujours Faux pour un champ).

En règle générale, lorsque le code tente de lire ou d'assigner des expressions indéfinies, 4D générera des erreurs, excepté dans les cas suivants :

  • Assigning an undefined value to variables (except arrays) has the same effect as calling CLEAR VARIABLE with them:
     var $o : Object
var $val : Integer
$val:=10 //$val=10
$val:=$o.a //$o.a is undefined (no error), and assigning this value clears the variable
//$val=0
  • L'affectation d'une valeur indéfinie à une propriété d'objet existante réinitialise ou efface sa valeur, selon son type :
    • Objet, collection, pointeur : Null
    • Image : image vide
    • Booléen : False
    • Chaîne : ""
    • Numérique : 0
    • Date : !00-00-00! si la base utilise le type date pour les objets, sinon ""
    • Heure : 0 (nombre de ms)
    • Indéfini, Null : pas de changement
     var $o : Object
$o:=New object("a";2)
$o.a:=$o.b //$o.a=0
  • L'affectation d'une valeur indéfinie à une propriété d'objet inexistante ne fait rien.

  • Une valeur indéfinie passée en paramètre à une méthode projet est automatiquement convertie en 0 ou en "" en fonction de la déclaration du type du paramètre.

     var $o : Object
mymethod($o.a) //pass an undefined parameter

//In mymethod method
#Declare ($myText : Text) //parameter type is text
// $myText contains ""
  • Une expression de condition est automatiquement convertie à Faux lorsqu'elle est évaluée undefined avec les mots-clés If et Case of :
     var $o : Object
If($o.a) // false
End if
Case of
:($o.a) // false
End case
tip

Lorsque des expressions d'un type donné sont attendues dans votre code 4D, vous pouvez vous assurer qu'elles auront le type souhaité même en cas de valeur Indéfinie en les encadrant avec la commande de transtypage 4D appropriée : String, Num, Time, Date, Bool. Ces commandes retournent une valeur vide du type spécifié lorsque l'expression est évaluée à Indéfinie. Par exemple :

 $myString:=Lowercase(String($o.a.b)) //pour être sûr d'obtenir une valeur texte même si indéfinie
//afin d'éviter des erreurs dans le code

Opérateurs sur les Null

OpérationSyntaxeRetourneExpressionValeur
EgalitéNull = NullBooleana.nullProp = b.nullPropTrue
Null = UndefinedBooleana.nullProp = b.undefinedPropTrue
Null = valeur scalaireBooleana.nullProp = 42False
InégalitéNull # NullBooleana.nullProp # b.nullPropFalse
Null # UndefinedBooleana.nullProp # b.undefinedPropFalse
Null # scalar valueBooleana.nullProp # 42True

Les valeurs scalaires sont des valeurs de type chaîne, date, heure, booléen, nombre ou Blob. Lorsqu'elles sont déclarées, leur valeur par défaut n'est ni undefined ni null. Les autres types (pointeur, image, objet, collection) ont une valeur par défaut undefined ou null. Ex :

var $object : Object
var $text : Text

//$object = null
//$text = ""
info

Les comparaisons avec les opérateurs Supérieur à (>), Inférieur à (<), Supérieur ou égal à (>=), et Inférieur ou égal à (<=) ne sont pas prises en charge avec des valeurs Null et renvoient une erreur.

Opérateurs sur les Undefined

OpérationSyntaxeRetourneExpressionValeur
EgalitéUndefined = UndefinedBooleana.undefinedProp = b.undefinedPropTrue
Undefined = NullBooleana.undefinedProp = c.nullPropTrue
Undefined = autres valeursBooleana.undefinedProp = 42False
InégalitéUndefined # UndefinedBooleana.undefinedProp # b.undefinedPropFalse
Undefined # NullBooleana.undefinedProp # b.nullPropFalse
Undefined # autres valeursBooleana.undefinedProp # 42True
Supérieur àUndefined > string, Date, Time, numberBooleana.undefinedProp > "abc"False
Inférieur àUndefined < string, Date, Time, numberBooleana.undefinedProp < "abc"False
Supérieur ou égal àUndefined >= string, Date, Time, numberBooleana.undefinedProp >= "abc"False
Inférieur ou égal àUndefined <= string, Date, Time, numberBooleana.undefinedProp <= "abc"False

autres valeurs sont des expressions de tout type dont la valeur n'est ni Undefined ni Null.

info

Comparisons of Undefined values with Pointer, Picture, Boolean, Blob, Object, Collection, Undefined or Null values using Greater than (>), Less than (<), Greater than or equal to (>=), and Less than or equal to (<=) operators are not supported and return an error.

Exemples

Cet exemple compare les différents résultats de la commande Undefined et de la commande Null appliquées aux propriétés d'objets, en fonction du contexte :

var $vEmp : Object
var $result : Boolean
$vEmp:=New object
$vEmp.name:="Smith"

$vEmp.children:=Null

$result:=Undefined($vEmp.name) //False
$result:=($vEmp.name=Null) //False

$result:=Undefined($vEmp.children) //False
$result:=($vEmp.children=Null) //True

$result:=Undefined($vEmp.parent) //True
$result:=($vEmp.parent=Null) //True

Exemples de résultats de comparaisons avec des valeurs undefined et null :

var $result : Boolean
var $vObj : Object
var $vVar : Variant

$vObj:=New object
$vObj.null:=Null
//note that $vVar is not assigned

$result:=($vObj.undefined=42) //False
$result:=($vObj.undefined=$vObj.null) //True
$result:=($vObj.undefined=$vVar) //True

$result:=($vObj.undefined#$vObj.null) //False
$result:=($vObj.undefined#42) //True
$result:=($vObj.undefined#$vVar) //False

$result:=($vObj.undefined>"hello") //False
$result:=($vObj.undefined>$vVar) //Error
$result:=($vObj.undefined>$vObj.null) //Error
$result:=($vVar < 42) //False