標籤:boolean console 複製 opera 種類 檢測 == 就會 正則
一、從儲存看變數
在js中,變數按儲存方式來說,有兩種類型,一是實值型別,二是參考型別。
先說實值型別,在js中,實值型別有Number、String、 Boolean、undefined、null。那麼在記憶體中,實值型別儲存的就是這些基本資料變數的值,如果我們要對這些變數進行複製,那麼我們需要一塊新的記憶體空間來存放複製的值。
那參考型別又是什麼呢,參考型別在js中有對象、函數、數組,作為參考型別,他們都可以無限的擴充屬性,那麼當一個參考型別擴充的屬性非常多的時候,我們進行複製是不是就要拿出一塊相應的空間去存放,那佔得記憶體就會非常大了,所以參考型別存放的只是一個引用也就是一個指標,指向在堆中真正的資料。
在這裡舉一個可能不是很恰當的例子,我們把房子作為記憶體空間,聲明的變數就是房子裡的東西,實值型別是什麼呢?我看了你這個房間,我也很想要,於是乎我就建立了一個房子,然後把其中的東西原封不動的複製一份搬到我的房子裡,這就是實值型別複製的特性。下面看代碼例子:
1 var home = "精裝修房子"; // 建立一個字串類型的值2 var newHome = home; // 我也擁有了一棟一模一樣的房子3 newHome = "別墅"; // 現在我把房子蓋成了別墅4 console.log(home); // "精裝修房子",是互不影響的
實值型別
那麼參考型別是什麼呢,就是我很喜歡你這個房子,那你就把鑰匙配給我一把,我也可以使用這個房子,但是我對這個房子的使用方式也會影響到你的使用,我往裡面填了一個電視,那麼你用的時候電視是在裡面的了。下面看代碼:
1 // 一個新房子 2 var home = { 3 name: "居客"; 4 bed: "木板床" 5 }; 6 // 我很喜歡,給我一把鑰匙 7 var me = home; 8 // 修改房子,買一個電視 9 me.TV = "長虹";10 console.log(home);參考型別
二、typeof和instanceof
在面試的時候我們會經常的遇到一個這樣的問題,typeof的傳回值有什麼,或者是說直接給你一個語句問你傳回值是什麼。
那麼typeof的傳回值究竟有哪些呢?
1 typeof undefined; // undefined 2 typeof 18; //number 3 typeof "juke"; //string 4 typeof null; //object 5 typeof {}; //object 6 typeof []; //object 7 typeof function(){}; //function 8 9 // 其實還有一種在ES6中定義的基本類型Symbol,這裡不多介紹10 typeof Symbol(); //symboltypeof
可以看到,我們使用typeof對於參考型別來說,只能夠分辨出function,但是對數組、對象來說,typeof十分不出來的。
那麼instanceof就能夠派上用場了,它可以判斷一個函數是不是一個變數的建構函式。
1 var arr = [];2 arr instanceof Array; //true
現在看來是能夠檢測是不是數組了,但是在一些特別的環境下,我們要使用ES5中的新特性去檢測數組。
1 var arr = [];2 Array.isArray(arr); //true
但是這個屬性在瀏覽器中有比較大的限制,只有IE9+、Chrome、Firefox4+、Safari5+、opera10.5+的瀏覽器才會支援,那麼還有沒有更穩妥的方式去檢測數組呢,當然有,數組也是對象,我們可以通過,object的toString方法來判斷。
1 var arr = [];2 function isArray(arr) {3 return Object.prototype.toString.call(arr) == ‘[object Array]‘;4 }5 6 isArray(arr); // trueView Code
同理我們可以對原生函數以及正則來進行檢測。
三、變數的強制類型轉換
在js中我們常常會遇到的強制類型轉換有下面幾種:
- 邏輯運算子
- 在if語句中的類型轉換
- 當使用==的時候進行轉換
- 在進行字串拼接的時候
- 以及使用parseInt()、Number()等方法的時候
從變數看javaScript