JavaScript 中有哪些不同的資料型別?
JavaScript 中只有兩種型別——主要資料型別和引用型別(物件),其中有六種主要資料型別。
ECMAScript中有5種簡單資料型別(也成為基本資料型別):
Undefined,Null,Boolean,Number,String
還有一種複雜資料型別: Object
typeof 操作符
由於js
中的變數是鬆散型別的,所以它提供了一種檢測當前變數的資料型別的方法,也就是typeof關鍵字。
typeof 123; //Number typeof 'abc'; //String typeof true ; //Boolean typeof undefined; //Undefined typeof null; //Object typeof { }; //Object typeof [ ]; //Object typeof console.log(); //Function
null型別進行typeof操作符後,結果是object,原因在於,null型別被當做一個空物件引用。
1.Number型別
Number型別包含整數和浮點數(浮點數數值必須包含一個小數點,且小數點後面至少有一位數字)兩種值。
NaN:非數字型別。特點:① 涉及到的 任何關於NaN的操作,都會返回NaN ② NaN不等於自身。
isNaN() 函式用於檢查其引數是否是非數字值。
isNaN(123); //false
isNaN("hello"); //true
2.String型別
字串有length屬性。
字串轉換:轉型函式String(),適用於任何資料型別(null,undefined 轉換後為null和undefined);
toString()方法(null,defined沒有toString()方法)。
3.Boolean型別
該型別是ECMAScript中使用最多的一種型別,該型別有兩個字面值:true和false。
需要注意字面值是區分大小寫的,其他True和False(等混合大小形式)都不是Boolean值,只是識別符號。
要將一個值轉為其對應的Boolean值,可以呼叫轉型函式Boolean()
4.Undefined型別
只有一個值,即undefined值。使用var聲明瞭變數,但未給變數初始化值,那麼這個變數的值就是undefined。
5.Null型別
null型別被看做空物件指標,前文說到null型別也是空的物件引用。
var car = null;
aler(typeof car);//"object" (物件的空引用)
alert(null == undefined); //true
6.Object型別
js中物件是一組屬性與方法的集合。這裡就要說到引用型別了,引用型別是一種資料結構,用於將資料和功能組織在一起。引用型別有時候也被稱為物件定義,因為它們描述的是一類物件所具有的屬性和方法。
三大引用型別
1.Object型別
我們看到的大多數型別值都是Object型別的例項,建立Object例項的方式有兩種。
第一種是使用new操作符後跟Object建構函式,如下所示
var person = new Object();
person.name = "Micheal";
person.age = 24;
第二種方式是使用物件字面量表示法,如下所示:
var person = {
name : "Micheal",
age : 24
};
2.Array型別
陣列的每一項可以用來儲存任何型別的資料,也就是說,可以用陣列的第一個位置來儲存字串,第二個位置儲存數值,第三個位置儲存物件....另外,陣列的大小是可以動態調整的。
建立陣列的基本方式有兩種
第一種是使用Array建構函式,如下所示
var colors = new Array("red","blue","yellow");
第二種是使用陣列字面量表示法,如下所示
var colors = ["red","blue","yellow"];
3 Function型別
每個函式都是Function型別的例項,而且都與其他引用型別一樣具有屬性和方法。函式通常是使用函式宣告語法定義的,如下所示
function sum(num1,num2){
return num1 + num2;
};
這和使用函式表示式定義函式的方式相差無幾。
var sun = function (){
return sum1 + sum2;
};
也就是說,js按照儲存方式分為值型別和引用型別。那麼他們的計算有什麼區別呢?
題目1: var a = 100;
var b = a;
a = 200;
console.log (b);
題目2: var a = {age : 20};
var b = a;
b.age = 21;
console.log (a.age);
題目1的答案是 100,題目2的答案是21,
題目1是簡單的值型別,在從一個變數向另一個變數賦值基本型別時,會在該變數上建立一個新值,然後再把該值複製到為新變數分配的位置上。
此時,a中儲存的值為 100 ,當使用 a 來初始化 b 時,b 中儲存的值也為100,但b中的100與a中的是完全獨立的,該值只是a中的值的一個副本,此後,
這兩個變數可以參加任何操作而相互不受影響。也就是說基本型別在賦值操作後,兩個變數是相互不受影響的。
題目2是引用型別,當從一個變數向另一個變數賦值引用型別的值時,同樣也會將儲存在變數中的物件的值複製一份放到為新變數分配的空間中。
這時儲存在變數中的是物件在堆記憶體中的地址,所以,與簡單賦值不同,這個值的副本實際上是一個指標,而這個指標指向儲存在堆記憶體的一個物件。那麼賦值操作後,
兩個變數都儲存了同一個物件地址,則這兩個變數指向了同一個物件。因此,改變其中任何一個變數,都會相互影響。
因此,引用型別的賦值其實是物件儲存在棧區地址指標的賦值,因此兩個變數指向同一個物件,任何的操作都會相互影響。
本人正在學習和摸索中,如有錯誤,歡迎指正!後續會有更新更加詳細!