中文字幕av专区_日韩电影在线播放_精品国产精品久久一区免费式_av在线免费观看网站

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

js數據類型檢測總結

發布時間:2020-10-12 02:04:34 來源:腳本之家 閱讀:136 作者:余大彬 欄目:web開發

在js中,有四種用于檢測數據類型的方式,分別是:

  • typeof  用來檢測數據類型的運算符
  • instanceof    檢測一個實例是否屬于某個類
  • constructor   構造函數
  • Object.prototype.toString.call()  原型鏈上的Object對象的toString方法

下面我們就來分別介紹一下上面四種方法的適用場景和局限性。

typeof 用來檢測數據類型的運算符

使用typeof檢測數據類型,返回值是字符串格式。能夠返回的數據類型

是:"number","string","bolean","undefined","function","object"。

<script>
  console.log(typeof(1));  //number
  console.log(typeof('hello'));  //string
  console.log(typeof(true));  //boolean
  console.log(typeof(undefined));  //undefined
  console.log(typeof(null));  //object
  console.log(typeof({}));  //object
  console.log(typeof(function() {}));  //function
</script>

局限性:

  • typeof (null); //"object"。這是由于在js中,null值表示一個空對象指針,而這也正是使用typeof操作 符檢測null值時會返回"object"的原因。
  • 不能具體的細分是數組還是正則,還是對象中其他的值,因為使用typeof檢測數據類型,對于對象數據類型的所有的值,最后返回的都是"object"

instanceof 檢測某一個實例是否屬于某個類

instanceof主要用來彌補typeof不能檢測具體屬于哪個對象的局限性。

<script>
  let arr = [1,2,3];
  let reg = /\w/;
  console.log(arr instanceof Array);  //true
  console.log(arr instanceof Object);  //true
  console.log(reg instanceof RegExp);  //true
  console.log(reg instanceof Object);  //true
</script>

局限性:

  • 不能用于檢測和處理字面量方式創建出來的基本數據類型值,即原始數據類型
  • instanceof的特性:只要在當前實例的原型鏈上的對象,我們用其檢測出來都為true
  • 在類的原型繼承中,我們最后檢測出來的結果未必正確

constructor 構造函數

是函數原型上的屬性,該屬性指向的是構造函數本身。

作用和instsnceof非常相似,與instanceof不同的是,不僅可以處理引用數據類型,還可以處理原始數據類型。

<script>
  let num = 12;
  let obj = {};
  console.log(num.constructor == Number);//true
  console.log(obj.constructor == Object);//true
</script>

但是要注意一點的是,當直接用(對象字面量或原始數據).constructor時,最好加上()。為了便于理解,我們來看一個例子。

<script>
  1.constructor === Number;    //報錯,Invalid or unexceped token
  (1).constructor === Number;    //true
  {}.constructor === Number;    //報錯,Invalid or unexceped token
  ({}).constructor === Number;  //true
</script>

這主要是由于js內部解析方式造成的,js會把1.constructor解析成小數,這顯然是不合理的,小數點后應該是數字,因此就會引發報錯。js會把{}解析成語句塊來執行,這時后面出現一個小數點顯然也是不合理的,因此也會報錯。為了解決這個問題,我們可以為表達式加上()使js能夠正確解析。

局限性:我們可以把類的原型進行重寫,在重寫的過程中很可能把之前constructor給覆蓋了,這樣檢測出來的結果就是不準確的

<script>
   function Fn() {};
  Fn.prototype = new Array;
  var f = new Fn;
  //f是一個函數,按道理說他的構造函數應該是Function,但是修改其原型鏈后,它的constructor變成了Array.
  console.log(f.constructor == Array);  //true
</script>

Object.prototype.toString.call() 原型鏈上的Object對象的toString方法

Object.prototype.toString的作用是返回當前方法的執行主體(方法中的this)所屬類的詳細信息,是最全面也是最常用的檢測數據類型的方式。

返回值的類型為string類型。

<script> 
  console.log(Object.prototype.toString.call(1));          //[object Number]
  console.log(Object.prototype.toString.call(/^sf/));        //[object RegExp]
  console.log(Object.prototype.toString.call("hello"));      //[object String]
  console.log(Object.prototype.toString.call(true));        //[object Boolean]
  console.log(Object.prototype.toString.call(null));        //[object Null]
  console.log(Object.prototype.toString.call(undefined));      //[object Undefined]
  console.log(Object.prototype.toString.call(function() {}));    //[object Function]
  console.log(typeof(Object.prototype.toString.call(function() {})));    //string
</script>

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

湖口县| 吉木萨尔县| 静安区| 海宁市| 新建县| 汝阳县| 繁昌县| 丰县| 巩留县| 府谷县| 连平县| 上蔡县| 新民市| 望谟县| 北海市| 黑龙江省| 天全县| 介休市| 都江堰市| 红桥区| 建宁县| 宁明县| 洱源县| 水富县| 罗城| 务川| 葵青区| 灵台县| 柞水县| 工布江达县| 尖扎县| 盐边县| 虞城县| 松江区| 乳源| 苍梧县| 江永县| 玉山县| 万载县| 兴化市| 观塘区|