在說toString()的幾種用法前,咱們先來講一下string() 和 toString()有什麼區別:面試
1.String() 和 toString() 均可以轉換爲字符串類型,可是toString()不能夠轉換null 和 undefined,由於null 和 undefined 沒有本身的包裝對象,不能訪問對象的toString() 方法,包裝對象的屬性引用結束,這個新建立的臨時對象就會被銷燬了數組
由此而生的一道面試題:bash
var s = 'test';
s.len = 4;
var t = s.len;
//試問 t輸出什麼
複製代碼
字符串不是對象,那麼它怎麼可以引用對象的方法呢?dom
是由於字符串有對應的包裝類型,能夠把字符串轉換成對象,這個對象能夠用來處理屬性的引用,一旦引用結束,就會銷燬這個新建立的對象。 當再次運行var t = s.len的時候,又要從新經過包裝對象建立一個新對象,可是新對象是沒有給len賦值的,因此上面的這道題輸出是 undefined。函數
若是是給引用類型添加一個屬性呢?ui
var a = []
a.len = 4
console.log(a.len) // 仍是4
複製代碼
由於引用類型在離開當前做用域以前,是存在內存中的,而包裝類型的對象,只存在代碼執行期間,執行完當即被銷燬。因此,咱們不能在運行時爲基本類型的數據添加屬性和方法。this
由toString() 引起的血案: 在項目中,對服務端返回的數據充分信任,而且調用toString()方法,致使頁面報錯,嗚嗚嗚~ 小夥伴們寫代碼仍是要細心一點吶es5
toString()的用法:spa
var a = 10;
a.toString(2) // "1010"
a.toString(8) // "12"
a.toString(16) // "a"
複製代碼
利用toString()的進制轉換,可生成隨機驗證碼prototype
Math.random().toString(36).substring(3,7) //生成四位數的隨機驗證碼
複製代碼
Object.prototype.toString.call(Array) // "[object Function]"
Object.proptotype.toString.call([]) // "[object Array]"
複製代碼
由於若是想要獲取一個對象的真實的內置類型,咱們須要經過獲取對象[[Class]]的屬性值,在es5以前,該屬性值只能通由Object.prototype.toString來訪問,所以,經過Object.prototype.toString.call(arr)改變tostring方法的this指向,從而得到對象的內置類型。
[[Class]]這個內部屬性是引擎內部用來判斷一個對象是屬於哪一種類型的值。
全部typeof返回值爲「object」的對象(如數組)都包含一個內部屬性[[class]]
複製代碼
對於普通函數使用toString()的方法,會獲得這個函數的內容,對於內置函數使用toString的時候,會返回 '[native code]' 字符串。
function test(){
alert(1);//test
}
test.toString();
/*"function test(){ alert(1);//test }"*/
Function.toString();//"function Function() { [native code] }"
複製代碼
那就順便說一下 typeof 和 instanceof 吧
typeof 判斷數據類型只能準確判斷出基本數據類型,對於引用數據類型 就不許確了
typeof 的兩種形式:
typeof(表達式)
typeof 變量名
//返回值:string, number, boolean, undefined, object( null 也返回object), function, symbol
複製代碼
例如:
typeof NaN // number
typeof Symbol(1) // "symbol"
複製代碼
[對象] instanceof [構造函數]
原理: 實例A在不在B的構造函數中
左側的A必須是對象,若是是基礎類型數據會直接返回false
對於複雜類型的數據:
let reg = new RegExp(//)
reg instanceof RegExp // true
reg instanceof Object // true
let date = new Date()
date instanceof Date // true
date instanceof Object // true
複製代碼
因此 使用 Object.prototype.toString.call(xxx) 返回數據的類型是最靠譜的,它的返回值表明該對象的[object 數據類型]字符串表示。
等什麼呢 靠譜的 Object.prototype.toString.call(xxx) 快用起來吧。