04-JavaScript數(shù)據(jù)及數(shù)據(jù)類型

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類型注意點(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ù)字
    • 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);

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末胁后,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子嗦枢,更是在濱河造成了極大的恐慌攀芯,老刑警劉巖,帶你破解...
    沈念sama閱讀 221,635評(píng)論 6 515
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件文虏,死亡現(xiàn)場離奇詭異侣诺,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī)氧秘,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 94,543評(píng)論 3 399
  • 文/潘曉璐 我一進(jìn)店門年鸳,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人丸相,你說我怎么就攤上這事搔确。” “怎么了灭忠?”我有些...
    開封第一講書人閱讀 168,083評(píng)論 0 360
  • 文/不壞的土叔 我叫張陵膳算,是天一觀的道長。 經(jīng)常有香客問我弛作,道長涕蜂,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 59,640評(píng)論 1 296
  • 正文 為了忘掉前任缆蝉,我火速辦了婚禮宇葱,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘刊头。我一直安慰自己黍瞧,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 68,640評(píng)論 6 397
  • 文/花漫 我一把揭開白布原杂。 她就那樣靜靜地躺著印颤,像睡著了一般。 火紅的嫁衣襯著肌膚如雪穿肄。 梳的紋絲不亂的頭發(fā)上年局,一...
    開封第一講書人閱讀 52,262評(píng)論 1 308
  • 那天,我揣著相機(jī)與錄音咸产,去河邊找鬼矢否。 笑死,一個(gè)胖子當(dāng)著我的面吹牛脑溢,可吹牛的內(nèi)容都是我干的僵朗。 我是一名探鬼主播,決...
    沈念sama閱讀 40,833評(píng)論 3 421
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼验庙!你這毒婦竟也來了顶吮?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 39,736評(píng)論 0 276
  • 序言:老撾萬榮一對(duì)情侶失蹤粪薛,失蹤者是張志新(化名)和其女友劉穎悴了,沒想到半個(gè)月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體违寿,經(jīng)...
    沈念sama閱讀 46,280評(píng)論 1 319
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡湃交,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 38,369評(píng)論 3 340
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了陨界。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片巡揍。...
    茶點(diǎn)故事閱讀 40,503評(píng)論 1 352
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡痛阻,死狀恐怖菌瘪,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情阱当,我是刑警寧澤俏扩,帶...
    沈念sama閱讀 36,185評(píng)論 5 350
  • 正文 年R本政府宣布,位于F島的核電站弊添,受9級(jí)特大地震影響录淡,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜油坝,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,870評(píng)論 3 333
  • 文/蒙蒙 一嫉戚、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧澈圈,春花似錦彬檀、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,340評(píng)論 0 24
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至诽偷,卻和暖如春坤学,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背报慕。 一陣腳步聲響...
    開封第一講書人閱讀 33,460評(píng)論 1 272
  • 我被黑心中介騙來泰國打工深浮, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人眠冈。 一個(gè)月前我還...
    沈念sama閱讀 48,909評(píng)論 3 376
  • 正文 我出身青樓飞苇,卻偏偏與公主長得像,于是被迫代替她去往敵國和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子玄柠,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,512評(píng)論 2 359

推薦閱讀更多精彩內(nèi)容