1. 程式人生 > 其它 >面試官:你是如何用js實現獲取指定長度的隨機字串的?

面試官:你是如何用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()



  • 除了nullundefined之外,其他的型別(數值、布林、字串、物件)都有toString()方法,它返回相應值的字串表現(並不修改原變數)。
  • 每個object都有一個toString()方法。
  • 當該物件被表示為一個文字值時,或者一個物件以預期的字串方式引用時自動呼叫。
  • 預設情況下,toString()方法被每個Object物件繼承。如果此方法在自定義物件中未被覆蓋,toString()返回 “[object type]”,其中type是物件的型別。

語法

number.toString(radix

)

引數值

引數描述
radix可選。規定表示數字的基數,是 2 ~ 36 之間的整數。若省略該引數,則使用基數 10。但是要注意,如果該引數是 10 以外的其他值,則 ECMAScript 標準允許實現返回任意值。2 - 數字以二進位制值顯示8 - 數字以八進位制值顯示16 - 數字以十六進位制值顯示

返回值

型別描述
String把數字轉換為字串

舉例

image-20201211125937454


String.prototype.substring()

定義和用法

substring() 方法用於提取字串中介於兩個指定下標之間的字元。

語法

stringObject.substring(start,stop)
引數描述
start必需。一個非負的整數,規定要提取的子串的第一個字元在 stringObject 中的位置。
stop可選。一個非負的整數,比要提取的子串的最後一個字元在 stringObject 中的位置多 1。如果省略該引數,那麼返回的子串會一直到字串的結尾。

返回值

一個新的字串,該字串值包含 stringObject 的一個子字串,其內容是從 start 處到 stop-1 處的所有字元,其長度為 stopstart

說明

substring() 方法返回的子串包括 start 處的字元,但不包括 stop 處的字元。

如果引數 startstop 相等,那麼該方法返回的就是一個空串(即長度為 0 的字串)。如果 startstop 大,那麼該方法在提取子串之前會先交換這兩個引數。

最終程式碼

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;
}

很明顯,第二個方法的時間複雜度比第一個低。