說說javascript變量類型和變量類型檢測

javascript是一種弱類型語言,它的典型例子就是即變量在使用的時候能夠給它賦值任何類型。那麼先來看下javascript都有那些變量類型已經它們的使用方法吧。javascript

先來看看javascript都有那些類型吧:html

string    ---  字符串
number   ---  數值
boolean   ---  布爾值
undefined  ---  未申明的變量 或 申明並未賦值
null     ---  空
object     ---  對象
function    ---  函數java

這裏比較有爭議的是 function 類型到底要不要歸屬到變量類型裏邊。具體請看
JavaScript中「基本類型」之爭 數據庫

這裏可將這些數據類型分爲2種:一、原始類型(string、number、boolean、null、undefined)  二、對象(除去原始類型都是對象)函數

 

接下來咱們來看一下 javascript 建立變量的2種方式:一、對象建立  二、字面量建立spa

//第一種 對象類型建立
var str =new String('tudou');
var num =new Number(123);
var bool =new Boolean(true);
console.log(typeof str,typeof num, bool);     //object object Boolean
 
//第二種 字面量方式
str ='tudou';
num = 123;
bool =true;
console.log(typeof str,typeof num, bool);           //string number true

看打紅框的地方,它們都是對象而且繼承之各自的數據類型。第一種 經過 new 對應的類來創造數據,這樣會獲得一個對應數據類型的對象。咱們在第一個 console.log() 前面打上斷點看下:
ps:能夠直接經過 new Object() 傳遞不一樣的數據類型來建立變,javascript 會自動經過你傳入的值來斷定須要建立什麼數據類型。prototype

第二種 經過字面量(用來描述代碼中固定值的表示法)的方式來創造數據。這樣獲得的是一個數據的直接量:
能夠看到數據就是純粹的數據,沒有其餘任何東西。也就是上面的 str它本身沒法調用任何函數,由於它是一個「數據"而不是對象,意味着操做字符串可能的方式是這樣的:code

var str ='abc';
strstr(str,'a');

咱們常常在 javascript 這樣寫:這樣子操做有點繁瑣和麻煩了,不夠方便。因此 javascript 引入了包裝類型。
htm

var str ='abc';
str.indexOf('a')

    

var str1 =new String('abc');
var str2 = str.indexOf('a');
str1 =null;
return str2;

通過這樣的一些列的處理能讓咱們用字面量的建立的變量也能調用對象的方法,極大增長操做的方便性。那麼它是如何作到的捏? 當咱們執行 str.indexOf() 方法的時候 javascript 作了以下的轉換
一、建立一個 String 類型的對象實例
二、在對象上實例調用 indexOf() 方法
三、銷燬這個對象實例
代碼可能像這樣:
對象

 

前面介紹了 javascript 變量的一些基本類型、建立變量的2種方式和包裝類型如今來看一下在 javascript 中咱們如何肯定一個變量是什麼類型的。

先來看下下面的代碼:

var str ="a";
var num = 1;
var bool =true;
var arr = [];
var obj = {};
var undef;
var nul =null;
log(typeof str,typeof num,typeof bool,typeof obj,typeof arr,typeof nudef,typeof nul);
 
arr =new Array(1,2,3);
obj =new Object();
str =new String('a');
num =new Number(1);
bool =new Boolean(true);
log("<br>");
log(typeof str,typeof num,typeof bool,typeof obj,typeof arr,typeof nudef,typeof nul);
 
 
 
function log(){
    for(var i=0; i<arguments.length; i++){
        document.write(arguments[i]+"\t");
    }
}

它的輸出數據爲:
string number boolean object object undefined object 
object object object object object undefined object
經過 typeof 運算符檢測一個變量,只要這個變量是引用類型就會返回 object 因此在使用new 關鍵字建立基本數據庫類型的時候 typeof 返回的全是 object,這樣的話就不能使用typeof 來檢測數據類型了,那麼還有沒有別的辦法。

javascript 還提供了一種檢測對象實例的方法 instanceof 也許、大概可能能行,那就來試試吧。

var str ="a";
var num = 1;
var bool =true;
var arr = [];
var obj = {};
var undef;
var nul =null;
log(strinstanceof String, numinstanceof Number, boolinstanceof Boolean, objinstanceof Object);
arr =new Array(1,2,3);
obj =new Object();
str =new String('a');
num =new Number(1);
bool =new Boolean(true);
log("<br>");
log(strinstanceof String, numinstanceof Number, boolinstanceof Boolean, objinstanceof Object);
 
 
function log(){
    for(var i=0; i<arguments.length; i++){
        document.write(arguments[i]+"\t");
    }
}

var str ='a';
var str1 =new String('a');
console.log(Object.prototype.toString.call(str), Object.prototype.toString.call(str1));

 它的輸出爲:它的輸出爲:
false false false true 
true true true true
instanceof 用於識別正在處理的對象的類型。與 typeof 方法不一樣的是,instanceof 方法要求開發者明確地確認對象爲某特定類型。這個只能檢測變量是不是某個對象的實例,也沒法知足咱們的需求。

若是想要實現 javascript 中的類型檢測 須要使用 Object.prototype.toString.call(str);

[object String] [object String]  它們是一致的。那麼咱們就能夠根據這個對對象類型進行斷定。

咱們能夠對他們的進行簡單的處理  把它們作成方法暴露在全局 window 裏面,方便咱們之後的使用

var typeList ='String Number Boolean Array Object Date Function RegExp'.split(' '),
    toString = Object.prototype.toString;
for(var i=0; i<typeList.length; i++){
    (function(index){
        window['is'+typeList[index]] =function(obj){
            var reg =new RegExp(typeList[index])
            return reg.test(toString.call(obj));
        };
    })(i);
     
}
var str ='abc';
var num = 1;
var bool =true;
var obj = {};
var date =new Date();
var arr = [];
var reg = /abc/;
console.log(isString(str), isNumber(num), isBoolean(bool), isObject(obj), isDate(date), isArray(arr), isRegExp(reg));      //true
console.log(isObject(num));    //false

以上是我的的一些總結,不對之處請指出謝謝。

相關文章
相關標籤/搜索