Walaupun Javascript adalah bahasa yang ditaip lemah, ia juga mempunyai beberapa jenis data tersendiri, iaitu: Number, String, Boolean, Object, Udefined, dan Null. Antaranya, Object ialah jenis data yang kompleks, dan Object terdiri daripada pasangan nilai kunci yang tidak tertib. Baki beberapa jenis adalah jenis data mudah. Nota: Huruf pertama jenis pembolehubah ditulis dengan huruf besar, manakala huruf pertama nilai pembolehubah adalah huruf kecil.
JavaScript tidak menyokong jenis tersuai, jadi semua nilai dalam JavaScript tergolong dalam salah satu daripada enam jenis ini.
Menurut spesifikasi ECMAScript 5.1, terdapat enam jenis data dalam JavaScript, iaitu: Undefined, Null, Boolean, Number, String, dan Object. Lima yang pertama ialah jenis asas, dan yang terakhir ialah jenis Objek.
ECMAScript 6 terkini menambah jenis lain: Simbol (definisi baharu ECMAScript 6)
Jenis data asas
Tidak ditentukan: Terdapat hanya satu nilai, tidak ditentukan, yang bermaksud "tiada nilai" dan digunakan pada semua jenis data.
Null: Hanya ada satu nilai, null, yang bermaksud "tiada objek" dan hanya digunakan untuk jenis objek. (harfiah)
Boolean: Terdapat dua nilai, benar dan salah
Nombor: Nilai ialah koleksi nombor titik terapung 64-bit mengikut piawaian IEEE 754, dan tiada struktur data integer. Selain itu, ia juga mengandungi tiga nilai istimewa: NaN, Infinity, -Infinity
Rentetan: Nilai ialah koleksi aksara Unikod terhingga. Mesti disertakan dalam ' atau ".
1. Rentetan
Jenis rentetan JavaScript digunakan untuk mewakili data teks. Ia ialah "elemen" bagi satu set nilai integer tidak bertanda 16-bit. Setiap elemen dalam rentetan menduduki kedudukan dalam rentetan. Elemen pertama mempunyai indeks 0, seterusnya mempunyai indeks 1, dan seterusnya. Panjang rentetan ialah bilangan elemennya
Tidak seperti bahasa C, rentetan dalam JavaScript tidak boleh diubah (Anotasi: Contohnya, operasi rentetan dalam JavaScript mesti mengembalikan rentetan baharu dan rentetan asal tidak diubah)
Semua dalam Javascript adalah berasaskan objek
Buat rentetan, terdapat dua jenis
1. Rentetan yang dibuat menggunakan kaedah literal ialah jenis asas rentetan //rentetan
2. Rentetan yang dibuat menggunakan String() ialah jenis asas rentetan // rentetan
3. Rentetan yang dibuat menggunakan String() baru pembina adalah jenis objek //string
var str1 = "javascript"; //rentetan
var str2 = String("javascript"); //rentetan tidak disyorkan
var str3 = new String('javascript'); //objek
Terdapat juga perbezaan antara objek dan rentetan
s1 = "2 2"; // mencipta rentetan primitif
s2 = new String("2 2"); // mencipta objek String
console.log(eval(s1)); // mengembalikan nombor 4
console.log(eval(s2)); // mengembalikan rentetan "2 2"
Penukaran nilai objek rentetan -》 rentetan
console.log(eval(s2.valueOf())); // mengembalikan nombor 4
2. boolean
Jangan mengelirukan nilai asal true false dengan objek Boolean yang nilainya true false
1 Jika parameter pembina Boolean bukan nilai Boolean, parameter akan ditukar kepada nilai Boolean
2. Jika parameter adalah 0, -0, null, false, NaN, undefined, atau rentetan kosong (""), nilai objek Boolean yang dijana adalah salah, termasuk sebarang objek atau rentetan " false ", akan mencipta objek Boolean dengan nilai true
var x = new Boolean(false); if(x){ console.log(x.valueOf(),typeof x); // false object }
Di atas akan dilaksanakan, kod yang sangat ajaib
Jangan tukar nilai bukan Boolean kepada nilai Boolean dengan mencipta objek Boolean baharu Adalah betul untuk menggunakan fungsi Boolean secara langsung
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. Nombor
Menurut standard ECMAScript, hanya terdapat satu jenis nombor dalam JavaScript: nilai perduaan 64-bit berketepatan dua kali (-(253 -1) hingga 253 -1) berdasarkan piawaian IEEE 754. Ia tidak memberikan jenis tertentu untuk integer. Selain dapat mewakili nombor titik terapung, terdapat juga nilai yang ditandatangani: Infiniti, -Infinity dan NaN (Not-a-Number)
Jenis berangka hanya mempunyai satu integer, yang boleh diwakili dalam dua cara: 0 boleh diwakili sebagai -0 dan 0 ("0" ialah singkatan 0). Dalam amalan, ini juga mempunyai sedikit kesan. Contohnya 0 === -0 adalah benar. Walau bagaimanapun, anda mungkin ingin memberi perhatian apabila membahagi dengan 0:
42/0; // Infiniti
42/-0; // -Infiniti
Jika hujah tidak boleh ditukar kepada nombor, NaN dikembalikan.
Dalam konteks bukan pembina (iaitu tanpa operator baharu), Nombor boleh digunakan untuk melakukan penukaran jenis
ialah penghakiman jenisNAN
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中的数据类型之旅,希望大家喜欢。