题目简述
在函数中生成一个指定长度的随机字符串,字符串只能包含大写字母、小写字母、数字;
需求分析和实现
这里为大家展示两种写法
方法一
/**
*
* @param {Number} leng 指定字符串的长度
* @returns{String} 返回生成的字符串
*/
// 按照题意生成一个函数接收方法
function sjs(leng) {
// 大写字母、小写字母、数字能出现的情况
var char = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789'
// 定义一个字符串接收随机生成的字符串
var chars = ''
// 遍历
for (var i = 0; i < leng; i++) {
// chars 的值为char中下标为随机数的值
// 这个随机数取值是Math.random() 0-1不到1
// Math.random()*char.length 0-1之间的数*char的长度,生成一个0-char.length之间的数,取整不包含最后一个,但是length长度为最大下标+1,所以不用加一
//最后用+来拼接
chars += char.charAt(parseInt(Math.random() * (char.length)))
}
//返回得到的字符串
return chars
}
本种解法是先把题目中规定字符串只能包含大写字母、小写字母、数字一一列出用char接收,然后用Math方法将他们随机出来,每一轮随机一个,因为Math.random()随机的是 0-1不到1的随机数,当他乘上char.length的时候,则可以生成一个0-char.length,不包含char.length的数,按照char.length和下标的关系,刚好可以完全遍历;最后拼接
我们可以试验一下:
cosole.log(sjs(5))
console.log(sjs(10))
此时输出
分别输出了长度为5和10的字符串,且字符串只能包含大写字母、小写字母、数字
方法二
/**
*
* @param {Number} len 指定字符串的长度
* @returns {String} 返回生成的字符串
*/
function sjs(len) {
// 定义一个数组存入所有的字符
var temp = [];
// 存入26个大写字母
// A-Z的万国码 65-90
// 因为要遍历所以i要么小于等于90,要么小于91才能遍历
// push() api在尾部添加一个值
// String.fromCharCode()将万国码转成字符
for (var i = 65; i < 90 + 1; i++) {
temp.push(String.fromCharCode(i))
}
// 这里用来检验是否将A-Z写进去
// console.log(temp)
// 存入26个小写字母
// a-z的万国码 97-122
// 因为要遍历所以i要么小于等于122,要么小于123才能遍历
for (var i = 97; i < 122 + 1; i++) {
temp.push(String.fromCharCode(i))
}
// 这里用来检验是否有A-Z以及a-z
// console.log(temp)
// 存入0-9数字
// 0-9的万国码 48-57
// 因为要遍历所以i要么小于等于57,要么小于58才能遍历
for (var i = 48; i < 58; i++) {
temp.push(String.fromCharCode(i))
}
//这里用来检验是否有所有大写字母、小写字母、数字
// console.log(temp)
// 生成一个空的字符串来接收生成的字符串
var str = "";
// 遍历
for (var j = 1; j <= len; j++) {
// Math.random() [0-1)这里的原理同上,就不在复述
var random = parseInt(Math.random() * temp.length);
// 检验是否在范围内
// console.log(random);
// 将随机取得下标拼接上去
str = str + temp[random];
}
return str;
}
我们可以试验一下:
cosole.log(sjs(5))
console.log(sjs(10))
此时输出
本种方法和方法一最大的区别在于方法一直接将他们列出来,而方法二将他们转换成万国码,最后在转换回来,基本方法差不多,每行都有具体的解释,因此这里不再过多描述,有什么不懂得欢迎留言,有更好的更多的解法欢迎评论区探讨!