js 強轉規範解讀

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()方法的調用 因此達到了咱們的要求字符串

相關文章
相關標籤/搜索