JavaScript的數據類型分為兩類:原始類型和引用類型。本文討論的是原始類型。原始類型包括數字,字符串,布爾值,undefined(未定義)和null(空)。undefined和null它們不是數字,字符串和布爾值中的任何一類,但是也屬於原始類型。它們通常分別代表了各自特殊類型的唯一成員。下面來進行詳細了解。
一、數字
javascript只有一種數字類型,它在內部被表示為64位的浮點數,和java的double數字類型一樣,與其它大多數編程語言不同的是,它沒有分離出整數類型和浮點型。javascript中的所有數字都用浮點數值表示。數字Number是javascript中基本的原始數據類型,同時javascript也支持Number對象。它是一個原始數值的包裝對象,在需要的時候,javascript會自動在原始形式和對象形式之間進行轉換。
當一個數字直接出現在javascript程序中,稱之為數字的字面量,而當Number()使用new操作符用作構造函數時,稱之為Number對象。
1、整數直接量
javascript的整數表示共有四種字面量格式是十進制、二進制、八進制、十六進制。但在進行算術計算時,所有以二進制、八進制和十六進制表示的數值最終都將被轉換成十進制數值。
a: 八進制字面值的第一位必須是0,然后是八進制數字序列(0-7)。如果字面值中的數值超出了范圍,那么前導0將被忽略,后面的數值被當作十進制數解析。(嚴格模式下是禁止的,所以最好不用)。
b. 十六進制字面值的前兩位必須是0x,后跟十六進制數字序列(0-9,a-f),字母可大寫可小寫。如果十六進制中字面值中的數值超出范圍會報錯
c. 二進制字面值的前兩位必須是0b,如果出現除0、1以外的數字會報錯
2、浮點型直接量
浮點數是指數值中必須包含一個小數點,且小數點后面必須至少有一位數字。與整數支持多進制不同,一般地,浮點數只可用十進制表示.
雖然小數點前面可以有整數,但是不推薦。涉及到浮點數的比較和運算時一定要小心。
<script>
0.11; .ll111; 1.4738223E-32 //1.4738223*10*(-23)(前一個*表示乖后一個*表示冪)
</script>
3、特殊數值
Number.MAX_VALUE 最大值
Number.MIN_VALUE 最小值
Number.MAX_SAFE_INTEGER 最大整數
Number.MIN_SAFE_INTEGER 最小整數
Infinity 無窮大
NaN(not a number) 非數字,NaN與任何值都不相等,包括它本身,且涉及到NaN的操作都會返回NaN
正負0 js內部存在2個0,它們是等價的
<script> console.log(Number.MAX_VALUE);//1.7976931348623157e+308
console.log(Number.MIN_VALUE);//5e-324
console.log(Number.MAX_SAFE_INTEGER);//9007199254740991
console.log(Number.MIN_SAFE_INTEGER);//-9007199254740991
//過isFinite()來確定一個數值是不是有窮的,包含着隱式類型轉換Number()
console.log(isFinite(Infinity))//false
//isNaN() 來判斷這個數字是不是NaN,包含着隱式類型轉換Number()
console.log(isNaN('hello'));//true
-0 === +0;//true;
0 === -0;//true;
0 === +0;//true
</script>
4、轉成數值
有3個函數可以把非數值轉換成數值:Number(),parseInt(),parseFloat().其中Number()可以將任意類型的值轉化成數值,而parseInt和parseFloat()只應用於字符串向數字的轉換。Number()走的是v8引擎機制,parseInt/parseFloat()它是我們額外提供的方法,這二者是有根本上的區別。
4.1 Number([val])
Number([val])把字符中轉成數字:把字符串轉換為數字,只要字符串中包含任意一個非有效數字字符(第一點除外)都會轉成NaN。空字符串轉成0。
Number([val])把對象轉成數字時會按照以下的步驟:
首先,調用對象的Valueof()方法,如果返回原始類型的值,則直接對該值使用Number();
其次:如果Valueof()方法返回的還是對象,則調用對象的toString()方法,把它轉成字符串后再使用使用Number();
最后:如果toString()方法返回的依然是對象,則結果是NaN.
注意:undefined轉數字的結果是NaN;Null轉數字的結果是0;true轉數字的結果為1,false轉數字的結果是0;空字符串,空格字符串轉數字的結果為0,字符串里面的內容如果是純數字就轉成對應的數字,如果不是那結果為NaN;數字轉數字的結果還是原來的數字;Object轉數字不確定
<script>
console.log(Number(1));//1
console.log(Number(true));//1
console.log(Number(undefined));//NaN
console.log(Number(NaN));//NaN
console.log(Number(null));//0
//轉字符串
console.log(Number(''));//0
console.log(Number(' '));//0
console.log(Number('hello'));//NaN
//轉對象
console.log(Number([])); //0
console.log(Number([1,2]));//NaN
// console.log(Number(其它對象)); //NaN
</script>
4.2 parseInt(string,radix)用於把字符串轉換成radix進制的整數,radix代表進制。
它是專門用來處理字符串轉數字的,string是要被解析的值,如果參數不是字符串,先用toString()方法轉成字符串,從字符串左邊開始查找,找到有效數字字符轉換為數字,遇到非有效數字字符則停止查找。
radix代表進制,從2到36之間。它是可選的。首先string這個字符串,他是把個值看做是radix這個進制,然后轉換為10進制的數字。它省略或者是為0時,radix默認按照10進制處理(特殊:字符串以0x/oX開頭,radix默認按照16進制處理)。
返回整數或者是NaN.
<script> console.log(parseInt(' 1234'));//1234
console.log(parseInt(' 1234fa'));//1234
console.log(parseInt(' a1234ps'));//NaN
console.log(parseInt([1,3])); //1 [1,3].toString()=>'1,3'
console.log(parseInt(''),parseInt(' '),parseInt({}));//NaN NaN NaN
</script>
<script> /* *意思是'2AF5'當做16進制,最后轉成10進制 * 現在要知道進制的轉換: * 5*1+15*16^1+10*16^2+2*16^3=10997 */ parseInt("2AF5", 16);//10997 /* *3進制只能是0-2,所以查到3的時候,發現已經不是3進制的范圍了,不再繼續查找下去 *意思是'2'當做3進制,最后轉成10進制 * 2*3^0 = 2 */ parseInt("231", 3);//2 /* * '234看做是5進制,轉換為10進制' * 4+3*5+2*5*5=69 */ parseInt('23461',5);//69 //radix不在2-36之間,最后結果為NaN parseInt(1,1);//NaN //radix省略或者為0時,默認按10進制處理 parseInt(1,0);//1 </script>
4.3 parseFloat(string)用於字符串轉換浮點數
string需要被解析成為浮點數的值,返回被解析成的浮點數,如果給定值不能被轉換成數值,則會返回NaN.
<script> console.log(parseFloat(' 1234ad'));//1234
console.log(parseFloat(' 1234'));//1234
console.log(parseFloat([1, 2]));//1
console.log(parseFloat(true), parseFloat(false)); console.log(parseFloat([]), parseFloat([2.1]), parseFloat(['2.1px']));//NaN 2.1 2.1
console.log(parseFloat({}), parseFloat(' '), parseFloat(''));//NaN NaN NaN
</script>
d.isNaN()方法
判斷一個值是不是NaN,它會先把參數用number()方法轉一下。具有一個功能是用來檢測數字的,但是它的本意並不是用來檢測數字,而是檢查一個值是否為NaN。如果參數的結果為NaN,那它返回一個ture,如果參數不為NaN,則返回一個false.
isNaN()傳進的值,如果是一個數字那它返回一個false。
<script>
var n = NaN; var s = 'davina';//這個地方先用number()方法轉一下,再用isNaN()方法
var n1 = 12; console.log(isNaN(n), isNaN(s), isNaN(n1));//true true false
</script>
e. Math是一個內置對象,它具有數學常數和函數的屬性和方法,常用的有Math.ceil(),Math.floor(),Math.round(),Math.abs(),Math.random()等等。下文來詳細說明這幾個方法的語法和用處。
Math.ceil()把一個數向上取整。語法:Math.ceil() 參數就為一個數字,返回參數向上取整的數字
Math.floor()把一個數向下取整。語法:Math.floor() 參數就為一個數字,返回參數向上取整的數字
Math.round()把一個數四舍五入。語法:Math.round() 參數就為一個數字,返回四舍五入后的數字
Math.abs()求一個數的絕對值。語法:Math.abs() 參數就為一個數字,返回一個數字的絕對值
Math.random()取0-1之間的隨機數(包括0不包括1)。語法:Math.random() 參數就為一個數字,返回一個0-1之間的隨機數。
常用的一些隨機取值方法:
x~y:Math.round(Math.random()*(y-x)+x);0~x:Math.round(Math.random()*x);
1~x:Math.ceil(Math.random()*x)||1;0~x:Math.floor(Math.random()*x)
<script> console.log(Math.ceil(0.234)); //1
console.log(Math.floor(0.789));//0
console.log(Math.round(4.5));//5
console.log(Math.abs(-9));//9
console.log(Math.random())// 0.7037158897016866
</script>
二、字符串
字符串String是javascript基本數據類型,同時javascript也支持String對象,它是一個原始值的包裝對象。在需要的時候javascript會自動的在原始形式和對象形式之間進行轉換。
字符串類型常被用於表示文本數據。字符串String是由雙引號(")或單引號(')聲明的。由單引號定義的字符串中可以包含雙引號,由雙引號定界的字符串也可以包含單引號。
如果想在單引號定界的字符串中使用單引號,或在雙引號定界的字符串中使用雙引號,則需要使用反斜線(\)(轉義字符進行轉義)。字符串默認只能寫在一行內,分成多行將會報錯,如果希望在字符串另起一行,可以使用轉義字符\n。
javascript中的字符串是不可變的。一旦字符串被創建,就永遠無法改變它。要改變某個變量保存的字符串,首先要銷毀原來的字符串,然后再用另一個包含新值的字符串填充該變量。可以通過+運算符連接其他字符串來創建一個新字符串。
轉字符串:String(),toString().
把一個值轉成字符串有兩種方法:toString()和String().但是要注意一點,可以使用空字符串“”+某個值,將該值轉換為字符串。
toString()方法:幾乎每一個值都會有這個方法。它返回相應字符串
String()方法:在不知道要轉換的值是不是null或者是undefined時,可以使用這個方法。
它遵循以下的原則:如果值是null,則返回'null';如果值是undefined,則返回'undefined';如果值不是null或undefined,則調用toString()方法並返回原始類型值;若使用toString()方法返回的是對象,則再調用valueOf()方法返回原始類型值,若使用valueOf()方法返回的是對象,會報錯
總之,undefined轉字符串為'undefined'; Null轉字符串為'null'; Number轉字符串,把數字加上字符串; true轉字符串'true',false轉字符串'false'; String轉字符串結果就是它本身; Object轉字符串,給對象加上引號。
<script> console.log('"hello world!!!"');//"hello world!!!"
console.log("'hello world!!!'");//'hello world!!!'
console.log('\'hello world\'!!!');//'hello world'!!!
console.log('I don\'t know.');//I don't know.
//可以通過+運算符連接其他字符串來創建一個新字符串
var lang = "java"; lang = lang + "script"; console.log(lang); //javascript
//轉字符串
//a.toString()方法
console.log(true.toString()); //true
console.log([].toString());//
console.log({}.toString());//[object Object]
console.log([1, 2, 3, 4].toString());//1,2,3,4
console.log(new Date().toString());//Wed Nov 13 2019 12:06:11 GMT+0800 (中國標准時間)
// console.log(null.toString()); 報錯
// console.log(undefined.toString()); 報錯
//b.String()方法
var u = undefined; console.log(String(u)); //undefined
var nul = null; console.log(String(nul));//null
var num = 12; console.log(String(num));//12
var b1 = true; var b2 = false; console.log(String(b1), String(b2));//true false
</script>
模塊字符串:模板字符串使用反引號(``)來代碼普通字符串中的使用的雙引號或者是單引號。它是包含特定語法的占位符。它可以當作普通字符串,多行字符串,或者是字符串中嵌入變量使用。
示例:用js動態的給box添加內容
css部分
<div class="box"></div>
數據
let title = "JS的學習要點", data = [ { id: 0, title: "js", },{ id: 1, title: "react", }, ], box = document.querySelector(".box");
用老版本字符串拼接的方式代碼如下,只能用加號一行一行進行拼接。
let str = ""; str += '<div class="learn">'; str += "<h3>" + title + "</h3>"; str += "<ul>"; data.forEach((item) => { str += "<li>" + item.title + "</li>"; }); str == "</ul>"; str += "</div>"; box.innerHTML = str;
用模板字符串拼接,更加的方便和快速。在模塊字符串`${expersion}`。expersion存放的是js表達式,執行有返回結果的就是js表達式,如:變量、數學運算、三元運算符、map等等。
let str = ` <div class="learn">
<h3>${title}</h3>
<ul> ${data.map((item) => { return `<li>${item.title}</li>`; }).join('')} </ul>
</div> `; box.innerHTML = str;
三、布爾值
Boolean類型表示邏輯實體,它只有兩個值true和false分別代表真和假這兩個狀態。它主要是應用於條件和循環語句,邏輯運算符,關系運算符。
轉Boolean方法:Boolean()
undefined轉布爾值為false; Null轉布爾值為false;Number中轉布爾值0,NaN轉布爾值的結果是false,其它的轉布爾值的結果為true;空字符串轉布爾值的結果為false,其它(包括空格字符串)都轉換成了true.
!! 其它類型:!是取反的意思,因此加上兩個!!,兩次取反后即得到本身的布爾值。
//條件語句 // if(a){ // 條件為true時,執行這里的函數 // }else{ // 條件為false時,執行這里的函數 // } //邏輯運算符 同時使用兩個邏輯非操作符,可以將類型轉換成布爾值 console.log(!!1); //true console.log(!!0);//false console.log(!!'')//false console.log(!!" ");//true //關系運算符用於測試兩個值之間的關系,根據關系是否存在而返回true或者是false console.log(1 > 3);//false //轉布爾值 console.log(Boolean(undefined));//false console.log(Boolean(null));//false console.log(Boolean(NaN));//false console.log(Boolean(0));//false console.log(Boolean(''));//false console.log(Boolean(' '));//true console.log(Boolean(false));//false console.log(Boolean('1234'));//true
//注意:空字符串轉為false,空白字符串轉為true </script>
四、null(空)
Null類型只有一個值,就是null。它是javascript語言的關鍵字,它表示一個特殊的值,常用來描述為"空"。
從邏輯的角度上來說,null表示為一個空對象指針。
盡管null和undefined不同,但它們都表示"值的空缺",null表示"空值",undefined表示"未定義"。兩者往往可以互換。相等運算符認為兩者是相等的。
判斷一個值是否為null可以用恆等來進行比較。
<script> console.log(document.getElementById('test'));//null
console.log(typeof null);//object
console.log(null == undefined);//true
console.log(null === null);//true
console.log(undefined === null);//false
console.log('null' === null);//false
</script>
五、undefined(未定義)
undefined類型只有一個值就是它自身,當聲明的變量末初始化時,該變量的默認值是undefined,所以一般來說,undefined表示變量沒有初始化。
對於沒有聲明的變量只能執行一個操作,使用typeof操作符檢測其數據類型,但嚴格模式下會導致錯誤。
它一般出現在已聲明但沒有賦值的變量,獲取對象不存在的屬性,無返回值的函數的執行結果,函數的參數沒有傳入,void(expression).
<script>
var i; console.log(typeof (i));// undefined
var n = []; console.log(n.i);//undefined
function fn() { }; console.log(fn());//undefined
function f(x) { return x; } console.log(f()); //undefined
</script>
六、Symbol和bigint
它們是es6中新增的數據類型,Symbol唯一標識符,它是一種基本數據類型。Symbol()函數會返回symbol類型的值,這個值是唯一的。Symbol前面不能加new,因為它是基礎類型。作用:它可以作為對象的唯一屬性名,這樣其它人就不能修改或者是覆蓋所寫的屬性值。
Symbol(10) === Symbol(10); //false
bigInt數據類型的目的是比Number數據類型支持的范圍更大的整數值。Number.MAX_SAFE_INTEGER常量來表示 最大安全整數,Number.MIN_SAFE_INTEGER常量表示最小安全整數。
七、隱式類型
類型轉換分為兩種:一是顯式類型轉換,二是隱式類型轉換。
顯式類型轉換,通過一種方法很明確的某種數據類型轉換為另一種數據類型,像是Number(),parseInt(),parseFloat()明確遙將數據轉數字類型;String()明確將數據轉為字符串類型;Boolean()明確將數據轉為布爾值類型。
隱式類型轉換:在進行一些操作的時候,根本的目的不是做類型轉換,但是如要進行操作的話,那數據必需符合某種類型,js會在內部對數據進行一些轉換
如:+ - * /
<script> console.log(1 + 2); //3
console.log(1 + 'a'); //1a
console.log(true + 1); //2
console.log(false + '1'); // false1
console.log(false - true); //-1
console.log('' - 1); //-1
</script>