摘要:一直很奇怪為什么可以通過判斷各數(shù)據(jù)的類型,帶著這個疑問,查看了一些資料。與是兩個不同的方法,他們返回的值是不一樣的。需要調(diào)用原型對象上的去判斷類型
一直很奇怪為什么可以通過Object.prototype.toString()判斷各數(shù)據(jù)的類型,帶著這個疑問,查看了一些資料。
1.Object.prototype.toString()判斷原理那么當(dāng)我們調(diào)用這個方法時,具體會做那些操作呢? 1.如果this value是undefined,返回 "[object Undefined]" 2.如果this value是null,返回"[object Null]" 3.讓O作為ToOject(this value)方法的返回值 4.讓isArray作為IsArray(O)方法的返回值 5.如果isArray為true,使builtinTag為"Array" 6.else 如果O包含[[ParameterMap]]internal slot,使builtinTag為"Arguments" 7.else 如果O包含[[Call]]internal method,使builtinTag為"Function" 8.else 如果O包含[[ErrorData]]internal slot,使builtinTag為"Error" 9.else 如果O包含[[BooleanData]]internal slot,使builtinTag為"Boolean" 10.else 如果O包含[[NumberData]]internal slot,使builtinTag為"Number" 11.else 如果O包含[[StringData]]internal slot,使builtinTag為"String" 12.else 如果O包含[[DateValue]]internal slot,使builtinTag為"Date" 13.else 如果O包含[[RegExpMatcher]]internal slot,使builtinTag為"RegExp" 14.else 使builtinTag為"Object" 15.讓tag作為Get(O,@@toStringTag)的返回值 16.如果Type(tag)不是String,使tag為builtinTag的值 17.返回由"[object ",tag,"]"這三個字符串拼接的字符串 具體的解釋可見[ECMAScript官方文檔][1]2.Object.prototype.toString()與Object.toString()的區(qū)別
Object.toString()是Object構(gòu)造函數(shù)上的方法,返回的是對應(yīng)的函數(shù)
Object.prototype.toString()是Object原型對象上的方法,返回的是代表該對象的字符串
var obj = {}; Object.toString(obj);//"function Object() { [native code] }" Object.prototype.toString.call(obj);//"[object Object]"3.為什么Array、String、Number、Boolean等不能直接調(diào)用toString()?
因為Array、String、Number、Boolean、RegExp、Date等類型都重寫了toString(),如果直接調(diào)用則因為自身的原型對象上已有toString()方法,就不會調(diào)用到Object原型對象上的toString()方法了。
Array類型
//toString()返回數(shù)組中的 數(shù)值的字符串表達 var arr = ["cherry","rose"]; arr.toString();//"cherry,rose"
String類型
//toString()返回字符串的字面量表示 var str = "my name is cherry" str.toString();//"my name is cherry"
Number類型
//toString()返回 對應(yīng)數(shù)值的字符串表達 var num = 18; num.toString();//"18"
Boolean類型
//toString()返回布爾值的字符串表達 var bool = true; bool.toString();//"true";
RegExp類型
var patten = new RegExp("abcd","gi"); patten.toString();//"/abc/d/gi"
Date類型
//toString() 返回當(dāng)前時間的標(biāo)準(zhǔn)時間字符串表達 var date = new Date(2019/07/07); date.toString();//"Thu Jan 01 1970 08:00:00 GMT+0800 (中國標(biāo)準(zhǔn)時間)結(jié)語
1. 首先需要了解Object.prototype.toString()的原理和各值返回的字符串。 2. Object.prototype.toString()與Object.toString()是兩個不同的方法,他們返回的值是不一樣的。前者返回的是該對象類型的字符串,后者返回的是一個函數(shù)代碼 3.為什么數(shù)組、布爾等不直接調(diào)用toString(),因為它們自己的原型對象上重寫了toString()代表各自不同的邏輯。需要調(diào)用Ojbect原型對象上的toString()去判斷類型
文章版權(quán)歸作者所有,未經(jīng)允許請勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請注明本文地址:http://systransis.cn/yun/105411.html
摘要:語法參數(shù)要檢測的對象某個構(gòu)造函數(shù)通過這個運算符我們就可以用來檢測真正的數(shù)據(jù)類型但是如果是的話,好像就沒辦法解決了呢。 1.typeof操作符返回一個字符串,指示未經(jīng)計算的操作數(shù)的類型。 語法:type opreand 參數(shù): opreand是一個表達式,表示對象或者原始值,其類型將被返回。 描述: 類型 結(jié)果 Undefi...
摘要:引言本期開始介紹中的高階函數(shù),在中,函數(shù)是一種特殊類型的對象,它們是。簡單來說,高階函數(shù)是一個接收函數(shù)作為參數(shù)傳遞或者將函數(shù)作為返回值輸出的函數(shù)。我們來看看使用它們與不使用高階函數(shù)的方案對比。引言 本期開始介紹 JavaScript 中的高階函數(shù),在 JavaScript 中,函數(shù)是一種特殊類型的對象,它們是 Function objects。那什么是高階函數(shù)呢?本節(jié)將通過高階函數(shù)的定義來展...
摘要:返回最適合該對象類型的原始值將該對象的原始值以字符串形式返回。這兩個方法一般是交由去隱式調(diào)用,以滿足不同的運算情況。進行強轉(zhuǎn)字符串類型時將優(yōu)先調(diào)用方法,強轉(zhuǎn)為數(shù)字時優(yōu)先調(diào)用。在有運算操作符的情況下,的優(yōu)先級高于。 valueOf():返回最適合該對象類型的原始值;toString(): 將該對象的原始值以字符串形式返回。 這兩個方法一般是交由JS去隱式調(diào)用,以滿足不同的運算情況。在數(shù)值...
摘要:深度克隆方法,返回一個新的克隆對象這里得說明深拷貝與錢拷貝的區(qū)別,淺拷貝是復(fù)制一個對象的引用,深拷貝是一個新的對象,與原對象有著不同的內(nèi)存地址方法一通過遞歸遍歷一個對象,返回一個新的對象深拷貝要深拷貝的值判斷某個對象是否含有指定的屬性該方法 深度克隆方法,返回一個新的克隆對象這里得說明深拷貝與錢拷貝的區(qū)別,淺拷貝是復(fù)制一個對象的引用,深拷貝是chone一個新的對象,與原對象有著不同的內(nèi)...
摘要:引言上一節(jié)介紹了高階函數(shù)的定義,并結(jié)合實例說明了使用高階函數(shù)和不使用高階函數(shù)的情況。我們期望函數(shù)輸出,但是實際上調(diào)用柯里化函數(shù)時,所以調(diào)用時就已經(jīng)執(zhí)行并輸出了,而不是理想中的返回閉包函數(shù),所以后續(xù)調(diào)用將會報錯。引言 上一節(jié)介紹了高階函數(shù)的定義,并結(jié)合實例說明了使用高階函數(shù)和不使用高階函數(shù)的情況。后面幾部分將結(jié)合實際應(yīng)用場景介紹高階函數(shù)的應(yīng)用,本節(jié)先來聊聊函數(shù)柯里化,通過介紹其定義、比較常見的...
閱讀 2335·2021-10-08 10:04
閱讀 1112·2021-09-03 10:40
閱讀 1160·2019-08-30 15:53
閱讀 3317·2019-08-30 13:13
閱讀 2934·2019-08-30 12:55
閱讀 2288·2019-08-29 13:21
閱讀 1364·2019-08-26 12:12
閱讀 2764·2019-08-26 10:37