javaScript有哪些資料型別,有什么區別
javascript有八種資料型別:undefined, Null, Boolean, Number, String, Symbol, Biglnt,Object,
symbol和Biglnt是ES6新增的資料型別:
-
- symbol代表創建后獨一無二且不可變的資料型別,它主要是為了解決可能出現全域變數沖突的問題,
- Biglnt是一種數字型別的資料,它可以表示任意精度格式的整數,使用Bigint可以安全地存盤和操作大整數,即使這個數已經超出了Number能夠表示的安全整數范圍,
這些資料型別分為基本資料型別和參考資料型別:
-
- 堆疊:基本資料型別(undefined,Null,Number,String,Boolean)
- 堆:參考資料型別(物件,陣列,函式
基本資料型別和參考資料型別的區別在于存盤位置不同:
-
- 基本資料型別直接存盤在堆疊(stack)中的簡單資料段,占據空間小,是被頻繁使用的資料,
- 參考資料型別存盤在堆(heep)中的物件,占據空間大,如果存盤在堆疊中,會影響瀏覽器的性能;參考資料型別是在堆疊中存盤了指標,該指標指向堆中的存盤的物件瀏覽器會先檢索堆疊中的地址,通過地址獲得堆中的物體
堆和堆疊存在于資料結構和作業系統記憶體中
資料結構中:
-
- 堆疊中的資料存取方式為先進后出,
- 堆是一個優先佇列,是按照優先級來進行排序的,優先級可以按照大小來規定,
作業系統內:
-
- 堆疊區記憶體由編譯器自動分配釋放,存放函式的引數值,區域變數的值等,
- 堆區記憶體一般由開發者釋放,若不釋放,結束時可能時由垃圾回識訓制(GC)回收,
資料型別檢測的方式有哪些
(1)typeof
陣列,物件,null都會被判斷為object
console.log(typeof 2); // number console.log(typeof true); // boolean console.log(typeof 'str'); // string console.log(typeof []); // object console.log(typeof function(){}); // function console.log(typeof {}); // object console.log(typeof undefined); // undefined console.log(typeof null); // object
(2)instanceof
instanceof可以正確判斷物件的型別,其內部運行機制時在原型鏈中能否找到該型別的原型,
console.log(2 instanceof Number); // false console.log(true instanceof Boolean); // false console.log('str' instanceof String); // false console.log([] instanceof Array); // true console.log(function(){} instanceof Function); // true console.log({} instanceof Object); //true
instanceof只能正確判斷參考資料型別,而不能判斷基本資料型別,
instanceof運算子可以用來測驗一個物件在其原型鏈中是否存在一個建構式的prototype屬性,
(3)constructor
console.log((2).constructor === Number); // true console.log((true).constructor === Boolean); // true console.log(('str').constructor === String); // true console.log(([]).constructor === Array); // true console.log((function() {}).constructor === Function); // true console.log(({}).constructor === Object); // true
constructor有兩個作用:一是判斷資料的型別,二是物件實體通過constructor物件訪問的建構式,需要注意:如果創建一個物件來改變它們的原型,constructor就不能判斷資料型別
function Fn(){}; Fn.prototype = new Array(); var f = new Fn(); console.log(f.constructor===Fn); // false console.log(f.constructor===Array); // true
(4)Object.prototype.toString.call()
Object.prototype.toString.call() 使用Object物件的原型方法toString來判斷資料型別:var a = Object.prototype.toString;
console.log(a.call(2)); //[object Number] console.log(a.call(true)); //[object Boolean]
console.log(a.call('str')); //[object String]
console.log(a.call([])); //[object Array]
console.log(a.call(function(){})); //[object Function]
console.log(a.call({})); //[object Object]
console.log(a.call(undefined)); //[object Undefined]
console.log(a.call(null)); //[object Null]
判斷陣列的方式
-
- 通過Object.protottype.toString.call()
let obj = [1,2,3]
Object.prototype.toString.call(obj).slice(8,-1) === 'Array'
-
- 通過原型鏈
let obj = [1, 2, 3]
console.log(obj.__proto__ === Array.prototype)
-
- 通過ES6的Array.isArray()
fn() function fn() { let obj = [1, 2, 3] console.log(Array.isArray(obj)); }
-
- 通過instanceof
let obj = [1, 2, 3] console.log(obj instanceof Array);
-
- 通過Array.prototype.isPrototype()
let obj = [1, 2, 3]
console.log(Array.prototype.isPrototypeOf(obj));
null和undefined的區別
-
undefined和null都是基本資料型別,這兩個基本資料型別都只有一個值,就是undefined和null.
-
undefined代表的是未定義,null代表的是空物件,一般宣告了變數但還沒有定義的時候會回傳undefined,null主要用于賦值給一些可能會物件的變數,作為初始化,
- 使用typeof對undefin進行判斷會回傳undefined,使用typeof對null進行判斷會回傳Object,
-
console.log(null == undefined); //true console.log(null === undefined); //false
0.1+0.2 !== 0.3,如何讓其相等
let n1 = 0.1, n2 = 0.2
console.log(n1 + n2) //0.30000000000000004
toFixed(num)方法可以把Number四舍五入為指定小數位的數字,
出現0.1+0.2 !== 0.3是因為計算機是通過二進制方式存盤的,
isNaN和Number.isNaN函式的區別
-
-
函式isNaN接受引數,會嘗試將這個引數轉換為數值,任何不被轉換為數值的值都會回傳true,因此非數字值也會回傳true,會影響NaN的判斷,
-
函式 Number.isNaN 會首先判斷傳入引數是否為數字,如果是數字再繼續判斷是否為 NaN ,不會進行資料型別的轉換,這種方法對于 NaN 的判斷更為準確
-
Object.is()與比較運算子“===”,“==”的區別
-
-
使用雙等號(==)進行相等判斷時,如果兩邊的型別不一致,則會進行強制型別轉化后再進行比較,
-
使用三等號(===)進行相等判斷時,如果兩邊的型別不一致時,不會做強制型別準換,直接回傳 false,
-
使用 Object.is 來進行相等判斷時,一般情況下和三等號的判斷相同,它處理了一些特殊的情況,比如 -0 和 +0 不再相等,兩個 NaN 是相等的,
-
轉載請註明出處,本文鏈接:https://www.uj5u.com/qiye/498889.html
標籤:JavaScript
上一篇:JavaScript基本知識點——帶你逐步解開JS的神秘面紗
下一篇:原型&繼承題目及內容解答
