JavaScript的檢測及其數據類型


一、JavaScript有幾種類型的值?

Javascript有兩種數據類型,分別是基本數據類型和引用數據類型。其中基本數據類型包括Undefined、Null、Boolean、Number、String、Symbol (ES6新增,表示獨一無二的值),而引用數據類型統稱為Object對象,主要包括對象、數組和函數。接下來我們分別看下兩者的特點。

二、基本數據類型

1.值是不可變的

var name = 'java';
name.toUpperCase(); // 輸出 'JAVA'
console.log(name); // 輸出 'java'
復制代碼

由此可得,基本數據類型的值是不可改變的

2.存放在棧區

原始數據類型直接存儲在棧(stack)中的簡單數據段,占據空間小、大小固定,屬于被頻繁使用數據,所以放入棧中存儲。

3.值的比較

var a = 1;
var b = true;
console.log(a == b); // true
console.log(a === b); // false
復制代碼

== : 只進行值的比較,會進行數據類型的轉換。

=== : 不僅進行值得比較,還要進行數據類型的比較。

三、引用數據類型

1.值是可變的

var a={age:20};
a.age=21;
console.log(a.age)//21
復制代碼

上面代碼說明引用類型可以擁有屬性和方法,并且是可以動態改變的。

2.同時保存在棧內存和堆內存

引用數據類型存儲在堆(heap)中的對象,占據空間大、大小不固定,如果存儲在棧中,將會影響程序運行的性能;引用數據類型在棧中存儲了指針,該指針指向堆中該實體的起始地址。當解釋器尋找引用值時,會首先檢索其在棧中的地址,取得地址后從堆中獲得實體。

3.比較是引用的比較

當從一個變量向另一個變量賦引用類型的值時,同樣也會將存儲在變量中的對象的值復制一份放到為新變量分配的空間中。

var a={age:20};
var b=a;
b.age=21;
console.log(a.age==b.age)//true
復制代碼

上面我們講到基本類型和引用類型存儲于內存的位置不同,引用類型存儲在堆中的對象,與此同時,在棧中存儲了指針,而這個指針指向正是堆中實體的起始位置。變量a初始化時,a指針指向對象{age:20}的地址,a賦值給b后,b又指向該對象{age:20}的地址,這兩個變量指向了同一個對象。因此,改變其中任何一個變量,都會相互影響。

此時,如果取消某一個變量對于原對象的引用,不會影響到另一個變量。

var a={age:20};
var b=a;
a = 1;
b // {age:20}
復制代碼

上面代碼中,a和b指向同一個對象,然后a的值變為1,這時不會對b產生影響,b還是指向原來的那個對象。

四、檢驗數據類型

1.typeof

typeof返回一個表示數據類型的字符串,返回結果包括:number、boolean、string、symbol、object、undefined、function等7種數據類型,但不能判斷null、array等

typeof Symbol(); // symbol 有效
typeof ''; // string 有效
typeof 1; // number 有效
typeof true; //boolean 有效
typeof undefined; //undefined 有效
typeof new Function(); // function 有效
typeof null; //object 無效
typeof [] ; //object 無效
typeof new Date(); //object 無效
typeof new RegExp(); //object 無效
復制代碼

數組和對象返回的都是object,這時就需要使用instanceof來判斷

2.instanceof

instanceof 是用來判斷A是否為B的實例,表達式為:A instanceof B,如果A是B的實例,則返回true,否則返回false。instanceof 運算符用來測試一個對象在其原型鏈中是否存在一個構造函數的 prototype 屬性。

[] instanceof Array; //true
{} instanceof Object;//true
new Date() instanceof Date;//true
new RegExp() instanceof RegExp//true
復制代碼

關于數組的類型判斷,還可以用ES6新增Array.isArray()

Array.isArray([]); // true
復制代碼

instanceof 三大弊端

  • 對于基本數據類型來說,字面量方式創建出來的結果和實例方式創建的是有一定的區別的
console.log(1 instanceof Number)//false
console.log(new Number(1) instanceof Number)//true
復制代碼

從嚴格意義上來講,只有實例創建出來的結果才是標準的對象數據類型值,也是標準的Number這個類的一個實例;對于字面量方式創建出來的結果是基本的數據類型值,不是嚴謹的實例,但是由于JS的松散特點,導致了可以使用Number.prototype上提供的方法。

  • 只要在當前實例的原型鏈上,我們用其檢測出來的結果都是true。
  • 在類的原型繼承中,我們最后檢測出來的結果未必準確
var arr = [1, 2, 3];
console.log(arr instanceof Array) // true
console.log(arr instanceof Object); // true
function fn(){}
console.log(fn instanceof Function)// true
console.log(fn instanceof Object)// true
復制代碼
  • 不能檢測null 和 undefined

對于特殊的數據類型null和undefined,他們的所屬類是Null和Undefined,但是瀏覽器把這兩個類保護起來了,不允許我們在外面訪問使用

3.嚴格運算符===

只能用于判斷null和undefined,因為這兩種類型的值都是唯一的

var a = null
typeof a // "object"
a === null // true
復制代碼

undefined 還可以用typeof來判斷

var b = undefined;
typeof b === "undefined" // true
b === undefined // true
復制代碼

4.constructor

constructor作用和instanceof非常相似。但constructor檢測 Object與instanceof不一樣,還可以處理基本數據類型的檢測。

var aa=[1,2];
console.log(aa.constructor===Array);//true
console.log(aa.constructor===RegExp);//false
console.log((1).constructor===Number);//true
var reg=/^$/;
console.log(reg.constructor===RegExp);//true
console.log(reg.constructor===Object);//false 
復制代碼

constructor 兩大弊端

  • null 和 undefined 是無效的對象,因此是不會有 constructor 存在的,這兩種類型的數據需要通過其他方式來判斷。
  • 函數的 constructor 是不穩定的,這個主要體現在把類的原型進行重寫,在重寫的過程中很有可能出現把之前的constructor給覆蓋了,這樣檢測出來的結果就是不準確的
function Fn(){}
Fn.prototype = new Array()
var f = new Fn
console.log(f.constructor)//Array
復制代碼

本次給大家推薦一個免費的學習群,里面概括移動應用網站開發,css,html,webpack,vue node angular以及面試資源等。 對web開發技術感興趣的同學,歡迎加入Q群:864305860,不管你是小白還是大牛我都歡迎,還有大牛整理的一套高效率學習路線和教程與您免費分享,同時每天更新視頻資料。 最后,祝大家早日學有所成,拿到滿意offer,快速升職加薪,走上人生巔峰。

轉載于:https://juejin.im/post/5bc9c929e51d450e4369bcca

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/537673.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/537673.shtml
英文地址,請注明出處:http://en.pswp.cn/news/537673.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

我是Leader,我被降職成了普通員工,HR說:公司要梯隊年輕化

“BAT也不是完美的避風港哇~”這是老劉說的,老劉是BAT某家的一個Leader,職級約類似T7(T族一般是技術族,管理是M族),在BAT某家呆了11年,但是在整個互聯網行業推崇,梯隊年輕化的氛圍時,老劉所在的…

in最多可以放多少?_汽車最多可以停放多少天不開?維修師傅:盡可能別超過這個時間...

在當下,買車似乎已經成為了一種消費潮流,其中不乏一些本身用車需求不明顯但也隨大流買車的人,結果車買回來之后最初的新鮮勁一過就放在那里不怎么用了。當然也有部分車主是因為自己的工作修需要經常需要在外出差,那么就算想天天開…

計算機電源風扇安裝方法,機箱風扇怎么裝 電腦機箱風扇電源線接法

夏天天氣炎熱,電腦機箱內溫度也較高,溫度過高會影響電腦性能出現死機等問題,甚至影響硬件壽命。所以給機箱裝風扇來散熱是非常重要的。那么,機箱風扇怎么裝合理呢?機箱風扇的電源線怎么接呢?下面分享一下機箱風...夏天天氣炎熱&…

使用微服務失敗的12個原因

在過去的幾年中,我已經對處于數字化轉型過程中的多個產品團隊進行了架構審查。大多數團隊都在按照微服務架構構建產品。他們有使用基于微服務的體系結構的所有正確意圖-更快的開發,更好的可伸縮性,更小的獨立團隊,獨立的部署&…

市場壓力只有老板扛?柏明頓阿米巴如何傳遞經營壓力

內部交易是阿米巴經營模式中的一個重要環節,通過內部交易,使企業內部上下道工序之間以價格為紐帶,以服務和產品進行等價交換,統一結算交易。通過內部交易行為,可以掌握各個阿米巴單元的盈虧狀態。阿米巴構建內部市場&a…

flutter怎么添加ios網絡權限_視頻號直播間怎么添加購物車商品;超詳細流程步驟。丨國仁網絡資訊...

蘑菇租房的聯合創始人龍東平前幾個月曾說:“視頻號是一次掀翻桌子重新排座次的機會,是巨浪滔天,是新世界,新秩序。”視頻號發展趨勢愈加迅猛,越來越多的玩家涌入,正在獲得新一波社交流量。為什么更加受歡迎…

網絡中服務器是指為網絡提供資源,并對這些資源進行管理的計算機,2016年職稱計算機考試Internet沖刺試題及答案3...

1、Internet的通信協議是( A )A、TCP/IP B、OSI/ISOC、NetBEUI D、NWLink2、把計算機網絡分為有線和無線網的主要分類依據是(C)A、網絡成本 B、網絡的物理位置C、網絡的傳輸介質 D、網絡的拓撲結構3、要將兩臺計算機直接相連,那么使用雙絞線的類型為(A)A、交叉線 B、…

Visio 圖形大小如何隨文字多少自動調整?

Visio 圖形大小默認是根據圖形內文字多少自動調整。 如果手動調整過圖形,那么該圖形就不再隨文字多少自動調整了。 解決辦法: 刪除該圖形,重新拉取一個,重新編寫文本

java同一個包中,類之間的的調用

如果是靜態方法,直接 類名.方法名即可,如果是非靜態方法,則需new一個對象出來,然后用對象.方法名調用如:public class A{public static void T(){System.out.print("這是A類的方法");}public void T2(){Syst…

mos管開關電路_【電路】MOS管開關電路圖詳解(一)

MOS管的開關特性靜態特性MOS管作為開關元件,同樣是工作在截止或導通兩種狀態。由于MOS管是電壓控制元件,所以主要由柵源電壓uGS決定其工作狀態。工作特性如下:※uGS※ uGS>開啟電壓UT:MOS管工作在導通區,漏源電流iDSUDD/(RDrDS…

Visio圖形自動編號

操作步驟: 1.進入“視圖”--“加載項” 2.“加載項”---“運行加載項” 3.“運行加載項”---“給形狀編號”

偽代碼就是計算機語言 正確嗎,偽代碼實例紹.ppt

偽代碼實例紹第2章 偽代碼實例介紹 主講:黃明瓊 第2章 偽代碼實例介紹 2.1 偽代碼介紹 2.2 三角形問題 2.3 NextDate函數問題 2.4 傭金問題 2.5 簡單ATM系統 2.6 貨幣轉換器 本章教學目標 正確理解偽代碼的概念 正確理解偽代碼的規則 正確理解偽代碼實例中的邏輯 能…

Java面試170題答案解析(1-20題)

為什么80%的碼農都做不了架構師?>>> 轉載于:https://my.oschina.net/lanyu96/blog/2250020

query builder python-elasticsearch返回指定字段

1. postman 請求elasticsearch 返回指定字段 1.直接在請求體當中,json 數據,對應的是一個列表 { "_source":["title","id","desc"], "from":10, "size":100, } 至于from和size是淺分頁 2. …

Visio各圖形如何一鍵自動對齊?

在創作的過程中,不用管圖形是否對齊,間距是否一致,在最后的時候,一鍵對齊 具體操作: 開始---------位置------自動對齊與自動調整間距

黎明之路服務器正在維護,黎明之路進不去怎么辦_黎明之路更新失敗怎么辦_玩游戲網...

《代號Z》什么時候上線根據最新的消息,《代號Z》這款游戲已經正式更名為《黎明之路》,那么名字也最終確定了,這款游戲到底什么時候上線呢?下面就跟著玩游戲網的小編一起了解一下吧~《代號Z》上線時間:游戲將會在4月26日…

OpenGL陰影添加學習材料及總結

學習材料 PBR基于物理的實時渲染采用了更符合物理學規律的方式來模擬光線,通過模擬虛擬物體表面的粗糙程度,來計算出射該物體的光線呈現一個怎樣的方式。PBR材料的三個主要參數稱為:反照率、粗糙度、金屬度,上圖反映了在不同粗糙度…

Springboot與Spring的關系

闡述 boot這詞的翻譯:[計算機科學] 引導。 先拿生活中打電話的例子來解釋下這兩者的關系: Spring的電話號碼是:13355556666 攻城獅A,B,C都要聯系Spring 攻城獅A,每次都輸入Spring的號碼,再按撥號鍵,聯…

php修改學生信息代碼_值得收藏的CRM軟件客戶管理系統(包括JAVA/PHP)

悟空CRM是一款永久開源免費的CRM管理系統,悟空CRM-基于JAVA/TP5.0vueElementUI的前后端分離CRM系統 ,悟空CRM是基于JAVA/PHP多語言的B/S架構的管理軟件,為企業提供行業專屬的crm客戶管理方案。 悟空CRM,CRM,免費CRM,開源HRMS,開源OA,移動辦公,辦公軟件,手…

ajax驗證碼驗證對錯,jQuery Ajax顯示對號和錯號用于驗證輸入驗證碼是否正確

AJAX 的 jQuery Ajax顯示對號和錯號用于驗證輸入驗證碼是否正確廢話不多說了,直接給大家貼代碼了,具體代碼如下所示:$(document).ready(function(e) {$(#yes).hide();$(#no).hide();$(input[namegcode]).keyup(function(){if($(this).val().l…