js的強轉是咱們很容易遇到坑的一個地方 好比 == 會產生頗有意思的事情(使用===仍是最佳實踐的) 或者+new Date()一個當前的數字時間戳 這裏面都涉及到強轉 下面分享下學習強轉的過程數組
簡單理解強轉 強轉是指強制將一種類型的對象或者實體轉換成另外一種的行爲(也就是這種轉換的行爲不是你主動控制的 區別類型的顯示轉換) 在發生強轉的時候,js老是將一個複雜的對象轉化爲一個基礎的類型值學習
var num = 1111; var b = "" + num; typeof b; //string var c = "10"; var d = +c; typeof d; //number
js在實現強轉的時候,會經過調用toString()或者valueOf()返回對象的默認值,這裏面涉及到一個抽象操做ToPrimitive 下面是強轉的流程this
抽象操做ToPrimitive(input,PreferredType) --> 調用對象內部的[[DefaultValue]] ,[[DefaultValue]]接收PreferredType --> 調用對象的ValueOf()或者toString()方法spa
因此當咱們在建立自定義對象的,但願在轉換基本值的時候,對象能按照咱們的要求去進行一些操做,就須要在對象的原型上實現toString()和valueOf()方法 而且確保他們能按照咱們的意圖進行調用prototype
var person = function(name,age) { this.name = name; this.age = age; }; person.prototype.toString = function() { return 'hi' + this.name; }; person.prototype.valueOf = function() { return this.age; }; var test = new person("haha",18); console.log(+test); //18 console.log(test + ''); //18 在轉換成字符串的時候和數字的時候 都調用了咱們設置的valueOf方法 並不合理 問題出如今了toPrimitive中
下面是ES6中關於toPrimitive的描述3d
簡單的理解就是它會根據hint也就是PreferredType調用[[DefaultValue]]方法,而後調用toString()或者valueOf()方法 爲何date對象上能實現可控的toString()和valueOf方法調用呢 code
在規範中對Date對象和Symbol對象進行了處理 因此他能按照咱們的須要去調用toString()或者valueOf()方法 可是在自定義對象上呢 咱們是沒法傳入hint值的,在沒有hint值的狀況下會默認hint值爲「number」,就會致使上面的例子的出現 若是要達到咱們的要求就須要一些小的技巧對象
插播 valueOf方法 在Object上的方法,返回對象的原始值,在js中許多的內置對象都從新定義了該方法 例如在數組對象上調用valueOf方法會返回數組的實例對象blog
var test = new person("haha",18); console.log(+test); //18 console.log([test] + ''); //hihaha
經過改寫上面的例子 將test用數組進行包裹 在toPrimitive方法的時候 會返回數組對象 toPrimitive會繼續調用返回基礎值,致使對數組每個元素的toString()方法的調用 因此達到了咱們的要求字符串