面試官:你是如何用js實現獲取指定長度的隨機字串的?
技術標籤:前端字串javascript程式語言
文章目錄
題目描述
題目描述:實現一個function randomString(length){}
,只包括26個小寫字母+10個數字。
如果你對Math稍有了解,你可能會這麼寫這個功能。
// Math.floor作用為向下取整
// Math.random()作用為取得一個0~1之間的偽隨機數 例如:0.6367555509307221
function randomString (length){
let res = '';
let chars = 'abcdefghijklmnopqrstuvwxyz0123456789';
for(let i=0; i<= length - 1; i++){
res += chars.charAt(Math.floor(Math.random() * 36));
}
return res;
}
但實際上,面試官可能更希望你說出其他更多的答案,因為Math很多人都可能會想到。
如果對toString這個函式有更為深入的認識的話,就會明白麵試官希望的答案是什麼。
面試官希望你對原型鏈上的object.prototype上的物件預設方法有全面深入的理解,而實際上,很多人都做不到,就比如這個toString方法,很多人都不知道它可以接受一個引數。
接下來我將會用toString方法實現上述題目的功能。
Number.prototype.toString()
- 除了
null
和undefined
之外,其他的型別(數值、布林、字串、物件)都有toString()
方法,它返回相應值的字串表現(並不修改原變數)。 - 每個object都有一個
toString()
方法。 - 當該物件被表示為一個文字值時,或者一個物件以預期的字串方式引用時自動呼叫。
- 預設情況下,
toString()
方法被每個Object
物件繼承。如果此方法在自定義物件中未被覆蓋,toString()
返回 “[object type]
”,其中type
是物件的型別。
語法
number.toString(radix
引數值
引數 | 描述 |
---|---|
radix | 可選。規定表示數字的基數,是 2 ~ 36 之間的整數。若省略該引數,則使用基數 10。但是要注意,如果該引數是 10 以外的其他值,則 ECMAScript 標準允許實現返回任意值。2 - 數字以二進位制值顯示8 - 數字以八進位制值顯示16 - 數字以十六進位制值顯示 |
返回值
型別 | 描述 |
---|---|
String | 把數字轉換為字串 |
舉例
String.prototype.substring()
定義和用法
substring() 方法用於提取字串中介於兩個指定下標之間的字元。
語法
stringObject.substring(start,stop)
引數 | 描述 |
---|---|
start | 必需。一個非負的整數,規定要提取的子串的第一個字元在 stringObject 中的位置。 |
stop | 可選。一個非負的整數,比要提取的子串的最後一個字元在 stringObject 中的位置多 1。如果省略該引數,那麼返回的子串會一直到字串的結尾。 |
返回值
一個新的字串,該字串值包含 stringObject 的一個子字串,其內容是從 start 處到 stop-1 處的所有字元,其長度為 stop減 start。
說明
substring() 方法返回的子串包括 start 處的字元,但不包括 stop 處的字元。
如果引數 start 與 stop 相等,那麼該方法返回的就是一個空串(即長度為 0 的字串)。如果 start 比 stop 大,那麼該方法在提取子串之前會先交換這兩個引數。
最終程式碼
Number.prototype.toString方法,toString接收一個引數radix,代表數字的基數,也就是我們所說的2進位制、10進位制、16進位制等等。
radix的取值範圍也很容易得出來,最小進位制就是我們得二進位制,所以redix>=2。0-9(10個數字)+a-z(26個英文字母)總共36個,所以redix<=36。總結一下2<=radix<=36,預設是10。
// 獲取指定長度的隨機字串
function randomString(length){
let str='';
while(length>0){
const fragment= Math.random().toString(36).substring(2);
if(length>fragment.length){
str+=fragment;
length-=fragment.length;
}else{
str+=fragment.substring(0,length);
length=0;
}
}
return str;
}
很明顯,第二個方法的時間複雜度比第一個低。