Bien que Javascript soit un langage faiblement typé, il possède également plusieurs types de données qui lui sont propres, à savoir : Nombre, Chaîne, Booléen, Objet, Udéfini et Null. Parmi eux, Object est un type de données complexe et Object se compose de paires clé-valeur non ordonnées. Les autres types sont des types de données simples. Remarque : La première lettre du type de variable est en majuscule, tandis que la première lettre de la valeur de la variable est en minuscule.
JavaScript ne prend pas en charge les types personnalisés, donc toutes les valeurs en JavaScript appartiennent à l'un de ces six types.
Selon la spécification ECMAScript 5.1, il existe six types de données en JavaScript, à savoir : Non défini, Null, Booléen, Nombre, Chaîne et Objet. Les cinq premiers sont des types de base et le dernier est le type Objet.
Le dernier ECMAScript 6 ajoute un autre type : Symbole (nouvelle définition ECMAScript 6)
Types de données de base
Non défini : il n'y a qu'une seule valeur, non définie, qui signifie "aucune valeur" et s'applique à tous les types de données.
Null : il n'existe qu'une seule valeur, null, qui signifie « aucun objet » et s'applique uniquement aux types d'objet. (littéralement)
Booléen : Il existe deux valeurs, vrai et faux
Nombre : la valeur est une collection de nombres à virgule flottante de 64 bits conformément à la norme IEEE 754, et il n'existe pas de structure de données entière. De plus, il contient également trois valeurs spéciales : NaN, Infinity, -Infinity
Chaîne : la valeur est une collection de caractères Unicode finis. Doit être entouré de 'ou'.
1. Chaîne
Le type de chaîne JavaScript est utilisé pour représenter des données texte. Il s'agit d'un "élément" d'un ensemble de valeurs entières non signées de 16 bits. Chaque élément de la chaîne occupe une position dans la chaîne. Le premier élément a l’indice 0, le suivant a l’indice 1, et ainsi de suite. La longueur d'une chaîne est le nombre de ses éléments
Contrairement au langage C, les chaînes en JavaScript sont immuables (Annotation : par exemple, les opérations sur les chaînes en JavaScript doivent renvoyer une nouvelle chaîne et la chaîne d'origine n'a pas été modifiée)
Tout en Javascript est basé sur les objets
Créer une chaîne, il existe deux types
1. La chaîne créée à l'aide de la méthode littérale est le type de base de chaîne //string
2. La chaîne créée à l'aide de String() est un type de chaîne de base // string
3. La chaîne créée à l'aide du constructeur new String() est de type objet //string
var str1 = "javascript"; //string
var str2 = String("javascript"); //chaîne non recommandée
var str3 = new String('javascript'); //objet
Il y a aussi une différence entre objet et chaîne
s1 = "2 2"; // crée une primitive de chaîne
s2 = new String("2 2"); // crée un objet String
console.log(eval(s1)); // renvoie le nombre 4
console.log(eval(s2)); // renvoie la chaîne "2 2"
Conversion des objets chaîne valueof -》 string
console.log(eval(s2.valueOf())); // renvoie le nombre 4
2.booléen
Ne confondez pas la valeur originale vrai faux avec l'objet booléen dont la valeur est vrai faux
1. Si le paramètre du constructeur booléen n'est pas une valeur booléenne, le paramètre sera converti en valeur booléenne
2. Si le paramètre est 0, -0, null, false, NaN, non défini ou une chaîne vide (""), la valeur de l'objet booléen généré est fausse. Toute autre valeur, y compris tout objet ou chaîne. " false", créera un objet booléen avec une valeur true
var x = new Boolean(false); if(x){ console.log(x.valueOf(),typeof x); // false object }
Ce qui précède sera exécuté, code très magique
Ne convertissez pas une valeur non booléenne en valeur booléenne en créant un nouvel objet booléen. Il est correct d'utiliser directement la fonction booléenne
.var x = Boolean(expression); // 这样用 var x = new Boolean(expression); // 而不要这样! 初始化的时候 //false var bNoParam = new Boolean(); var bZero = new Boolean(0); var bNull = new Boolean(null); var bEmptyString = new Boolean(""); var bfalse = new Boolean(false); //true var btrue = new Boolean(true); var btrueString = new Boolean("true"); var bfalseString = new Boolean("false"); var bSuLin = new Boolean("Su Lin");
3. Numéro
Selon la norme ECMAScript, il n'existe qu'un seul type de nombre en JavaScript : une valeur binaire double précision de 64 bits (-(253 -1) à 253 -1) basée sur la norme IEEE 754. Il ne donne pas de type spécifique pour les entiers. En plus de pouvoir représenter des nombres à virgule flottante, il existe également des valeurs signées : Infinity, -Infinity et NaN (Not-a-Number)
Le type numérique n'a qu'un seul entier, qui peut être représenté de deux manières : 0 peut être représenté par -0 et 0 ("0" est l'abréviation de 0). En pratique, cela a également peu d’impact. Par exemple 0 === -0 est vrai. Cependant, vous voudrez peut-être faire attention lorsque vous divisez par 0 :
42/0; // Infini
42/-0; // -Infini
Si l'argument ne peut pas être converti en nombre, NaN est renvoyé.
Dans un contexte non constructeur (c'est-à-dire sans nouvel opérateur), Number peut être utilisé pour effectuer une conversion de type
est un jugement de type NAN
Number.isNaN(NaN); // true Number.isNaN(Number.NaN); // true Number.isNaN(0 / 0) // true // e.g. these would have been true with global isNaN() Number.isNaN("NaN"); // false Number.isNaN(undefined); // false Number.isNaN({}); // false Number.isNaN("blabla"); // false // These all return false Number.isNaN(true); Number.isNaN(null); Number.isNaN(37); Number.isNaN("37"); Number.isNaN("37.37"); Number.isNaN(""); Number.isNaN(" ");
原型链继承的关系
console.log(Number.prototype.__proto__ == Object.prototype); //true
console.log(Number.prototype.__proto__.__proto__ == Object.prototype.__proto__);//true
console.log(Object.prototype.__proto__ === null);//true
console.log(typeof Number);//function
使用 Number 转换 Date 对象
var d = new Date("December 17, 1995 03:24:00");
console.log(Number(d));
四、Null
null 是一个 JavaScript 字面量,表示空值(null or an "empty" value),即没有对象被呈现(no object value is present)。它是 JavaScript 原始值 之一。
null 是一个字面量 (而不是全局对象的一个属性,undefined 是 )
console.log(null); //null
console.log(undefined);//undefined
console.log(window.null);//undefined
console.log(window.undefined);//undefined
null与undefined的区别
console.log(foot);//Uncaught ReferenceError: foot is not defined var foo; console.log(foo);//undefined var bar =null; console.log(bar);//null typeof null // object (bug in ECMAScript, should be null) typeof undefined // undefined null === undefined // false null == undefined // true
所以判断null,可以判断类型 + 值
五、Undefined
在JavaScript中,undefined这个词有多重含义.首字母大写的Undefined表示的是一种数据类型,小写的undefined表示的是属于这种数据类型的唯一的一个值.但这两种undefined都只能存在于文档或规范中,不能存在于JavaScript代码中.在JavaScript代码中,你看到的undefined最有可能是全局对象的一个属性,该属性的初始值是就是前面所说的原始值undefined,还有种情况就是,这个undefined是个局部变量,就像其他普通变量一样,没有任何特殊性,它的值不一定是undefined,但通常情况下都是的.下面我们所说的undefined,都指的是window.undefined这个属性.
在ES3中(Firefox4之前),window.undefined就是一个普通的属性,你完全可以把它的值改变成为任意的真值,但在ES5中((Firefox4之后),window.undefined成了一个不可写,不可配置的数据属性,它的值永远是undefined.
一个未初始化的变量的值为undefined,一个没有传入实参的形参变量的值为undefined,如果一个函数什么都不返回,则该函数默认返回undefined.
你可以使用严格相等运算符来判断一个值是否是undefined:
var foo; console.log(foo === undefined);//true console.log(typeof foo === 'undefined');//true console.log(window.foo === undefined);//true console.log(bar === undefined);//Uncaught ReferenceError: bar is not defined console.log(typeof bar === 'undefined');//true console.log(window.bar === undefined);//true console.log(typeof undefined == 'undefined'); //true console.log(typeof null == 'object');//true console.log(null == undefined);//true console.log(null === undefined);//false
总结
Null的值是null,表示一个空对象指针,没有指向任何对象
Undefined的值是undefined,表示申明变量或对象的属性却未初始化
undefined值是派生自null的,所以对他们执行相等测试会返回true
数值、布尔值、对象和字符串值都有toString()方法。但null和undefined值没有这个方法
多数情况下,调用toString()方法不必传递参数。但是,在调用数值的toString()方法时,可以传递一个参数:输出数值的基数
var num = 10;
alert(num.toString()); //"10"
alert(num.toString(2)); //"1010"
alert(num.toString(8)); //"12"
alert(num.toString(10)); //"10"
alert(num.toString(16)); //"a"
在不知道要转换的值是不是null或undefined的情况下,还可以使用转型函数String(),这个函数能够将任何类型的值转换为字符串。String()函数遵循下列转换规则:
● 如果值有toString()方法,则调用该方法(没有参数)并返回相应的结果
● 如果值是null,则返回"null"
● 如果值是undefined,则返回"undefined"
六、Object
Javascript中一切皆Object
// Objects typeof {a:1} === 'object'; // 使用Array.isArray或者Object.prototype.toString.call方法可以从基本的对象中区分出数组类型 typeof [1, 2, 4] === 'object'; typeof new Date() === 'object'; // 下面的容易令人迷惑,不要这样使用! typeof new Boolean(true) === 'object'; typeof new Number(1) ==== 'object'; typeof new String("abc") === 'object'; // 函数 typeof function(){} === 'function'; typeof Math.sin === 'function';
实例化一个空Object
var o = new Object();
var o = new Object(undefined);
var o = new Object(null);
var o = {};
原型
定义属性为__proto__: 值 或 "__proto__": 值 时,不会创建名为__proto__属性。如果给出的值是对象或者null,那么对象的[[Prototype]]会被设置为给出的值。(如果给出的值不是对象也不是null,那么对象的原型不会改变。)
var obj1 = {}; assert(Object.getPrototypeOf(obj1) === Object.prototype); var obj2 = { __proto__: null }; assert(Object.getPrototypeOf(obj2) === null); var protoObj = {}; var obj3 = { "__proto__": protoObj }; assert(Object.getPrototypeOf(obj3) === protoObj); var obj4 = { __proto__: "not an object or null" }; assert(Object.getPrototypeOf(obj4) === Object.prototype); assert(!obj4.hasOwnProperty("__proto__"));
在对象字面值中,仅有一次变更原型的机会;多次变更原型,会被视为语法错误。
不使用冒号记法的属性定义,不会变更对象的原型;而是和其他具有不同名字的属性一样是普通属性定义。
var __proto__ = "variable"; var obj1 = { __proto__ }; assert(Object.getPrototypeOf(obj1) === Object.prototype); assert(obj1.hasOwnProperty("__proto__")); assert(obj1.__proto__ === "variable"); var obj2 = { __proto__() { return "hello"; } }; assert(obj2.__proto__() === "hello"); var obj3 = { ["__prot" + "o__"]: 17 }; assert(obj3.__proto__ === 17);
与JSON的区别
JSON 只允许"property": value syntax形式的属性定义。属性名必须用双引号括起来。且属性定义不允许使用简便写法。
JSON中,属性的值仅允许字符串,数字,数组,true,false,或者其他JSON对象。
JSON中,不允许将值设置为函数。
Date 等对象,经JSON.parse()处理后,会变成字符串。
JSON.parse() 不会处理计算的属性名,会当做错误抛出。
defineProperty
Object.defineProperty() 方法直接在一个对象上定义一个新属性,或者修改一个已经存在的属性, 并返回这个对象 // 使用 __proto__ Object.defineProperty(obj, "key", { __proto__: null, // 没有继承的属性 value: "static" // 没有 enumerable // 没有 configurable // 没有 writable // 作为默认值 }); // 显式 Object.defineProperty(obj, "key", { enumerable: false, configurable: false, writable: false, value: "static" }); // 回收同一对象 function withValue(value) { var d = withValue.d || ( withValue.d = { enumerable: false, writable: false, configurable: false, value: null } ); d.value = value; return d; } // ... 和 ... Object.defineProperty(obj, "key", withValue("static")); // 如果 freeze 可用, 防止代码添加 // value, get, set, enumerable, writable, configurable // 到对象原型上 (Object.freeze||Object)(Object.prototype);
configurable当且仅当这个属性描述符值为 true 时,该属性可能会改变,也可能会被从相应的对象删除。默认为 false。
enumerabletrue 当且仅当该属性出现在相应的对象枚举属性中。默认为 false。
value 与属性相关的值。可以是任何有效的 JavaScript 值(数值,对象,函数等)。默认为 undefined。
writable true 当且仅当可能用 赋值运算符 改变与属性相关的值。默认为 false。
存取描述符同时具有以下可选键值:
get 一个给属性提供 getter 的方法,如果没有 getter 则为 undefined。方法将返回用作属性的值。默认为 undefined。
set 一个给属性提供 setter 的方法,如果没有 setter 则为 undefined。该方法将收到作为唯一参数的新值分配给属性。默认为 undefined。
ps:js中的变量定义
在JavaScript中,使用var来定义任何类型的变量,每一个变量只是用于保存数据的占位符。
var temp; //这句代码定义了一个变量,但其类型是未知的,可以存放任何类型的值,没有初始化的时候,test中存储是undefined。
var temp=2; //这句代码定义了一个变量,并直接初始化为数值型。
var temp="javascript"; // 这句代码定义了一个变量,并直接初始化微string型,单引号和双引号都可以,只要成对出现就行。
2、变量的作用域
在Javascript中,使用var定义的变量,其作用域是在定义该变量的方法或函数内。也就是说,使用var定义的变量是局部变量。
例:
function test()
{
var temp="Hello, Javascript!";
}
test(); //方法调用的时候创建变量并初始化,执行结束后变量被销毁。
alert(temp); //undefined。因为变量temp已经被销毁,所以是未定义(undefined)。
如果在定义变量时,不使用var,那么定义的变量是全局变量。
例:
function test2() { temp2="Hello, Javascript!"; } test2(); //调用方法时,创建变量并初始化,执行结束后变量依然存在。 alert(temp2); //Hello, Javascript! 变量值依然存在
以上内容是小编给大家介绍的Javascript中的数据类型之旅,希望大家喜欢。