1. 程式人生 > >仿String()構造器函數 【總結】

仿String()構造器函數 【總結】

join() 簡單判斷 技術 數字 字符串分割 相加 ova 應該 結果

需求

實現以下方法:

技術分享圖片

控制臺結果:

技術分享圖片

需求分析:

首先確定new調用的this和什麽對象綁定,如果跟默認返回的對象綁定肯定做不到 [ ] 這樣的訪問,所以要在構造器內部返回一個包裝過的數組

1.length,既然前提是沒有String()構造器函數,那就不能用字符串對象的length方法,所以首先要將接收的字符串包裝成數組。雖說不能用字符串對象的方法,但這裏還是用到了 ES5的 [ ] 中括號訪問法,為了將字符串中的每一個字符做成數組中的每一項,這樣length就可以直接使用數組本身有的。

2. [ ] 中括號訪問法,直接用數組的

3.toString() 方法內部實現就是調用數組的join();方法

4.valueOf() 方法同上

5.charAt() 方法,規定如果參數是數字或是字符串,只要它是由純數字組成的就應該返回正確的結果,如果包含非數字的字符就返回第一個字符。實現方式就是簡單判斷傳入的參 數,然後像使用數組一樣使用上面包裝過的字符串數組來返回正確的值。

6.concat() 方法,在內部調用toValue()方法,加上傳進來的參數,然後返回出去。

7.slice() 方法,要求返回第一個參數的字符和第二個參數-1的之間的字符;如果是負數就與將參數與字符串長度相加。

8.split() 方法,將傳入的參數作為分隔符,將字符串分割成數組。

實現思路:

第一步要確認this與什麽對象綁定,也就是構造器函數返回什麽對象,這一點很重要,不知道是不是屬於OOP的風格。

難點:

split怎麽做,如果只是匹配單個字符還容易,多字符匹配做起來顯得有點吃力。

難點解決方案:

第一步:檢測字符數組的每一項,如果與期望字符串的第一個匹配就進入第二步

第二步:用循環匹配後面的字符,如果有一個不相等就break出來

第三步:匹配判斷結束後( 不管是break過還是沒break過都要判斷 ),如果匹配結束後的循環索引等於期望字符串的長度,說明中途沒有被中斷過

第四步:記錄下這個沒有被中斷過的位置,然後將它對應的起始位置,也就是 i 保存到一個數組裏,再將這個數組保存到更大的數組裏。

涉及的新知識:

OOP

優化方向:

不知道可不可以用正則去優化。

備註:

OOP風格的js可能需要先想好this與什麽對象綁定,這個對象就像是身體,要先確定是什麽樣的身體才能根據它衍生出不同的功能。

仿String()構造器函數 【總結】