下次面试官问你怎么拿随机字符串,你就这么答

题目描述

题目描述:实现一个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;
}

很明显,第二个方法的时间复杂度比第一个低。


原文始发于微信公众号(豆子前端):下次面试官问你怎么拿随机字符串,你就这么答

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。

文章由极客之音整理,本文链接:https://www.bmabk.com/index.php/post/56791.html

(0)
小半的头像小半

相关推荐

发表回复

登录后才能评论
极客之音——专业性很强的中文编程技术网站,欢迎收藏到浏览器,订阅我们!