javascript
请你讲一讲JavaScript有哪些数据类型, 数据类型判断有哪些方法?
js的8種數(shù)據(jù)類型
JavaScript中有8種數(shù)據(jù)類型, 包括基本數(shù)據(jù)類型(number, string, boolean, null, undefined, symbol, bigint)和引用數(shù)據(jù)類型object
number
JavaScript中的整數(shù)和浮點(diǎn)數(shù)都會(huì)按照浮點(diǎn)數(shù)的標(biāo)準(zhǔn)進(jìn)行存儲(chǔ).
即64個(gè)二進(jìn)制位, 從最左邊開始: 第1位: 符號(hào)位, 0表示正數(shù), 1表示負(fù)數(shù) 第2到第12位: 存儲(chǔ)指數(shù)部分 第13到第64位: 存儲(chǔ)小數(shù)部分其中, 符號(hào)位決定一個(gè)數(shù)是正數(shù)還是負(fù)數(shù), 指數(shù)部分決定了一個(gè)數(shù)的大小, 小數(shù)部分決定了一個(gè)數(shù)的精度
數(shù)值精度
JavaScript提供的有效數(shù)字最長為53個(gè)二進(jìn)制位, 這意味著絕對(duì)值小于2的53次方的整數(shù)都能夠精確表示
0.1 + 0.2 = 0.30000000000000004就是因?yàn)榫热笔У脑? 還有人因此做了一個(gè)網(wǎng)站: (http://0.30000000000000004.com/)
Number.MAX_SAFE_INTEGER和Number.MIN_SAFE_INTEGER分別表示js的最大安全數(shù)和最小安全數(shù)
數(shù)值范圍
指數(shù)部分的最大值是2047(2^11 - 1), 分出一半表示負(fù)數(shù), 那么JavaScript能夠表示的數(shù)值范圍為2^1024到2^(-1023)
Number.MAX_VALUE和Number.MIN_VALUE代表js可表示的最大數(shù)字和最小數(shù)字
當(dāng)一個(gè)浮點(diǎn)值大于(小于)js所能表示的最大(最小)值時(shí), 其結(jié)果是Infinity(-Infinity), 12/0返回Infinity, -12/0返回-Infinity
NaN
NaN表示not a number(非數(shù)字), NaN和任何值都不相等, 包括它自己. 所以x != x當(dāng)且僅當(dāng)x是NaN時(shí)成立. 0/0會(huì)返回NaN
- Number.isNaN(Number.NaN)
- x != x 可以用來檢測(cè)x是否是NaN
Number.isFinite()可以用來檢測(cè)Number.NaN和Infinity.
bigint
bigint可以使用任意精度表示整數(shù). 即使超出js的安全數(shù), 也可以安全地存儲(chǔ)和使用大整數(shù)
bigint不能表示小數(shù)
BigInt(123)string
js中的字符串是不可變的, str.length可表示字符串的長度
基本數(shù)據(jù)類型字符串它不是對(duì)象, 卻能夠使用對(duì)象才有的屬性和方法進(jìn)行操作(比如str.length, str.split('-')), 這是因?yàn)槿齻€(gè)關(guān)鍵的基本數(shù)據(jù)類型都有自己對(duì)應(yīng)的對(duì)象(Number, String和Boolean). 這三個(gè)對(duì)象是針對(duì)數(shù)字, 字符串和布爾值的包裝.
當(dāng)我們?cè)趯?duì)象環(huán)境中使用字符串時(shí)(比如使用str.length), JavaScript會(huì)為這個(gè)字符串內(nèi)部地創(chuàng)建一個(gè)String對(duì)象, 這個(gè)對(duì)象就代替了原始的字符串值來執(zhí)行相應(yīng)的操作. 注意此時(shí)被創(chuàng)建的String對(duì)象只是瞬時(shí)存在的, 使用之后系統(tǒng)就會(huì)自動(dòng)將其丟棄.boolean
null, undefined, 0, -0, NaN, ''都可以轉(zhuǎn)成false
null和undefined
null == undefined會(huì)返回true, null === undefined會(huì)返回false
symbol
symbol代表獨(dú)一無二的值
- 用symbol作為對(duì)象的屬性名時(shí), 不能通過點(diǎn)去訪問屬性, 通過點(diǎn)訪問, js會(huì)將屬性名解析成字符串
- JSON中無法存儲(chǔ)Symbol類型的值
不可枚舉: 當(dāng)Symbol值作為對(duì)象屬性名時(shí), 可以保證對(duì)象不會(huì)出現(xiàn)重復(fù)的屬性, for in等方式無法枚舉Symbol值出來, 可以調(diào)用Object.getOwnPropertySymbols()獲取Symbol值. 借助Symbol的不可枚舉特性可以在js中模擬私有變量
object
對(duì)象是通過調(diào)用特殊的構(gòu)造函數(shù)創(chuàng)建的, 常常要使用到的對(duì)象有以下:- function: JavaScript的函數(shù)是具有可執(zhí)行代碼的對(duì)象, 可以通過調(diào)用函數(shù)執(zhí)行某些操作
- array
- class
- Date日期
- RegExp正則表達(dá)式
- 匹配所有中文字符, 匹配郵箱
- Math數(shù)學(xué)
- Math.ceil(), Math.floor()
- Math.round(), Math.random()
- JSON
- null, NaN, Infinity, -Infinity, 正則對(duì)象和undefined都會(huì)被轉(zhuǎn)成null
- JSON.parse(JSON.stringify())
Error: 程序中發(fā)生的語法錯(cuò)誤和運(yùn)行時(shí)錯(cuò)誤的對(duì)象
數(shù)據(jù)類型判斷
typeof
- 對(duì)于非object的基本類型, 除null以外, 均可返回意料之中的結(jié)果
- 對(duì)于引用類型, 除function以外, 一律返回object
- 對(duì)于null, 返回object
- 對(duì)于function, 返回function
- typeof(typeof a)返回的是string
因?yàn)閠ypeof NaN會(huì)返回number, 但是NaN不能用于數(shù)值計(jì)算, 所以在使用typeof判斷數(shù)字時(shí), 建議這樣子做: typeof num == 'number' && Number.isFinite(num)
instanceof
A instanceof B是用來判斷B的原型是否在A的原型鏈上
instanceof的問題在于它假定只有一個(gè)全局執(zhí)行環(huán)境, 如果存在兩個(gè)及以上的全局執(zhí)行環(huán)境, 那么就存在不同的構(gòu)造函數(shù), 此時(shí)instanceof無法進(jìn)行判斷
Object.prototype.toString.call
Object.prototype.toString.call(true) === '[object Boolean]'
constructor
當(dāng)聲明定義一個(gè)構(gòu)造函數(shù)時(shí), js會(huì)為構(gòu)造函數(shù)添加一個(gè)prototype屬性指向構(gòu)造函數(shù)的原型對(duì)象, 這個(gè)原型對(duì)象會(huì)有一個(gè)constructor屬性指向構(gòu)造函數(shù). 而當(dāng)使用new和構(gòu)造函數(shù)創(chuàng)建一個(gè)實(shí)例對(duì)象時(shí), 實(shí)例對(duì)象會(huì)繼承原型對(duì)象的constructor屬性
let a = [], b = 100; a.constructor == Array b.constructor == Number當(dāng)程序員重寫prototype指向之后, 原來的constructor就會(huì)丟失
使用JavaScript寫一個(gè)判斷數(shù)據(jù)類型的函數(shù)
function getType(data) {if(data === null) return 'Type: null';else if(data === undefined) return 'Type: undefined';else if(typeof data == 'number' && Number.isFinite(data)) return 'Type: number';else if(typeof data == 'string') return 'Type: string';else if(typeof data == 'boolean') return 'Type: boolean';else if(typeof data == 'function') return 'Type: function';else {let tmp = Object.prototype.toString.call(data);return 'Type:' + tmp.slice(7, tmp.length-1).toLowerCase();} }轉(zhuǎn)載于:https://www.cnblogs.com/lemachin/p/11090684.html
總結(jié)
以上是生活随笔為你收集整理的请你讲一讲JavaScript有哪些数据类型, 数据类型判断有哪些方法?的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 浏览器自动化的一些体会8 访问angul
- 下一篇: Linux安全出版