判斷js中各種資料的型別方法之typeof與0bject.prototype.toString講解_基礎知識
1、typeof(param) 回傳param的型別(string)
這種方法是JS中的定義的全域方法,也是編譯者最常用的方法,優點就是使用簡單、好記,缺點是不能很好的判斷object、null、array、regexp和自訂對象。
範例程式碼:
var str='str' ;
var arr=['1','2'];
var num=1;
var bool=true;
var obj={name:'test'};
var nullObj=null;
var undefinedObj=undefined;
var reg=/reg/;
function fn(){
alert('this is a function');
}
function User(name){
this.name=name;
}
var user=new User('user');
console.log(typeof(str));
console.log(typeof(arr));
console.log(typeof(num));
console.log(typeof(bool) );
console.log(typeof(obj));
console.log(typeof(nullObj));
console.log(typeof(undefinedObj));
console.log(typeof(undefinedObj));
console.log(typeof( reg));
console.log(typeof(fn));
console.log(typeof(user));
結果為:
程式碼如下:
string
object
number
boolean
object
number
numberbooleanundefinedobjectfunctionobject
2、Object.prototype.toString().callmString(m). (string,格式是[object class])
複製程式碼
程式碼如下:
function Class1()
this.name = "class1";
this.showNam = function()
{
}
}
function Class2()
this.name = "class2";
}
var c1 = new Class1(); var c2 = new Class2();
c1.showNam.call(c2);
運行結果,輸出的為class2,而不是class1,這就相當於方法繼承。
複製程式碼
程式碼如下:
function class(){
this.name = "class";
this.showName = function(this.showName. ){
alert(this.name);
那麼就會分別輸出class和prototype test class,本來建構函數class() 裡是沒有定義showNameContact函數的,而透過prototype我們就可以給物件原型動態加入函數,new的範例中自然就會有了。所以Object.prototype.toString()的意思就是執行Object這個祖先中的toString方法。
那麼toString()是幹嘛的呢?許多js手冊中對toString()函數是這樣定義的:
toString() 方法可把一個邏輯值轉換為字串,並傳回結果,語法為:booleanObject.toString()。剛才我說了,js中的物件都是繼承的Object,這些物件都自訂的有函數或是重構了Object的部分函數,而且它們都對toString()函數進行了重寫。所以我們不能想1中直接寫param.prototype.toString()這樣就執行的是param自己重寫後的toString()函數了。
好了,到關鍵的時刻了,toString()到底是幹嘛的呢,有什麼作用呢?
在ES3中,Object.prototype.toString方法的規格如下:
Object.prototype.toString()
在toString方法被呼叫時,會執行下面的操作步驟:
1. 取得this物件的[[Class]]屬性的值.
2. 計算出三個字串"[object ", 第一步的操作結果Result(1), 以及 "]"連接後的新字串.
3. 回傳第二步驟的操作結果Result(2).
在ES3中,規範文件並沒有總結出[[class]]內部屬性一共有幾種,不過我們可以自己統計一下,原生對象的[[class]]內部屬性的值一共有10種.分別是:"Array", "Boolean", "Date", "Error", "Function", "Math", "Number", "Object","RegExp", "String".所以Object.prototype.toString()的輸出結果就是這種格式的字串[object Array],[object Boolean]。
在ES5.1中,除了規範寫的更詳細一些以外,Object.prototype.toString方法和[[class]]內部屬性的定義上也有一些變化,Object.prototype.toString方法的規範如下:
Object.prototype.toString ( )
在toString方法被呼叫時,會執行下面的操作步驟:
1 如果this的值為undefined,則回傳"[object Undefined]".
2 如果this的值為null,則回傳"[object Null]".
3 讓O成為呼叫ToObject(this)的結果.
4 讓class成為O的內部屬性[[Class]]的值.
5 傳回三個字串"[object ", class, 以及"]"連接後的新字串.
可以看出,比ES3多了1,2,3步.第1,2步屬於新規則,比較特殊,因為"Undefined"和"Null"並不屬於[[class]]屬性的值。經統計,可傳回的型別有"Arguments", "Array", "Boolean", "Date", "Error", "Function", "JSON", "Math", "Number", "Object", "RegExp ", "String"比ES3多了2種分別是arguments物件的[[class]]成了"Arguments",而不是以前的"Object",還有就是多個了全域物件JSON,它的[[class ]]值為"JSON"。
最後的最後提醒大家,Object.prototype.toString().call(param)回傳的[object class]中class首字母是大寫,像JSON這種甚至都是大寫,所以,大家判斷的時候可以都轉換成小寫,以防出錯,Object.prototype.toString().call(param).toLowerCase()即可。

熱AI工具

Undresser.AI Undress
人工智慧驅動的應用程序,用於創建逼真的裸體照片

AI Clothes Remover
用於從照片中去除衣服的線上人工智慧工具。

Undress AI Tool
免費脫衣圖片

Clothoff.io
AI脫衣器

AI Hentai Generator
免費產生 AI 無盡。

熱門文章

熱工具

記事本++7.3.1
好用且免費的程式碼編輯器

SublimeText3漢化版
中文版,非常好用

禪工作室 13.0.1
強大的PHP整合開發環境

Dreamweaver CS6
視覺化網頁開發工具

SublimeText3 Mac版
神級程式碼編輯軟體(SublimeText3)

熱門話題

Object轉byte與byte轉Object今天實作如何從Object去轉為byte和如何從byte轉為Object。首先,定義一個類別student:packagecom.byteToObject;importjava.io.Serializable;publicclassstudentimplementsSerializable{privateintsid;privateStringname;publicintgetSid(){returnsid;}publicvoidsetSid(in

1.Object類別介紹Object是Java預設提供的一個類別。 Java裡面除了Object類,所有的類別都是存在繼承關係的。預設會繼承Object父類別。即所有類別的物件都可以使用Object的參考來接收。範例:使用Object接收所有類別的物件classPerson{}classStudent{}publicclassTest{publicstaticvoidmain(String[]args){function(newPerson());function(newStudent());}public

Java使用Object類別的getClass()函數取得物件的執行時間類別在Java中,每個物件都有一個類,這個類別定義了物件的屬性和方法。我們可以使用getClass()函數來取得物件的運行時類別。 getClass()函數是Object類別的成員函數,所以所有的Java物件都可以呼叫該函數。本文將介紹getClass()函數的使用方法以及給一些程式碼範例。使用get

基本資料型別與Object的關係我知道大家是不是都聽說過Object是所有類型的基類,但是這句話其實並不是正確的,因為java中基本資料型別跟Object是沒有任何關係的.這裡舉一個例子這裡在進行呼叫swap方法時,是不能直接將int型別傳給swap(Objectobj)方法的,因為Object其實跟基本資料型別沒有一點關係,這時候a就發現我們型別不匹配,所以就自動包裝成了Integer型別了,這個時候就能跟Object產生聯繫了,才能成功呼叫swap方法了.Object、基本資料型別的包裝類

PHPNotice:Tryingtogetpropertyofnon-object解決方法當你在使用PHP進行開發時,你可能會遇到這樣的錯誤提示:「Notice:Tryingtogetpropertyofnon-object。」這個錯誤提示通常是由於你使用了一個未初始化的對象,或是你的物件在某一段程式碼中遺失了引用,因此無法正確存取屬

Redis的兩層資料結構簡介redis的效能高的原因之一是它每種資料結構都是經過專門設計的,並且都有一種或多種資料結構來支持,依賴這些靈活的資料結構,來提升讀取和寫入的效能。如果要了解redis的資料結構,可以從兩個不同的層面來討論它:第一個層面,是從使用者的角度,這一層面也是Redis暴露給外部的調用接口,例如:string,list,hash ,set,sortedset。第二個層面,是從內部實現的角度,屬於更底層的實現,例如:dict,sds,ziplist,quicklist,skiplis

PHPNotice:Tryingtogetpropertyofnon-object的解決方法在使用PHP編寫程式碼的過程中,我們可能會遇到「Tryingtogetpropertyofnon-object」的錯誤提示。這個錯誤提示通常是由於我們在嘗試存取一個不存在的物件屬性,導致程式碼出現了錯誤。這個錯誤提示通常會出現在以下情況:物件不存

Object是java所有類別的基類,是整個類別繼承結構的頂端,也是最抽象的一個類別。大家天天都在使用toString()、equals()、hashCode()、waite()、notify()、getClass()等方法,或許都沒有意識到是Object的方法,也沒有去看Object還有哪些方法以及思考為什麼這些方法要放到Object中。一、JavaObject類別簡介-所有類別的超類別Object是Java類別庫中的一個特殊類,也是所有類別的父類別。也就是說,Java允許把任何類型的物件賦給Object類型的
