首頁 web前端 js教程 判斷js中各種資料的型別方法之typeof與0bject.prototype.toString講解_基礎知識

判斷js中各種資料的型別方法之typeof與0bject.prototype.toString講解_基礎知識

May 16, 2016 pm 05:17 PM
object typeof

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
booleanobject
numberbooleanundefinedobjectfunctionobject

2、Object.prototype.toString().callmString(m). (string,格式是[object class])


這個方法能支援絕大多數類型的判斷,jquery封裝的型別判斷就用的這個方法。可能有些人看起來有點迷茫,我來給大家分解一下。 1)call(param)函數 a.fun().call(b)的意思在js中是指,讓物件b來代替a,然後執行a的fun函數,寫個例子:



複製程式碼


程式碼如下:


function Class1()

{

    this.name = "class1";

    this.showNam = function()
    {

        alert(this.name);

    }
}

}


function Class2()

{
    this.name = "class2";
}

var c1 = new Class1(); var c2 = new Class2();

c1.showNam.call(c2);



運行結果,輸出的為class2,而不是class1,這就相當於方法繼承。

所以,Object.prototype.toString().call(param)的意思其實就是,param.prototype.toString(),那我們為什麼不直接寫param.prototype.toString(),而是用call()繞一下呢,下面請看2來了解。 2)Object.prototype.toString() Object是個什麼東東呢? ,Script56.chm(就是M$官方教學)上說:Obect提供所有JScript物件通用的功能,其實Object就是所有js物件的祖先,是一個概念,js中的所有物件就是Object的實例,然後不同的對象重寫自己獨立的方法。而prototype,大家就沒必要追究太深了,它就是返回一個原型的引用,然可以可以動態的給原型添加方法和屬性
一個小例子




複製程式碼


程式碼如下:


function class(){
  this.name = "class";
  this.showName = function(this.showName. ){
    alert(this.name);
  }}var obj = new class();obj.showName();class.prototype.showNameContact = function🎜>class.prototype.showNameContact = function🎜>class.prototype.showNameContact = function🎜>class.prototype.showNameContact = function (){  alert("prototype test" this.name);}obj.showNameContact();
那麼就會分別輸出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()即可。

本網站聲明
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn

熱AI工具

Undresser.AI Undress

Undresser.AI Undress

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

AI Clothes Remover

AI Clothes Remover

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

Undress AI Tool

Undress AI Tool

免費脫衣圖片

Clothoff.io

Clothoff.io

AI脫衣器

AI Hentai Generator

AI Hentai Generator

免費產生 AI 無盡。

熱門文章

R.E.P.O.能量晶體解釋及其做什麼(黃色晶體)
3 週前 By 尊渡假赌尊渡假赌尊渡假赌
R.E.P.O.最佳圖形設置
3 週前 By 尊渡假赌尊渡假赌尊渡假赌
R.E.P.O.如果您聽不到任何人,如何修復音頻
3 週前 By 尊渡假赌尊渡假赌尊渡假赌
WWE 2K25:如何解鎖Myrise中的所有內容
4 週前 By 尊渡假赌尊渡假赌尊渡假赌

熱工具

記事本++7.3.1

記事本++7.3.1

好用且免費的程式碼編輯器

SublimeText3漢化版

SublimeText3漢化版

中文版,非常好用

禪工作室 13.0.1

禪工作室 13.0.1

強大的PHP整合開發環境

Dreamweaver CS6

Dreamweaver CS6

視覺化網頁開發工具

SublimeText3 Mac版

SublimeText3 Mac版

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

java Object轉byte與byte轉Object的方法是什麼 java Object轉byte與byte轉Object的方法是什麼 Apr 20, 2023 am 11:37 AM

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

Java Object類別中的方法怎麼用 Java Object類別中的方法怎麼用 Apr 18, 2023 pm 06:13 PM

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

Java使用Object類別的getClass()函數取得物件的執行時間類 Java使用Object類別的getClass()函數取得物件的執行時間類 Jul 24, 2023 am 11:37 AM

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

java中基本資料型別與Object的關係是什麼 java中基本資料型別與Object的關係是什麼 May 01, 2023 pm 04:04 PM

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

PHP Notice: Trying to get property of non-object解決方法 PHP Notice: Trying to get property of non-object解決方法 Jun 24, 2023 pm 09:34 PM

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

redis的Object結構體怎麼定義 redis的Object結構體怎麼定義 May 28, 2023 pm 05:20 PM

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

PHP Notice: Trying to get property of non-object的解決方法 PHP Notice: Trying to get property of non-object的解決方法 Jun 22, 2023 pm 02:43 PM

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

如何使用Java中的Object類別和System類別? 如何使用Java中的Object類別和System類別? Apr 23, 2023 pm 11:28 PM

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

See all articles