1.基本類型:undefined、null、string、number、boolean、symbo(ES6)
1.1 普通基本類型:undefined、null、symbol(ES6)
1.2 特殊基本包裝類型:string、number、boolean
2.引用類型:Object、Function,Array、RegExp、Date、及單體內置對象(Global、Math)。(除了基本類型其余的都是object,就都是引用類型啦~)
3.比較
基本類型的值是不可變的,引用類型的值是可變的;
存放:基本類型的變量是存放在棧區的,引用類型的值是同時保存在棧內存和堆內存中的對象;
比較:基本類型的比較是值的比較,引用類型的比較是引用的比較;
4.舉栗~
var a = '我是小仙女~' var b = a; b='我是純爺們~' console.log(a)//我是小仙女~ console.log(b)//我是純爺們~ //_______________我是分割線_______________________ var c={name:'我是小仙女~'} var d= c; b.name="我是純爺們~" console.log(c)//我是純爺們~ console.log(d)//我是純爺們~ //_______________我是分割線_______________________(操作引用的對象) var obj1 = [2,3,4]; var obj2 = obj1; obj2[0] = 10; console.log(obj2); // [10,3,4] console.log(obj1); // [10,3,4] //_______________我是分割線_______________________(並未操作引用的對象) var obj3 = [2,3,4]; var obj4 = obj3; obj4 = [10,3,4]; console.log(obj4); // [10,3,4] console.log(obj3); // [2,3,4]
5.基本類型詳解:
1、undefined 類型表示不存在定義,聲明變量但沒有初始化,這個變量的值就是undefined; 注意:在任何一個引用變量值設置為undefined都是錯誤的
2、null 類型,表示一個值被定義了,定義為空值; 使用場景為 定義變量准備在將來用於保存對象;所以引用值可以是null而不會是undefined;undefined和null的區別:js誕生的時候只設置了null作為“無”的值。最初的設計是null是表示一個“無”的對象,轉為數值時為0; | undefined表示“無”的原始值,轉為數值時為NaN;紅寶書上說引入undefined就是為了正式的區分空對象指針與未經初始化的變量,變量設置為null就是空對象指針,沒有設置就是未經初始化!
3、Boolean類型,字面值為true和false
4、number類型,字面量格式可以是十進制、八進制(八進制第一位必須是0)、十六進制(前兩位必須是0x)
Number類型包含整數和浮點數(浮點數數值必須包含一個小數點,且小數點后面至少有一位數字)兩種值。
NaN:非數字類型。兩大特點:1.涉及到的 任何關於NaN的操作,都會返回NaN。2. NaN不等於自身。
isNaN() 函數用於檢查其參數是否是非數字值
5、String類型 由零個或多個16位Unicode字符組成的字符序列
6、symbol類型,ES5 的對象屬性名都是字符串,這容易造成屬性名的沖突。比如,你使用了一個他人提供的對象,但又想為這個對象添加新的方法(mixin 模式),新方法的名字就有可能與現有方法產生沖突。如果有一種機制,保證每個屬性的名字都是獨一無二的就好了,這樣就從根本上防止屬性名的沖突。這就是ES6 引入Symbol的原因
6.其他相關知識點:
6.擴展思考
1.Null和Undefined的區別?
null和undefined基本同義,只有一些細微的差別。
null表示“沒有對象”,即該處不應該有值。
(1) 作為函數的參數,表示該函數的參數不是對象。
(2) 作為對象原型鏈的終點。
undefined表示缺少值,此處應該有值,但是還沒有定義。
(1)變量被聲明了,但沒有賦值時,就等於undefined。
(2) 調用函數時,應該提供的參數沒有提供,該參數等於undefined。
(3)對象沒有賦值的屬性,該屬性的值為undefined。
(4)函數沒有返回值時,默認返回undefined。
2.NaN是什么?
NaN表示一個元素可不是數值,isNaN()用於判斷元素是否為數字的函數,是的話返回false,不是數字返回true。NaN和任何值比較都不相等。
3.什么是棧內存,什么是堆內存,兩者有什么區別?
棧內存:由程序自動向操作系統申請分配以及回收,速度快,使用方便,但程序員無法控制。若分配失敗,則提示棧溢出錯誤。注意,const局部變量也儲存在棧區內,棧區向地址減小的方向增長。
堆內存:程序員向操作系統申請一塊內存,當系統收到程序的申請時,會遍歷一個記錄空閑內存地址的鏈表,尋找第一個空間大於所申請空間的堆結點,然后將該結點從空閑結點鏈表中刪除,並將該結點的空間分配給程序。分配的速度較慢,地址不連續,容易碎片化。此外,由程序員申請,同時也必須由程序員負責銷毀,否則則導致內存泄露。
關於堆和棧區別的比喻:
堆和棧的區別可以引用一位前輩的比喻來看出:使用棧就象我們去飯館里吃飯,只管點菜(發出申請)、付錢、和吃(使用),吃飽了就走,不必理會切菜、洗菜等准備工作和洗碗、刷鍋等掃尾工作,他的好處是快捷,但是自由度小。使用堆就象是自己動手做喜歡吃的菜餚,比較麻煩,但是比較符合自己的口味,而且自由度大。
4.值傳遞是什么?
當我們使用=將這些變量賦值到另外的變量,實際上是將對應的值拷貝了一份,然后賦值給新的變量。我們把它稱作值傳遞
5、對象是通過什么傳遞的?
對象是通過引用傳遞,而不是值傳遞。也就是說,變量賦值只會將地址傳遞過去。
6、==和===在比較時有什么區別?
==相等運算符,兩邊值類型不同的時候,要先進行類型轉換,再比較。===嚴格運算符,不做類型轉換,類型不同的一定不等;
對於引用類型的變量,==和===只會判斷引用的地址是否相同,而不會判斷對象具體里屬性以及值是否相同。因此,如果兩個變量指向相同的對象,則返回true。(如果兩個值都是null,或者都是undefined,那么[相等]。)
===嚴格運算符:
1、如果類型不同,就[不相等]
2、如果兩個都是數值,並且是同一個值,那么[相等];(!例外)的是,如果其中至少一個是NaN,那么[不相等]。(判斷一個值是否是NaN,只能用isNaN()來判斷)
3、如果兩個都是字符串,每個位置的字符都一樣,那么[相等];否則[不相等]。
4、如果兩個值都是true,或者都是false,那么[相等]。
5、如果兩個值都引用同一個對象或函數,那么[相等];否則[不相等]。
==相等運算符:
1、如果兩個值類型相同,進行 === 比較。
2、如果兩個值類型不同,他們可能相等。根據下面規則進行類型轉換再比較:
3、如果一個是null、一個是undefined,那么[相等]。
4、如果一個是字符串,一個是數值,把字符串轉換成數值再進行比較。
5、如果任一值是 true ,把它轉換成 1 再比較;如果任一值是 false,把它轉換成 0 再比較。
6、如果一個是對象,另一 個是數值或字符串,把對象轉換成基礎類型的值再比較。對象轉換成基礎類型,利用它的toString或者valueOf方法。js核心內置類,會嘗試 valueOf先於toString;例外的是Date,Date利用的是toString轉換。非js核心的對象,令說(比較麻煩,我也不大懂)
7、任何其他組合,都[不相等]。
7.基礎數據類型與引用數據類型在使用檢測類型符號上返回結果的區別?