<kbd id="afajh"><form id="afajh"></form></kbd>
<strong id="afajh"><dl id="afajh"></dl></strong>
    <del id="afajh"><form id="afajh"></form></del>
        1. <th id="afajh"><progress id="afajh"></progress></th>
          <b id="afajh"><abbr id="afajh"></abbr></b>
          <th id="afajh"><progress id="afajh"></progress></th>

          js 數(shù)據(jù)類型總結(jié)

          共 5180字,需瀏覽 11分鐘

           ·

          2021-05-30 11:57

          作者:小白逆襲

          來源:SegmentFault 思否社區(qū)


          一. js數(shù)據(jù)類型

          • String
          • Number
          • Boolean
          • null
          • Undefined
          • Object(包括派生類:Array, Function, Set, Map, Date, RegExp, WeakMap, WeakSet)
          • Symbol
          • BigInt(ES2020, 用來表示大于 js中最大整數(shù)2^53 - 1 的整數(shù))

          分為基本類型(除Obejct類型外的類型)和引用類型(復(fù)合類型)

          1. 基本數(shù)據(jù)類型:值類型, 變量存儲(chǔ)在棧內(nèi)存中
          2. 引用數(shù)據(jù)類型:變量存儲(chǔ)在堆內(nèi)存和棧內(nèi)存中,棧內(nèi)存中存儲(chǔ)變量的標(biāo)識(shí)符和指向堆內(nèi)存中該對(duì)象的指針即堆內(nèi)存中該對(duì)象的地址),引用類型的值是按引用訪問

          undefined與null區(qū)別以及使用場(chǎng)景

          null 指代空對(duì)象指針
          使用場(chǎng)景:
          (1)釋放內(nèi)存
          (2)空值判斷

          undefined 表示此處應(yīng)該有一個(gè)值,但是還沒有定義
          使用場(chǎng)景:
          (1)變量被聲明了,但沒有賦值時(shí),就等于undefined。
          (2)調(diào)用函數(shù)時(shí),應(yīng)該提供的參數(shù)沒有提供,該參數(shù)等于undefined。
          (3)對(duì)象沒有賦值的屬性,該屬性的值為undefined。
          (4)函數(shù)沒有返回值時(shí)或者return后面什么也沒有,返回undefined

          初始化變量時(shí)可根據(jù)希望存放類型指定
          let a = null;  // 存放對(duì)象
          let b = undefined;   //存放數(shù)值

          symbol類型

          symbol用于模擬私有方法或?qū)傩裕?nbsp;任意一個(gè)symbol數(shù)據(jù)是一個(gè)獨(dú)一無二的值

          symbol屬性名以及對(duì)象各類屬性的屬性名遍歷:

          let obj = Object.create({}, {
            getFoo: {
              value: function() { return this.a; },
              enumerable: false,
            }
          })
          obj.a = 1,
          obj.b = function() {},
          obj[Symbol('a')] = 2,

          Object.getOwnPropertySymbols(obj); //[Symbol(a)]  遍歷自身symbol類型屬性
          Object.getOwnPropertyNames(obj); //['a''b''getFoo']  遍歷自身非symbol類型屬性(包括不可枚舉屬性)
          Reflect.ownKeys(obj);  //[Symbol(a), 'a''b''getFoo']  遍歷自身所有類型屬性,包括不可枚舉和symbol類型
          Object.keys(obj); //['a''b'] 遍歷自身可枚舉屬性, 
          // for...in遍歷可枚舉屬性(包括繼承而來的), 搭配hasOwnProperty使用過濾出自身可枚舉屬性


          二. 數(shù)據(jù)類型的判斷方式

          • typeof
          • instanceof
          • constructor
          • Object.prototype.toString.call()
          1. typeof
            判斷結(jié)果: 'string'、'number'、'boolean'、'undefined'、'function' 、'symbol'、'bigInt'、'object'

          特殊情形

          // 數(shù)據(jù)類型與typeof結(jié)果表現(xiàn)形式不同:
          console.log(typeof function(){});  // 'function'
          console.log(typeof null);          // 'object'

          // 對(duì)于null, Object及其派生類型(Array, Date, RegExp等),無法使用typeof進(jìn)行類型的判斷,需要使用instanceof
          console.log(typeof new Date());    // 'object'
          console.log(typeof new RegExp());  // 'object'
          1. instanceof

          語法:A instanceof B , 即判斷A是否為B類型的實(shí)例,也可以理解為B的prototype是否在A的原型鏈上

          console.log([] instanceof Array);                  // true
          console.log({a: 1} instanceof Object);             // true
          console.log(new Date() instanceof Date);           // true

          // 注意:對(duì)于基本類型,使用字面量聲明的方式可以正確判斷類型
          console.log(new String('dafdsf') instanceof String) // true
          console.log('csafcdf' instanceof String) // false, 原型鏈不存在
          1. constructor

          當(dāng)一個(gè)函數(shù)F被定義時(shí),JS引擎會(huì)為F添加prototype原型,然后在prototype上添加一個(gè)constructor屬性,并讓其指向F的引用,F(xiàn)利用原型對(duì)象的constructor屬性引用了自身,當(dāng)F作為構(gòu)造函數(shù)創(chuàng)建對(duì)象時(shí),原型上的constructor屬性被遺傳到了新創(chuàng)建的對(duì)象上,從原型鏈角度講,構(gòu)造函數(shù)F就是新對(duì)象的類型。這樣做的意義是,讓對(duì)象誕生以后,就具有可追溯的數(shù)據(jù)類型

          console.log([].constructor === Array)                // true
          console.log(new Date().constructor === Date)         // true
          console.log(new RegExp().constructor === RegExp)     // true

          // 特殊的, null和undefined無法使用這種方式判斷,因?yàn)樗麄儾皇峭ㄟ^構(gòu)造函數(shù)方式聲明

          在js中,一般會(huì)使用修改原型的方式實(shí)現(xiàn)js的繼承,這種情況下一般要同步修改constructor 屬性, 防止引用的時(shí)候出錯(cuò), 例如:

          function Aoo(){}
          function Foo(){} 
          Foo.prototype = new Aoo();
          Foo.prototype.constructor = Foo;
          var foo = new Foo(); 
          console.log(foo instanceof Foo)//true 
          console.log(foo instanceof Aoo)//true
          1. Object.prototype.toString.call()
          console.log(Object.prototype.toString.call(1))          // '[object Number]'
          console.log(Object.prototype.toString.call(1n))         // '[object BigInt]'
          console.log(Object.prototype.toString.call('123'))      // '[object String]'
          console.log(Object.prototype.toString.call(null))       // '[object Null]'
          console.log({}.toString())         // '[object Object]'
          console.log(Object.prototype.toString.call([]))         // '[object Array]'
          console.log(Object.prototype.toString.call(function a() {}))  // '[object Function]'
          綜上可得,最能準(zhǔn)確判斷數(shù)據(jù)類型的方式為Object.prototype.toString.call()
          特別的,實(shí)際項(xiàng)目開發(fā)中,經(jīng)常用于判斷對(duì)象和數(shù)組的幾種方式:
          • instanceof
          • isPrototypeOf: Array.isPrototypeOf({} | []), 基于原型鏈的概念
          • constructor: [] | {}.constructor = Array
          • isArray
          • Object.prototype.toString.call({} | [])


          點(diǎn)擊左下角閱讀原文,到 SegmentFault 思否社區(qū) 和文章作者展開更多互動(dòng)和交流,掃描下方”二維碼“或在“公眾號(hào)后臺(tái)回復(fù)“ 入群 ”即可加入我們的技術(shù)交流群,收獲更多的技術(shù)文章~

          - END -


          瀏覽 50
          點(diǎn)贊
          評(píng)論
          收藏
          分享

          手機(jī)掃一掃分享

          分享
          舉報(bào)
          評(píng)論
          圖片
          表情
          推薦
          點(diǎn)贊
          評(píng)論
          收藏
          分享

          手機(jī)掃一掃分享

          分享
          舉報(bào)
          <kbd id="afajh"><form id="afajh"></form></kbd>
          <strong id="afajh"><dl id="afajh"></dl></strong>
            <del id="afajh"><form id="afajh"></form></del>
                1. <th id="afajh"><progress id="afajh"></progress></th>
                  <b id="afajh"><abbr id="afajh"></abbr></b>
                  <th id="afajh"><progress id="afajh"></progress></th>
                  成人自拍视频在线观看 | 免费黄色国产在线 | 丝袜足交片 | 亚洲日本黄色三级电影在线观看 | 欧美性受XXXXX黑人性爽 强欧美小嫩苞第一次免费视频 |