JavaScript數(shù)據(jù)類型概述
- 和C語言一樣, 作為程序員我們最關(guān)心的是內(nèi)存中的
動(dòng)態(tài)數(shù)據(jù)
, 因?yàn)槲覀儗懙某绦蚓褪窃趦?nèi)存中的 - 和C語言一樣,程序在運(yùn)行過程中會(huì)產(chǎn)生各種各樣的臨時(shí)數(shù)據(jù), 為了方便數(shù)據(jù)的運(yùn)算和操作, JavaScript也對(duì)這些數(shù)據(jù)進(jìn)行了分類, 提供了豐富的數(shù)據(jù)類型
- 在JS中一共有六種數(shù)據(jù)類型
- String 字符串(基本數(shù)據(jù)類型)
- Number 數(shù)值(基本數(shù)據(jù)類型)
- Boolean 布爾值(基本數(shù)據(jù)類型)
- Null 空值(基本數(shù)據(jù)類型)
- Undefined 未定義(基本數(shù)據(jù)類型)
- Object 對(duì)象(引用數(shù)據(jù)類型)
注意點(diǎn):
- 相比C語言, JavaScript更加簡單, 數(shù)據(jù)類型也沒有C語言劃分那么細(xì)
- JavaScript中只有基本數(shù)據(jù)類型和引用數(shù)據(jù)類型
- 如何查看數(shù)據(jù)類型?
- 和C語言一樣, 使用typeof操作符可以用來檢查數(shù)據(jù)類型抚官。
- 使用格式:typeof 數(shù)據(jù)零聚,例如 typeof 123; typeof num;
console.log(typeof 123); // number var num = 10; console.log(typeof num); // number
- typeof操作符會(huì)將檢查的結(jié)果以字符串的形式返回給我們
var value= 10; // 此時(shí)將value的數(shù)據(jù)類型number以字符串返回給我們, 存入到res變量中 var res = typeof value; // 此時(shí)檢查res的數(shù)據(jù)類型為string, 證明typeof返回給我們的是一個(gè)字符串 console.log(typeof res); // string
字符串類型
- String用于表示一個(gè)字符序列格仲,即字符串
- 字符串需要使用 ’或“ 括起來
var str1 = "hello";
var str2 = `nj`;
var str5 = `hello nj"; // 錯(cuò)誤
console.log(typeof str1 ); // string
console.log(typeof str2); // string
- 相同引號(hào)不能嵌套烟零,不同引號(hào)可以嵌套
- 雙引號(hào)不能放雙引號(hào)亦渗,單引號(hào)不能放單引號(hào)
var str3 = "hello "nj""; // 錯(cuò)誤
var str4 = `hello `nj``; // 錯(cuò)誤
var str5 = "hello 'nj'"; // 正確
var str6 = `hello "nj"`;// 正確
- 給變量加上引號(hào), 那么變量將變?yōu)橐粋€(gè)常量
var num = 110;
console.log(num); // 輸出變量中的值
console.log("num"); // 輸出常量num
注意點(diǎn):
- 和C語言不同的是, 在C語言中單引號(hào)括起來的是字符
- 而JavaScript中無論單引號(hào)還是雙引號(hào)括起來的都是字符串
Number類型
- 在JS中所有的數(shù)值都是Number類型(整數(shù)和小數(shù))
var num1= 123;
var num2= 3.14;
console.log(typeof num1); // number
console.log(typeof num2); // number
-
由于內(nèi)存的限制,ECMAScript 并不能保存世界上所有的數(shù)值
- 最大值:Number.MAX_VALUE
console.log(Number.MAX_VALUE); // 1.7976931348623157e+308
- 最小值:Number.MIN_VALUE
console.log(Number.MIN_VALUE); // 5e-324
- 無窮大:Infinity, 如果超過了最大值就會(huì)返回該值
console.log(Number.MAX_VALUE + Number.MAX_VALUE); // Infinity
- 無窮心选:-Infinity, 如果超過了最小值就會(huì)返回該值
console.log(typeof Infinity); // number console.log(typeof -Infinity); // number
- NaN 非法數(shù)字(Not A Number),JS中當(dāng)對(duì)數(shù)值進(jìn)行計(jì)算時(shí)沒有結(jié)果返回套像,則返回NaN
var num3 = NaN; console.log(typeof num3); // number
- 最大值:Number.MAX_VALUE
-
Number類型注意點(diǎn)
- JS中整數(shù)的運(yùn)算可以保證精確的結(jié)果
var sum1 = 10 + 20; console.log(sum1); // 30
- 在JS中浮點(diǎn)數(shù)的運(yùn)算可能得到一個(gè)不精確的結(jié)果
var sum1 = 10.1 + 21.1; console.log(sum1); // 31.200000000000003
注意點(diǎn):
- 在C語言中整數(shù)是int,小數(shù)是float或者double
- 而JavaScript中無論是整數(shù)還是小數(shù)都是Number
Boolean 布爾值
- 布爾型也被稱為邏輯值類型或者真假值類型
- 布爾型只能夠取真(true)和假(false)兩種數(shù)值
var bool1 = true;
var bool2 = false;
console.log(typeof bool1); // boolean
console.log(typeof bool2); // boolean
- 雖然Boolean 類型的字面值只有兩個(gè),但 ECMAScript 中所有類型的值都有與這兩個(gè) Boolean 值等價(jià)的值
- 任何非零數(shù)值都是true, 包括正負(fù)無窮大, 只有0和NaN是false
- 任何非空字符串都是true, 只有空字符串是false
- 任何對(duì)象都是true, 只有null和undefined是false
var bool3 = Boolean(0);
console.log(bool3); // false
var bool4 = Boolean(1);
console.log(bool4); // true
var bool5 = Boolean(-1);
console.log(bool4); // true
var bool6 = Boolean(Infinity);
console.log(bool4); // true
var bool7 = Boolean(-Infinity);
console.log(bool4); // true
var bool8 = Boolean(NaN);
console.log(bool8); // false
var bool9 = Boolean(undefined);
console.log(bool8); // false
var bool10 = Boolean(null);
console.log(bool8); // false
var bool11 = Boolean("");
console.log(bool8); // false
var bool12 = Boolean("abc");
console.log(bool12); // true
Null和Undefined
- Undefined這是一種比較特殊的類型乖订,表示變量未賦值扮饶,這種類型只有一種值就是undefined
var num;
console.log(num); //結(jié)果是undefined
- undefined是Undefined類型的字面量
- 前者undefined和10, "abc"一樣是一個(gè)常量
- 后者Undefined和Number,Boolean一樣是一個(gè)數(shù)據(jù)類型
- 需要注意的是typeof對(duì)沒有初始化和沒有聲明的變量都會(huì)返回undefined。
var value1 = undefined;
console.log(typeof value); //結(jié)果是undefined
var value2;
console.log(typeof value2); //結(jié)果是undefined
- Null 類型是第二個(gè)只有一個(gè)值的數(shù)據(jù)類型乍构,這個(gè)特殊的值是 null
- 從語義上看null表示的是一個(gè)空的對(duì)象甜无。所以使用typeof檢查null會(huì)返回一個(gè)Object
var test1= null;
console.log(typeof test1);
- undefined值實(shí)際上是由null值衍生出來的,所以如果比較undefined和null是否相等哥遮,會(huì)返回true
var test1 = null;
var test2 = undefined;
console.log(test1 == test2);
console.log(test1 === test2);
將其它類型轉(zhuǎn)換為字符串
調(diào)用被轉(zhuǎn)換數(shù)據(jù)類型的toString()方法
var num1 = 10;
var res1 = num1.toString(); // 重點(diǎn)
console.log(res1); // 10
console.log(typeof res1); // string
var num2 = true;
var res2 = num2.toString(); // 重點(diǎn)
console.log(res2); // true
console.log(typeof res2); // string
- null和undefined這兩個(gè)值沒有toString()方法岂丘,如果調(diào)用他們的方法,會(huì)報(bào)錯(cuò)
var num3 = undefined;
var res3 = num3.toString(); // 報(bào)錯(cuò)
console.log(res3);
var num4 = null;
var res4 = num4.toString(); // 報(bào)錯(cuò)
console.log(res4);
var num5 = NaN;
var res5 = num5.toString();
console.log(res5); // NaN
console.log(typeof res5); // String
- 該方法不會(huì)影響到原變量眠饮,它會(huì)將轉(zhuǎn)換的結(jié)果返回
var num6 = 10;
var res6 = num6.toString();
console.log(typeof num6); // number
console.log(typeof res6); // string
- 數(shù)值類型的toString()奥帘,可以攜帶一個(gè)參數(shù),輸出對(duì)應(yīng)進(jìn)制的值(暫時(shí)不用了解, 講到進(jìn)制轉(zhuǎn)換再回來看)
var num7 = 20;
var res7 = num7.toString(2);
var res8 = num7.toString(8);
var res9 = num7.toString(10);
var res10 = num7.toString(16);
console.log(res7); // 10100
console.log(res8); // 24
console.log(res9); // 20
console.log(res10); // 14
將被轉(zhuǎn)換的數(shù)據(jù)傳入String()函數(shù)中
- String()函數(shù)存在的意義:
- 有些值沒有toString()仪召,這個(gè)時(shí)候可以使用String()翩概。比如:undefined和null
- 對(duì)于Number和Boolean實(shí)際上就是調(diào)用的toString()方法
var num1 = 10;
var res1 = String(num1); // 重點(diǎn)
console.log(res1); // 10
console.log(typeof res1); // string
var num2 = true;
var res2 = String(num2); // 重點(diǎn)
console.log(res2); // true
console.log(typeof res2); // string
- 對(duì)于null和undefined,就不會(huì)調(diào)用toString()方法(因?yàn)檫@兩個(gè)哥們沒有這個(gè)方法).而是在內(nèi)部生成一個(gè)新的字符串
var num3 = undefined;
var res3 = String(num3);
console.log(res3); // undefined
console.log(typeof res3); // string
var num4 = null;
var res4 = String(num4);
console.log(res4); // null
console.log(typeof res4); // string
將被轉(zhuǎn)換的數(shù)據(jù)和+""連接到一起
- 任何數(shù)據(jù)和 +"" 連接到一起都會(huì)轉(zhuǎn)換為字符串
- 內(nèi)部實(shí)現(xiàn)原理和String()函數(shù)一樣
var num1 = 10;
var res1 = num1 + "";
console.log(res1); // 10
console.log(typeof res1); // string
var num2 = true;
var res2 = num2 + "";
console.log(res2); // true
console.log(typeof res2); // string
var num3 = undefined;
var res3 = num3 + "";
console.log(res3); // undefined
console.log(typeof res3); // string
var num4 = null;
var res4 = num4 + "";
console.log(res4); // null
console.log(typeof res4); // string
將其它類型轉(zhuǎn)換為Number類型
將被轉(zhuǎn)換的數(shù)據(jù)傳入Number()函數(shù)中
- 字符串 --> 數(shù)字
- 如果是純數(shù)字的字符串返咱,則直接將其轉(zhuǎn)換為數(shù)字
var str1 = "123"; var res1 = Number(str1); console.log(res1); // 123 console.log(typeof res1); // number
- 如果字符串中有非數(shù)字的內(nèi)容钥庇,則轉(zhuǎn)換為NaN
var str2 = "123ab"; var res2 = Number(str2); console.log(res2); // NaN
- 如果字符串是一個(gè)空串或者是一個(gè)全是空格的字符串,則轉(zhuǎn)換為0
var str3 = ""; var res3 = Number(str3); console.log(res3); // 0 var str4 = " "; var res4 = Number(str4); console.log(res4); // 0
- 如果是純數(shù)字的字符串返咱,則直接將其轉(zhuǎn)換為數(shù)字
- 布爾 --> 數(shù)字
- true 轉(zhuǎn)成 1
- false 轉(zhuǎn)成 0
var bool1 = true; var res5 = Number(bool1); console.log(res5); // 1 var bool2 = false; var res6 = Number(bool2); console.log(res6); // 0
- null --> 數(shù)字 --> 0
var str5 = null; var res7 = Number(str5); console.log(res7); // 0
- undefined --> 數(shù)字 --> NaN
var str6 = undefined; var res8 = Number(str6); console.log(res8); // NaN
將被轉(zhuǎn)換的數(shù)據(jù)傳入parseInt()函數(shù)中/parseFloat()函數(shù)中
Number()函數(shù)中無論混合字符串是否存在有效整數(shù)都會(huì)返回NaN
利用parseInt()/parseFloat()可以提取字符串中的有效整數(shù)
parseFloat()會(huì)解析第一個(gè). 遇到第二個(gè).或者非數(shù)字結(jié)束
兩者之前的區(qū)別是前者只能提取整數(shù),后者可以提取小數(shù)
-
parseInt()提取字符串中的整數(shù)
- 從第一位有效數(shù)字開始, 直到遇到無效數(shù)字
- 如果第一位不是有效數(shù)字, 什么都提取不到, 會(huì)返回NaN
- 第一個(gè)參數(shù)是要轉(zhuǎn)換的字符串咖摹,第二個(gè)參數(shù)是要轉(zhuǎn)換的進(jìn)制
var str7 = "300px"; var res9 = parseInt(str7); console.log(res9); // 300 var str8 = "300px250"; var res10 = parseInt(str8); console.log(res10); // 300 console.log(parseInt("abc123")); //返回NaN评姨,如果第一個(gè)字符不是數(shù)字或者符號(hào)就返回NaN console.log(parseInt("")); //空字符串返回NaN,Number("")返回0
-
parseFloat提取字符串中的小數(shù)
- 會(huì)解析第一個(gè). 遇到第二個(gè).或者非數(shù)字結(jié)束
- 如果第一位不是有效數(shù)字, 什么都提取不到
- 不支持第二個(gè)參數(shù),只能解析10進(jìn)制數(shù)
- 如果解析的內(nèi)容里只有整數(shù)吐句,解析成整數(shù)
var str9 = "20.5px"; var res11 = parseInt(str9); console.log(res11); // 20 var str10 = "20.5.5.5px"; var res12 = parseFloat(str10); console.log(res12); // 20.5
對(duì)非String使用parseInt()或parseFloat(), 會(huì)先將其轉(zhuǎn)換為String然后在操作
var str11 = true;
var res13 = parseInt(str11); // 這里相當(dāng)于parseInt("true");
console.log(res13); // NaN
var res14 = Number(str11);
console.log(res14); // 1
利用+ - 運(yùn)算符
- 添加+號(hào), 不會(huì)修改數(shù)據(jù)的正負(fù)性
- 添加-號(hào), 會(huì)修改數(shù)據(jù)的正負(fù)性
var str1 = "666";
var res1 = +str1;
console.log(res1); // 666
console.log(typeof res1);
var str2 = "3.14";
var res2 = +str2;
console.log(res2); // 3.14
console.log(typeof res2);
var str3 = "666px";
var res3 = +str3;
console.log(res3); // NaN
console.log(typeof res3);
var flag = false;
var res4 = +flag;
console.log(res4); // 0
console.log(typeof res4);
var flag = true;
var res4 = +flag;
console.log(res4); // 1
console.log(typeof res4);