JS之?dāng)?shù)據(jù)類型

5種簡單數(shù)據(jù)類型:Undefined、Null、Boolean、Number和String。1種復(fù)雜數(shù)據(jù)類型-----Object

typeof

typeof操作符用來檢測變量的數(shù)據(jù)類型。

值或變量描述 typeof返回字符串
未定義,沒有賦值 undefined
布爾值 boolean
字符串 string
數(shù)值 number
對象或null object
函數(shù) function

Undefined類型

Undefined類型只有一個值,undefined。使用var聲明變量,但是沒有對其初始化,這個變量值就是undefined。
未初始化的變量和根本不存在的變量不一樣

var box;
console.log(name);

typeof box,typeof name都返回undefined,但是他們的值一個是undefined,一個是錯誤,盡管他們的類型都是undefined,所以在定義變量的時候,盡可能不要只聲明,不賦值

Null類型

該類型只有一個值,null。表示一個空對象引用,typeof檢測返回object。
如果定義的變量準(zhǔn)備保存對象,最好初始化為null

重要說明,undefined派生子null,ECMA-262 規(guī)定對它們的相等性測試返回true。alert(undefined == null);//true,因此,未初始化的變量和賦值為null的變量會相等,但不全等(===),因為數(shù)據(jù)類型不一樣

Boolean類型

兩個值,truefalse。而true 不一定等于1,false不一定等于0。JavaScript 是區(qū)分大小寫的,True 和False 或者其他都不是Boolean 類型的值。
雖然Boolean 類型的字面量只有true 和false 兩種,但ECMAScript 中所有類型的值都有
與這兩個Boolean 值等價的值。要將一個值轉(zhuǎn)換為其對應(yīng)的Boolean 值,可以使用轉(zhuǎn)型函數(shù)
Boolean()。

var hello = 'Hello World!';
var hello2 = Boolean(hello);
alert(typeof hello);

上面是一種顯示轉(zhuǎn)換,屬于強(qiáng)制性轉(zhuǎn)換。而實際應(yīng)用中,還有一種隱式轉(zhuǎn)換。比如,在
if 條件語句里面的條件判斷,就存在隱式轉(zhuǎn)換。

var hello = 'Hello World!';
if (hello) {
alert('如果條件為true,就執(zhí)行我這條!');
} else {
alert('如果條件為false,就執(zhí)行我這條!');
}
其他類型轉(zhuǎn)換成 Boolean類型規(guī)則

Number類型

兩種數(shù)值,整型和浮點型,由于保存浮點數(shù)值需要的內(nèi)存空間比整型數(shù)值大兩倍,因此ECMAScript 會自動將可以轉(zhuǎn)換為整型的浮點數(shù)值轉(zhuǎn)成為整型。

var box = 8.; //小數(shù)點后面沒有值,轉(zhuǎn)換為8
var box = 12.0; //小數(shù)點后面是0,轉(zhuǎn)成為12

浮點數(shù)值的范圍在:Number.MIN_VALUE ~ Number.MAX_VALUE 之間。

alert(Number.MIN_VALUE); //最小值
alert(Number.MAX_VALUE); //最大值

如果超過了浮點數(shù)值范圍的最大值或最小值,那么就先出現(xiàn)Infinity(正無窮)或者-Infinity(負(fù)無窮)。

var box = 100e1000; //超出范圍,Infinity
var box = -100e1000; //超出范圍,-Infinity

也可能通過Number.POSITIVE_INFINITYNumber.NEGATIVE_INFINITY 得到
Infinity(正無窮)及-Infinity(負(fù)無窮)的值。

alert(Number.POSITIVE_INFINITY); //Infinity(正無窮)
alert(Number.NEGATIVE_INFINITY);//-Infinity(負(fù)無窮)

要想確定一個數(shù)值到底是否超過了規(guī)定范圍,可以使用isFinite()函數(shù)。如果沒有超過,返回true,超過了返回false。

NaN,即非數(shù)值(Not a Number)是一個特殊的值,這個數(shù)值用于表示一個本來要返回數(shù)值的操作數(shù)未返回數(shù)值的情況(這樣就不會拋出錯誤了)。
可以通過Number.NaN 得到NaN 值,任何與NaN 進(jìn)行運算的結(jié)果均為NaNNaN 與自身不相等(NaN 不與任何值相等)。

ECMAScript 提供了isNaN()函數(shù),用來判斷這個值到底是不是NaN。isNaN()函數(shù)在接收到一個值之后,會嘗試將這個值轉(zhuǎn)換為數(shù)值。

alert(isNaN(NaN)); //true
alert(isNaN(25)); //false,25 是一個數(shù)值
alert(isNaN('25')); //false,'25'是一個字符串?dāng)?shù)值,可以轉(zhuǎn)成數(shù)值
alert(isNaN('Lee')); //true,'Lee'不能轉(zhuǎn)換為數(shù)值
alert(isNaN(true)); //false true 可以轉(zhuǎn)成成1

isNaN()函數(shù)也適用于對象。在調(diào)用isNaN()函數(shù)過程中,首先會調(diào)用valueOf()方法,然后確定返回值是否能夠轉(zhuǎn)換成數(shù)值。如果不能,則基于這個返回值再調(diào)用toString()方法,再測試返回值。

var box = {
toString : function () {
return '123'; //可以改成return 'Lee'查看效果
}
};
alert(isNaN(box)); //false

ES6提供了新方法Number.isFinite()Number.isNaN()。ES6和傳統(tǒng)的方法isFinite()isNaN()區(qū)別:傳統(tǒng)方法先調(diào)用Number()將非數(shù)值轉(zhuǎn)化為數(shù)值,在進(jìn)行判斷,而新方法只對數(shù)值有效,對于非數(shù)值一律返回false。Number.isNaN()只對NaN才返回true,其他均返回false

console.log(isFinite('23'))//true
console.log(Number.isFinite('23'))//false

console.log(isNaN('23'))//false
console.log(Number.isNaN('23'))//false
console.log(Number.isNaN(NaN))//true

有3 個函數(shù)可以把非數(shù)值轉(zhuǎn)換為數(shù)值:Number()、parseInt()parseFloat()。Number()函數(shù)是轉(zhuǎn)型函數(shù),可以用于任何數(shù)據(jù)類型,而另外兩個則專門用于把字符串轉(zhuǎn)成數(shù)值。

alert(Number(true)); //1,Boolean 類型的true 和false 分別轉(zhuǎn)換成1 和0
alert(Number(25)); //25,數(shù)值型直接返回
alert(Number(null)); //0,空對象返回0
alert(Number(undefined)); //NaN,undefined 返回NaN

如果是對象,首先會調(diào)用valueOf()方法,然后確定返回值是否能夠轉(zhuǎn)換成數(shù)值。如果轉(zhuǎn)換的結(jié)果是NaN,則基于這個返回值再調(diào)用toString()方法,再測試返回值。

var box = {
toString : function () {
return '123'; //可以改成return 'Lee'查看效果
}
};
alert(Number(box)); //123

String 類型

表示字符串,單引號和雙引號表示字符串,,必須成對出現(xiàn),不能穿插
使用,否則會出錯。

ECMAScript 中的字符串是不可變的,也就是說,字符串一旦創(chuàng)建,它們的值就不能改變。要改變某個變量保存的字符串,首先要銷毀原來的字符串,然后再用另一個包含新值的字符串填充該變量。

var box='s';
box=box+'a';
console.log(box)//sa
box[1]='p';
console.log(box)//sa

toString()方法可以把值轉(zhuǎn)換成字符串。
如果在轉(zhuǎn)型之前不知道變量是否是null 或者undefined 的情況下,我們還可以使用轉(zhuǎn)型函數(shù)String(),這個函數(shù)能夠?qū)⑷魏晤愋偷闹缔D(zhuǎn)換為字符串。

var box = null;
alert(String(box));//null,若使用toString方法,則出錯

Object類型

ECMAScript 中的對象其實就是一組數(shù)據(jù)和功能的集合。對象可以通過執(zhí)行new 操作符后跟要創(chuàng)建的對象類型的名稱來創(chuàng)建。
var box = new Object();
Object()是對象構(gòu)造函數(shù),如果對象初始化時不需要傳遞參數(shù),可以不用寫括號,但這種方式我們是不推薦的。
var box = new Object;
Object()里可以任意傳參,可以傳數(shù)值、字符串、布爾值等。而且,還可以進(jìn)行相應(yīng)的計算。

var box = new Object(2); //Object 類型,值是2
var age = box + 2; //可以和普通變量運算
alert(age); //輸出結(jié)果4,轉(zhuǎn)型成Number 類型了

既然可以使用new Object()來表示一個對象,那么我們也可以使用這種new 操作符來創(chuàng)建其他類型的對象。

var box = new Number(5); //new String('Lee')、new Boolean(true)

alert(typeof box); //Object 類型

補(bǔ)充

JS在進(jìn)行數(shù)字和字符運算時, 會在2個值相加時優(yōu)先推斷為string類型 ,其它情況下(比如“-”減?!?/em>”乘?!?”除)都默認(rèn)number型運算*。!

console.log(3/'2');//1.5
console.log(3-'2');//1
console.log(3+'2');//32
console.log(3*'2');//6
console.log(3+ +'2');//5
console.log(1+ +"2"+"2");//32
console.log(typeof ("A"- "B"));//number
console.log("A"- "B"+2);//NaN

一元運算符,對于非數(shù)值應(yīng)用一元加操作符,該操作符會像Number()轉(zhuǎn)型函數(shù)一樣對這個值執(zhí)行轉(zhuǎn)換。console.log(1+ +"2"+"2");//32+"2"相當(dāng)于
Number('2')=2,
1+2=3,
3+"2"="32"
注意Number(null)=0,Number(undefined)=NaN,空字符串轉(zhuǎn)換為0

參考資料:JavaScript高級程序設(shè)計(第3版)

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

  • 第2章 基本語法 2.1 概述 基本句法和變量 語句 JavaScript程序的執(zhí)行單位為行(line),也就是一...
    悟名先生閱讀 4,557評論 0 13
  • 什么是 JavaScript 語言? JavaScript 是一種輕量級的腳本語言。所謂“腳本語言”(script...
    oWSQo閱讀 1,915評論 0 1
  • 變量 聲明變量 命名變量區(qū)分大小寫的語言第一個字符是字母或下劃線_,數(shù)字不能作為第一個字符字符必須是字母,數(shù)字或者...
    flyingtoparis閱讀 894評論 0 0
  • 七星著 窮其一生,我依舊只愛美。 自古,美君,美政,美人,就是一個天下。普天之下,叫我如何不愛美?世間最基本的美、...
    一只小小小bunny閱讀 498評論 2 6
  • 風(fēng)蕭蕭,人血寒。尸山血海,殺戮漫布于整個幽魂山。 靜靜的山崗,雙方無聲的對峙。空中懸著的是一個渾身縈繞著黑氣的男子...
    樓南陳閱讀 745評論 7 2

友情鏈接更多精彩內(nèi)容