最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

JavaScript數(shù)據(jù)類型及相互間的轉(zhuǎn)換規(guī)則

 更新時(shí)間:2022年09月14日 09:24:58   作者:i東東???????  
這篇文章主要介紹了JavaScript數(shù)據(jù)類型及相互間的轉(zhuǎn)換規(guī)則,文章通過圍繞主題展開詳細(xì)的內(nèi)容介紹,具有一定的參考價(jià)值,需要的小伙伴可以參考一下

數(shù)據(jù)類型的分類

JS中的數(shù)據(jù)類型有七中原始數(shù)據(jù)類型:

  • 原始數(shù)據(jù)類型[值類型/基本數(shù)據(jù)類型]:
    • number 數(shù)字
    • string 字符串
    • boolean 布爾
    • null 空對(duì)象指針
    • undefined 未定義
    • symbol 唯一值
    • bigint 大數(shù)
  • 對(duì)象類型[引用數(shù)據(jù)類型]
    • object
      • 標(biāo)準(zhǔn)普通對(duì)象 object
      • 標(biāo)準(zhǔn)特殊對(duì)象 Array、RegExp、Date、Math、Error...
      • 非標(biāo)準(zhǔn)特殊對(duì)象 Number、String、Boolean...
      • 可調(diào)用/執(zhí)行對(duì)象 函數(shù)Function

非標(biāo)準(zhǔn)特殊對(duì)象

除了null和undefined每個(gè)原始值類型都有一個(gè)自己對(duì)應(yīng)的對(duì)象類型值

Symbol

Symbol是唯一值,他是不能通過New操作符進(jìn)行創(chuàng)建的,每次執(zhí)行Symbol都是創(chuàng)建一個(gè)唯一值,下方代碼A和B雖然看起來是一樣的但卻不相等的兩個(gè)值。假如如果把C=A這樣把A的值賦給C,那么A和C肯定是相等的

let A = Symbol('i東東')
let B = Symbol('i東東')
let C = A 
console.log(A === B); // false
console.log(A === C); // true

應(yīng)用場(chǎng)景

  • 給對(duì)象設(shè)置唯一值的屬性名,在ES6之前對(duì)象的屬性名只能是字符串類型,但是新增了ES6之后對(duì)象的屬性名增加了可以用Symbol類型的屬性名。
  • Map新的數(shù)據(jù)結(jié)構(gòu):可以允許屬性名是對(duì)象
  • Symbol.asyncIterator/iterator/hasInstance/toStringTag...是某些JS知識(shí)底層實(shí)現(xiàn)機(jī)制
  • 在派發(fā)行為標(biāo)識(shí)進(jìn)行統(tǒng)一管理的時(shí)候,可以基于Symbol類型的值,保證標(biāo)識(shí)的唯一性

用字符串和數(shù)字類型的都可以取到值,name就可以認(rèn)為他們的屬性名是字符串類型的 

下方代碼console.log([Symbol('AA')])是無法取到值的,因?yàn)檫@個(gè)相當(dāng)于創(chuàng)建了一個(gè)新的唯一值,用新的唯一值去訪問是不對(duì)應(yīng)的,正確的方法應(yīng)該是創(chuàng)建一個(gè)唯一值,再把這個(gè)唯一值作為屬性去訪問。

let key = Symbol('88')
let obj = {
  num: 100,
  10:'數(shù)字',
  [Symbol('AA')]:'Symbol類型的屬性名', // 在大括號(hào)中加Symbol語法要求必須加大括號(hào)
  [key]:400
}
console.log(obj[Symbol('AA')]); // undefined
console.log(obj[key]); // 400說

一個(gè)對(duì)象的屬性名是不能重復(fù)的,用唯一值做屬性的好處就是,他是不會(huì)重復(fù)的

let obj = {
  [Symbol('AA')]: 100,
  [Symbol('AA')]: 100,
  // 這兩個(gè)是不同的兩個(gè)值
}

BigInt 大數(shù)類型

JS中的最大安全數(shù) Number.MAX_SAFE_INTEGER = 9007199254740991

JS中的最小安全數(shù) Number.MIN_SAFE_INTEGER = -9007199254740991

超過安全數(shù)后,進(jìn)行運(yùn)算或者訪問,結(jié)果會(huì)不準(zhǔn)確?。?/strong> 數(shù)據(jù)庫當(dāng)中存取數(shù)據(jù)會(huì)分成整型、長(zhǎng)整型、短整型,長(zhǎng)整型支持的數(shù)字長(zhǎng)度是比JS的安全數(shù)大的,當(dāng)服務(wù)器返回給客戶端一個(gè)長(zhǎng)整型的數(shù)字,如果超出最大安全數(shù)值就會(huì)出現(xiàn)問題。

 解決方案

  • 服務(wù)器端給客戶端返回大數(shù),按照字符串格式返回!
  • 客戶端把其變換成 Bigint
  • 最后把運(yùn)算后的BigInt轉(zhuǎn)換為字符串,再傳遞給服務(wù)器
console.log(BigInt('9007199254740991') + BigInt(12345)); // 9007199254753336n
console.log(9007199254753336n.toString()); // 9007199254753336
// 123n  在數(shù)字后面直接加`n`也表示大數(shù)BigInt

數(shù)據(jù)類型檢測(cè)

  • typeof
  • instanceof
  • constryctor
  • Object.prototype.toString.call
  • Array.isArray
  • isNaN

在日常開發(fā)中用到最多的就是typeof檢測(cè)數(shù)據(jù)類型,所有的數(shù)據(jù)類型值,在計(jì)算機(jī)底層都是按照'64位'的二進(jìn)制進(jìn)行存儲(chǔ)的!type是按照二進(jìn)制值進(jìn)行檢測(cè)類型的

例如

  • 二進(jìn)制的前三位是0,認(rèn)為是對(duì)象,然后再去看有沒有實(shí)現(xiàn)call方法,如果實(shí)現(xiàn)了返回'functhon',沒有時(shí)間,則返回'object'
  • 第一位是1為整數(shù)
  • 010浮點(diǎn)數(shù)
  • 100字符串
  • 110布爾
  • 000000... null(null為64個(gè)0) ==> object [因?yàn)閠ypeof的局限性]
  • ......

檢測(cè)未被申明的變量,值為undefined

console.log(a); // ReferenceError: a is not defined
console.log(typeof a); // undefined

場(chǎng)景1:檢測(cè)當(dāng)前值是否是一個(gè)對(duì)象

const fn = options =>{
   let type = typeof options
   if(options !== null && (type === 'object' || type === 'function')){
    // 這樣進(jìn)來的才能確保是一個(gè)對(duì)象
   }
}
fn({
  num:10
})

場(chǎng)景2:支持更多的模塊導(dǎo)入方案

(function(){
  if(typeof window !== 'undefined') window.utils = utils
  if(typeof module === 'object' && typeof module.exports == 'object') module.exports = utils
})()

數(shù)據(jù)類型間的相互轉(zhuǎn)換

數(shù)據(jù)類型間的相互轉(zhuǎn)換主要有隱式數(shù)據(jù)類型轉(zhuǎn)換和顯示數(shù)據(jù)類型轉(zhuǎn)換兩種。 一般用于瀏覽器中的隱式轉(zhuǎn)換

  • 數(shù)學(xué)運(yùn)算
  • isNaN檢測(cè)
  • == 比較

比如說在數(shù)據(jù)運(yùn)算時(shí)會(huì)進(jìn)行隱式數(shù)據(jù)類型轉(zhuǎn)換,10-2的時(shí)候?qū)嶋H上默認(rèn)就調(diào)用了Number('2')進(jìn)行了類型轉(zhuǎn)換之后才進(jìn)行的減法運(yùn)算。

比如用isNaN來判斷時(shí)前值是不是一個(gè)有效數(shù)字,就相當(dāng)于調(diào)用了下面的方法,先調(diào)用Number再執(zhí)行isNaN。

規(guī)則

Number([val])

  • 字符串轉(zhuǎn)換為數(shù)字:空字符串變?yōu)?,如果出現(xiàn)任何非有效數(shù)字字符都是NaN
  • 把布爾值轉(zhuǎn)換成數(shù)字:true=>1 false=>0
  • null=>0 undefined=>NaN
  • Symbol無法轉(zhuǎn)換為數(shù)字,會(huì)報(bào)錯(cuò):Cannot convert a Symbol value to a number
  • BigInt去除'n'(超出安全數(shù)字的會(huì)按照科學(xué)計(jì)數(shù)法處理)
  • 那對(duì)象轉(zhuǎn)換為數(shù)字:先調(diào)用對(duì)象的Symbol.toPrimitive方法,如果不存在這個(gè)方法,再調(diào)用valueOf獲取原始值,如果獲取的值不是原始值,在調(diào)用toString把其變?yōu)樽址?,最后自傲把字符串用過Number方法進(jìn)行轉(zhuǎn)換
let time = new Date()
console.log(Number(time)); // 1662715039452
console.log(time[Symbol.toPrimitive]('number')); // 1662715039452
// 首先檢測(cè) Symbol.toPrimitive有沒有, 結(jié)果:有 而且是一個(gè)函數(shù) time[Symbol.toPrimitive]('number')
let arr = [10]
console.log(Number(arr));
/**
 * 首先arr[Symbol.toPrimitive] => undefined
 * 然后arr.valueOf() 數(shù)組是沒有原始值的 => [10]  任何一個(gè)對(duì)象都有valueOf
 * 再然后 arr.toString => '10'
 * 最后在把字符串'10'轉(zhuǎn)換為數(shù)字 => 10
*/
let num = new Number(10)
console.log(Number(num));
/**
 * 首先num[Symbol.toPrimitive] => undefined
 * 然后num.valueOf() 數(shù)組是沒有原始值的 => 10
*/

parseInt([val],[radix]) parseFloat([val])

parseInt([val],[radix])是可以傳兩個(gè)值進(jìn)去的:

  • value必須是字符串,不是字符串會(huì)會(huì)先隱式轉(zhuǎn)換成字符串,通過String([val]),如果是對(duì)象會(huì)用上面的三步進(jìn)行轉(zhuǎn)換
  • radix進(jìn)制,如果不寫或者寫0,則默認(rèn)為10進(jìn)制,如果字符串是以0x開始的,默認(rèn)為16進(jìn)制,有效進(jìn)制范圍2~36之間(如果不在這個(gè)區(qū)間結(jié)果直接是NaN)。從[val]字符串左側(cè)開始第一個(gè)字符開始查找,查找出符合[radix]進(jìn)制的值(遇到不符合的則結(jié)束查找,無論后面是否還有有符合的),把找到的內(nèi)容按照[radix]進(jìn)制,轉(zhuǎn)化為10進(jìn)制!!
console.log(parseInt('10103px13',2));  // 10
/**
 * 首先找到符合二進(jìn)制的數(shù) '1010'
 * 把這個(gè)二進(jìn)制值轉(zhuǎn)換為十進(jìn)制 '按權(quán)展開求和'
 * 1*2^3+0*2^2+1*2^1+0*2^0 => 8+0+2+2 => 10
*/

這里放一道字節(jié)面試題

arr會(huì)輸出什么,為什么?
let arr = [27.2,0,'0013','14px',123]
arr = arr.map(parseInt)

解題步驟

  • arr.map方法:迭代數(shù)組中的每一項(xiàng),并且把每一項(xiàng)進(jìn)行修改,原始數(shù)組不變,以新數(shù)組的形式返回。迭代數(shù)組中的每一項(xiàng)item為當(dāng)前值,index為索引。
  • map中應(yīng)該接受一個(gè)函數(shù),現(xiàn)在我們是把parseInt作為這個(gè)函數(shù)傳遞進(jìn)去了,所以每次迭代都會(huì)執(zhí)行parseInt并且將item和index作為參數(shù)傳遞進(jìn)去
/**
 * parseInt(27.2,0) => 找符合二進(jìn)制的'27',當(dāng)做十進(jìn)制轉(zhuǎn)成十進(jìn)制=> 27
 * parseInt(0,1) => 超出有效進(jìn)制范圍 => NaN
 * parseInt('0013',2) => 001 當(dāng)做二進(jìn)制轉(zhuǎn)化為十進(jìn)制 => 0+0+1 => 1
 * parseInt('14px',3) => 1 當(dāng)做三進(jìn)制轉(zhuǎn)成十進(jìn)制 => 1
 * parseInt(123,4) => parseInt('123',4) => 123當(dāng)做四進(jìn)制轉(zhuǎn)成十進(jìn)制 1*4^2+2*4^1+3*4^0 => 16+8+4 => 27
*/

所以最終得:arr =  [27, NaN, 1, 1, 27]

:

parseInt('0013',2) => 001 當(dāng)做二進(jìn)制轉(zhuǎn)化為十進(jìn)制 => 0+0+1 => 1
parseInt(0013,2) => 0013 當(dāng)js中遇到以0開頭的數(shù)字會(huì)默認(rèn)當(dāng)做8進(jìn)制轉(zhuǎn)為10進(jìn)制然后在進(jìn)行其他運(yùn)算 => 當(dāng)做八進(jìn)制轉(zhuǎn)為十進(jìn)制 0*8^3+0*8^2+1*8^1+3*8^0 => 11 => 二進(jìn)制轉(zhuǎn)十進(jìn)制 11   2+1=3

把其他類型轉(zhuǎn)換為String

轉(zhuǎn)換規(guī)則:

  • '+'出現(xiàn)左右兩邊,其中一邊是字符串,或者是某些對(duì)象,會(huì)以字符串拼接的規(guī)則處理
  • '+'出現(xiàn)在一個(gè)值的左邊,轉(zhuǎn)換為數(shù)字
console.log(10 + '10'); // 1010
console.log(10 + new Number(10));
// new Number(10)[Symbol.toPrimitive] -> undefined
// new Number(10).valueOf() => 10 
//  10 + 10 = 20
console.log(10 + new Date());
// new Date()[Symbol.toPrimitive]('default') -> 不知道傳遞什么會(huì)傳defaulu => 'Tue Sep 13 2022 17:00:40 GMT+0800 (中國(guó)標(biāo)準(zhǔn)時(shí)間)'
// 最終等于:10'Tue Sep 13 2022 17:00:40 GMT+0800 (中國(guó)標(biāo)準(zhǔn)時(shí)間)'
console.log(10 + [10]);
// [10][Symbol.toPrimitive] -> undefined
// [10].valueOf => '[10]' 
// [10].toString() => '10'
// 最終等于: '1010'
let num = '10'
console.log(+num) // 10 轉(zhuǎn)換為數(shù)字

把其他類型的值轉(zhuǎn)換成Boolean

Boolean(0) = false 除了0 NaN undefined 空字符串 null 以外都是true

==兩個(gè)等號(hào)比較規(guī)則

  • ==相等,兩邊數(shù)據(jù)類型不同,首先要轉(zhuǎn)換為相同類型,然后在進(jìn)行比較
  • 對(duì)象==字符串 對(duì)象轉(zhuǎn)字符串[Symbol.toPrimitive]->valueOf()->toString()
  • null == nudefined -> true null/undefined和其他任何值都不相等
  • null === undefined -> false
  • 對(duì)象==對(duì)象 比較的是堆內(nèi)存地址,地址相同則相等
  • NaN !== NaN
  • 除了以上情況,只要兩邊類型不一致,剩下的都是轉(zhuǎn)換為數(shù)字,然后在進(jìn)行比較的,'==='絕對(duì)相等,如果兩邊類型不同則直接是false,不會(huì)轉(zhuǎn)換數(shù)據(jù)類型。
NaN == NaN // false NaN永遠(yuǎn)不可能等于NaN
console.log(Object.is(NaN,NaN)); // true

貼一道面試題 下面輸出為什么?

console.log([]==false); // 首先都會(huì)轉(zhuǎn)換為數(shù)字, 0 == 0 => true
console.log(![]==false); // 先處理![]=>false == false  =>true

Js中的裝箱和拆箱

裝箱和拆箱都是瀏覽器進(jìn)行數(shù)據(jù)類型隱式轉(zhuǎn)換的過程

let num = 10
console.log(num.toFixed(2)); // 10.00
// num是原始值,不是對(duì)象,按常理來講是不能做'成員訪問'的
// 默認(rèn)會(huì)做裝箱操作:  new Number(num) 變?yōu)榉菢?biāo)準(zhǔn)鐵樹對(duì)象,這樣就可以調(diào)用toFixed了
let num = new Number(10)
console.log(num + 10); // 20 
// 在操作的過程中瀏覽器會(huì)將num這個(gè)非標(biāo)準(zhǔn)特殊對(duì)象變?yōu)樵贾? [Symbol.toPrimitive] -> valueOf -> toString 這個(gè)操作叫做拆箱
// 裝箱和拆箱都是瀏覽器進(jìn)行數(shù)據(jù)類型隱式轉(zhuǎn)換的過程

到此這篇關(guān)于JavaScript數(shù)據(jù)類型及相互間的轉(zhuǎn)換規(guī)則的文章就介紹到這了,更多相關(guān)JavaScript數(shù)據(jù)類型內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • 詳解webpack-dev-middleware 源碼解讀

    詳解webpack-dev-middleware 源碼解讀

    這篇文章主要介紹了webpack-dev-middleware 源碼解讀,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2020-03-03
  • js實(shí)現(xiàn)掃雷小程序的示例代碼

    js實(shí)現(xiàn)掃雷小程序的示例代碼

    本篇文章主要介紹了js實(shí)現(xiàn)掃雷小程序的示例代碼,小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過來看看吧
    2017-09-09
  • JavaScript實(shí)現(xiàn)鼠標(biāo)移動(dòng)事件畫筆

    JavaScript實(shí)現(xiàn)鼠標(biāo)移動(dòng)事件畫筆

    這篇文章主要為大家詳細(xì)介紹了JavaScript實(shí)現(xiàn)鼠標(biāo)移動(dòng)事件畫筆,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2022-08-08
  • 輪播圖組件js代碼

    輪播圖組件js代碼

    這篇文章主要為大家介紹了輪播圖組件JavaScript代碼,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2016-08-08
  • javascript數(shù)組去重3種方法的性能測(cè)試與比較

    javascript數(shù)組去重3種方法的性能測(cè)試與比較

    面試題中有一題數(shù)組去重,首先想到的是對(duì)象存鍵值的方法可是遇到不同類型又能轉(zhuǎn)換成同樣的字符串的就完了接下來為大家介紹下雙重循環(huán)/存鍵值和類型實(shí)現(xiàn)去重,感興趣的各位可以參考下哈
    2013-03-03
  • 全面解析JavaScript里的循環(huán)方法之forEach,for-in,for-of

    全面解析JavaScript里的循環(huán)方法之forEach,for-in,for-of

    這篇文章主要介紹了全面解析JavaScript里的循環(huán)方法之forEach,for-in,for-of的相關(guān)資料,非常不錯(cuò)具有參考借鑒價(jià)值,需要的朋友可以參考下
    2016-06-06
  • JavaScript實(shí)現(xiàn)多文件下載方法解析

    JavaScript實(shí)現(xiàn)多文件下載方法解析

    這篇文章主要介紹了JavaScript實(shí)現(xiàn)多文件下載方法解析,文章通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2020-08-08
  • 如何豐富alt屬性的顯示效果

    如何豐富alt屬性的顯示效果

    如何豐富alt屬性的顯示效果...
    2007-01-01
  • JS字符串去除連續(xù)或全部重復(fù)字符的實(shí)例

    JS字符串去除連續(xù)或全部重復(fù)字符的實(shí)例

    這篇文章主要介紹了JS字符串去除連續(xù)或全部重復(fù)字符的實(shí)例,需要的朋友可以參考下
    2018-03-03
  • 新手學(xué)習(xí)前端之js模仿淘寶主頁網(wǎng)站

    新手學(xué)習(xí)前端之js模仿淘寶主頁網(wǎng)站

    淘寶網(wǎng)大家在熟悉不過了,那么淘寶網(wǎng)首頁模板是怎么做的呢?今天小編抽時(shí)間給大家分享新手學(xué)習(xí)前端之js模仿淘寶主頁網(wǎng)站的相關(guān)資料,需要的朋友可以參考下
    2016-10-10

最新評(píng)論

平山县| 电白县| 土默特右旗| 西华县| 巴中市| 太和县| 来凤县| 福州市| 临洮县| 淳化县| 温宿县| 马龙县| 石泉县| 成武县| 苍梧县| 延庆县| 黑水县| 万年县| 车险| 盖州市| 嘉兴市| 绥宁县| 抚宁县| 瓦房店市| 原阳县| 泸定县| 苏尼特左旗| 马尔康县| 广灵县| 平利县| 灵川县| 宝鸡市| 泗水县| 永和县| 玛多县| 桐庐县| 富蕴县| 南乐县| 临海市| 文水县| 福鼎市|