前端面试题之JavaScript(五)


1.写一个函数,返回从min到max之间的 随机整数,包括min不包括max

// 方法1 使用Math.floor()


function getRandomInt1(max, min){

  return Math.floor(Math.random()*(max - min)) + min

}

// 方法2 使用Math.ceil()


function getRandomInt2(max, min){

  return Math.ceil(Math.random()*(max - min)) + (min - 1)

}

2. 写一个函数,生成一个长度为 n 的随机字符串,字符串字符的取值范围包括0到9,a到 z,A到Z。

    function getRandStr(len) {
      var strs = "0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ";
      var newStrs = "";
      for (var i = 0; i < len; i++) {
        var index= Math.floor(Math.random() * strs.length);
        newStrs = newStrs + strs[index];
      }
      return newStrs;
    }
    
    var str = getRandStr(10);
    console.log(str);
    function getRandStr(len) {
      var strs = "0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ";
      var newStrs = "";
      for (var i = 0; i < len; i++) {
        var index= Math.floor(Math.random() * strs.length);
        
       newStrs= newStrs.concat(strs[index]);
      }
      return newStrs;
    }
    
    var str = getRandStr(10); // 0a3iJiRZap
    console.log(str);
function getRandStr(len) {
    var strs = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789';
    var possibleStr = '';
    for (var i = 0; i < len; i++) {
        //charAt()方法从一个字符串中返回指定的字符,接收一个参数index,一个介于0和字符串长度减1之间的整数
        possibleStr += strs.charAt(Math.floor(Math.random() * strs.length));
    } 
        return possibleStr;
}
var str = getRandStr(10);
console.log(str); //如:Irtg95rXBQ

3.写一个函数,生成一个随机 IP 地址,一个合法的 IP 地址为 0.0.0.0~255.255.255.255

 function getRandIP() {
      var strs = "";
      console.log(number);
      // return number+"."+number+"."+number+"."+number;
      for (var i = 0; i < 4; i++) {
        var number = Math.floor(Math.random() * (255 - 0 + 1) + 0);
        strs = strs.concat(number, ".")
      }
      var newStrs = strs.slice(0, strs.length - 2); //移除最后一个 " ."
      return newStrs;
    }
    var ip = getRandIP()
    console.log(ip) // 10.234.121.45
 function getRandIP(ip) {
      var arr = [] // 声明储存IP地址的对象是个数组
      for (var i = 0; i < 4; i++) { // 使用for循环来取4次值
        var x = Math.floor(Math.random() * 256) //使用floor方法,将0-255的随机整数赋值给x
        arr.unshift(x) // 在ip数组中添加刚取到的随机值
      }
      return arr.join('.')//使用join方法将数组以'.'连接并输出
    }

    var ip = getRandIP() // 将函数执行完毕的数组赋值给ip
    console.log(ip) // 

4.写一个函数,生成一个随机颜色字符串,合法的颜色为#000000~ #ffffff

image.png
   function getRandColor(){
      var strs = "0123456789abcdef";
      var newStrs = "";
      for (var i = 0; i < 6; i++) {
        var index= Math.floor(Math.random() * strs.length);
        newStrs = newStrs + strs[index];
      }
      return '#'+newStrs;
    
}
var color = getRandColor()
console.log(color)   // #3e2f1b
function number(min, max) {
    var num = Math.floor(Math.random() * (max - min) + min);
    return num;
}
function getRandColor() {
    var strs = '';
    for (var i = 0; i < 6; i++) {
        strs += number(0, 16).toString(16);
    }
    return '#' + strs;
}
var color = getRandColor();
console.log(color)   // #3e2f1b

5.实现一个flatten函数,将一个嵌套多层的数组 array(数组) (嵌套可以是任何层数)转换为只有一层的数组,数组中元素仅基本类型的元素或数组,不存在循环引用的情况。

递归
function flatten(arr){
  var result=[];
  for(var i in arr){
    Array.isArray(arr[i])?result=result.concat(flatten(arr[i])):result.push(arr[i]);
  }
  return result;
}
var arr = [3, [2, -4, [5, 7]], -3, ['aa', [['bb']]]];
var arr2 = flatten(arr)
console.log(arr2)
function flatten(arr) {
    return arr.reduce(function (pre, next) {
        return pre.concat(Array.isArray(next) ? flatten(next) : next)
    }, [])
}

var arr = [3, [2, -4, [5, 7]], -3, ['aa', [['bb']]]];
var arr2 = flatten(arr)
//ES6做法
function flatten(arr){
  var newArr = []
  function _flat(arr){
    arr.forEach(val=>{
      if(Array.isArray(val)){
        _flat(val)
      }else{
        newArr.push(val)
      }
    })    
  }
  _flat(arr)
  return newArr
}
var arr = [3, [2, -4, [5, 7]], -3, ['aa', [['bb']]]];
var arr2 = flatten(arr);
console.log(arr2);

6.实现一个reduce函数,作用和原生的reduce类似 Ex:var sum = reduce([1, 2, 3], function(memo, num){ return memo + num; }, 0); => 6

function reduce(arr, iteratee, initValue){
  var tmpArr = (initValue === undefined ? [] : [initValue]).concat(arr)
  while(tmpArr.length > 1){
    tmpArr.splice(0, 2, iteratee(tmpArr[0], tmpArr[1]))
  }
  return tmpArr[0]
}

var sum = reduce([3,5], function(v1, v2){
  return v1 * v2
},4)
console.log(sum)

7.写一个函数getChIntv,获取从当前时间到指定日期的间隔时间

function getChIntvl(time){
  return Date.now()-Date.parse(time);
}
var str = getChIntv("2017-02-08 10:30:24");
console.log(str);

8.写一个函数,参数为时间对象毫秒数的字符串格式,返回值为字符串。假设参数为时间对象毫秒数t,根据t的时间分别返回如下字符串:

  • 刚刚( t 距当前时间不到1分钟时间间隔)
  • 3分钟前 (t距当前时间大于等于1分钟,小于1小时)
  • 8小时前 (t 距离当前时间大于等于1小时,小于24小时)
  • 3天前 (t 距离当前时间大于等于24小时,小于30天)
  • 2个月前 (t 距离当前时间大于等于30天小于12个月)
  • 8年前 (t 距离当前时间大于等于12个月)
function getFriendlyDate(timeStr){
  var interval = Date.now() - parseInt(timeStr)
  var ch = interval > 0 ? '前': '后'
  var str
  interval = Math.abs(interval)
  switch (true){
    case interval < 60*1000:
      str = '刚刚'
      break
    case interval < 60*60*1000:
      str = Math.floor(interval/(60*1000)) + '分钟' + ch
      break
    case interval < 24*60*60*1000:
      str = Math.floor(interval/(60*60*1000)) + '小时' + ch
      break
    case interval < 30*24*60*60*1000:
      str = Math.floor(interval/(24*60*60*1000)) + '天' + ch
      break
    case interval < 12*30*24*60*60*1000:
      str = Math.floor(interval/(30*24*60*60*1000)) + '个月' + ch
      break    
    default:  
      str = Math.floor(interval/(12*30*24*60*60*1000)) + '年' + ch
  }
  return str
}
console.log( getFriendlyDate('1505122360640') )  //"7分钟前"
console.log( getFriendlyDate('1503122360640') )  //"23天前"
console.log( getFriendlyDate('1203122360640') )  //"9年前"
console.log( getFriendlyDate('1508122360640') )  //"1个月后"

9.String方法

  • charAt(index):返回字符

  • charCodeAt(index):返回字符编码

  • "string1".concat("string2","string3",...):返回字符串

  • slice(起始位置,终止位置(不包含)):返回字符串,可以负数

  • substring(起始位置,终止位置(不包含)):返回字符串,可以负数

  • substr(起始位置,长度):返回字符串,从起始位置算起的长度

  • indexOf(char,index):(从index开始查找),返回索引的值

  • lastIndexOf(char,index):(从index开始查找),返回索引的值

  • trim():删除前置和后置的所有空格

  • toUpperCase():大写

  • toLowerCase():小写

  • match(/reg/或者RegExp对象):返回一个数组

  • serach(/reg/或者RegExp对象):返回索引

  • replace(字符串或者/reg/或者RegExp对象 , 字符串或者函数function(match,pos,originalText){}):

  • split(separator,limit):separator可选。字符串或正则表达式,从该参数指定的地方分割 string Object。limit可选。该参数可指定返回的数组的最大长度。如果设置了该参数,返回的子串不会多于这个参数指定的数组。如果没有设置该参数,整个字符串都会被分割,不考虑它的长度。
    ,返回数组

  • "string1".localCompare("string2"):比较字符串,大于返回1,等于返回0,小于返回-1

  • fromCharCode(101,12,334,45):接收字符编码返回对应的字符串


10.Date的静态方法

  • Date.parse():
    parse方法用来解析日期字符串,返回距离1970年1月1日 00:00:00的毫秒数
Date.parse("January 26, 2011 13:51:50")
Date.parse("Mon, 25 Dec 1995 13:30:00 GMT")
Date.parse("Mon, 25 Dec 1995 13:30:00 +0430")
Date.parse("2011-10-10")
Date.parse("2011-10-10T14:48:00")
1318229280000
  • Date.UTC():Date对象返回的都是当前时区的时间

Date.UTC方法可以返回UTC时间。该方法接受年、月、日等变量作为参数,返回当前距离1970年1月1日 00:00:00 UTC的毫秒数

Date.UTC(2015,0,1,2,3,4,567); //1420077784567
  • Date.now():now方法返回当前距离1970年1月1日00:00:00的毫秒数
Date.now(); // 1427974222853
  • Date():返回当前时间的字符串
Date();//"Tue Sep 12 2017 11:48:46 GMT+0800 (中国标准时间)"
  • new Date(year, month [, day, hours, minutes, seconds, ms]):返回对应时间,在多个参数的情况下,Date对象将其分别视作对应的年、月、日、小时、分钟、秒和毫秒。如果采用这种用法,最少需要指定两个参数(年和月),其他参数都是可选的,默认等于0。如果只使用年一个参数,Date对象会将其解释为毫秒数。
new Date();// Tue Sep 12 2017 11:49:36 GMT+0800 (中国标准时间)
------------------
new Date("2013-02-15")
new Date("2013-FEB-15")
new Date("FEB, 15, 2013")
new Date("FEB 15, 2013")
new Date("Feberuary, 15, 2013")
new Date("Feberuary 15, 2013")
new Date("15, Feberuary, 2013") //Fri Feb 15 2013 00:00:00 GMT+0800 (中国标准时间)
------------------------------
new Date(2013) // Thu Jan 01 1970 08:00:02 GMT+0800 (CST)
new Date(2013,0) // Tue Jan 01 2013 00:00:00 GMT+0800 (CST)
new Date(2013,0,1) // Tue Jan 01 2013 00:00:00 GMT+0800 (CST)
new Date(2013,0,1,0) // Tue Jan 01 2013 00:00:00 GMT+0800 (CST)
new Date(2013,0,1,0,0,0,0) // Tue Jan 01 2013 00:00:00 GMT+0800 (CST)
  • get:
    • Date.prototype.getTime():返回实例对象距离1970年1月1日00:00:00对应的毫秒数,等同于valueOf方法

    • Date.prototype.getDate():返回实例对象对应每个月的几号(从1开始)

    • Date.prototype.getDay():返回星期,星期日为0,星期一为1,以此类推

    • Date.prototype.getFullYear():返回四位的年份

    • Date.prototype.getMonth():返回月份(0表示1月,11表示12月)

    • Date.prototype.getHours():返回小时(0-23)

    • Date.prototype.getMilliseconds():返回毫秒(0-999)

    • Date.prototype.getMinutes():返回分钟(0-59)

    • Date.prototype.getSeconds():返回秒(0-59)

    • Date.prototype.getTimezoneOffset():返回当前时间与UTC的时区差异,以分钟表示,返回结果考虑到了夏令时因素

  • set:
    • Date.prototype.setDate(date):设置实例对象对应的每个月的几号(1-31),返回改变后毫秒时间戳

    • Date.prototype.setFullYear(year [, month, date]):设置四位年份

    • Date.prototype.setHours(hour [, min, sec, ms]):设置小时(0-23)

    • Date.prototype.setMilliseconds():设置毫秒(0-999)

    • Date.prototype.setMinutes(min [, sec, ms]):设置分钟(0-59)

    • Date.prototype.setMonth(month [, date]):设置月份(0-11) -

    • Date.prototype.setSeconds(sec [, ms]):设置秒(0-59)

    • Date.prototype.setTime(milliseconds):设置毫秒时间戳

  • Date.prototype.toString():
  • Date.prototype.toString():
  • Date.prototype.toTimeString():
  • toLocalDateString():
  • toLocalTimeString():
  • Date.prototype.toUTCString():
  • Date.prototype.toISOString():

11.Math属性

Math.E // 2.718281828459045
Math.LN2 // 0.6931471805599453
Math.LN10 // 2.302585092994046
Math.LOG2E // 1.4426950408889634
Math.LOG10E // 0.4342944819032518
Math.PI // 3.141592653589793
Math.SQRT1_2 // 0.7071067811865476
Math.SQRT2 // 1.4142135623730951

12.Math方法

  • min():最小值
  • max():最大值
    找到数组的最大值
var values=[1,2,3,4,5,6,7,8];
var max=Math.max.apply(Math,values)
console.log(max); //8
  • ceil():ceil方法返回大于参数值的最小整数
  • floor():floor方法返回小于参数值的最大整数
  • round():四舍五入
  • pow(2,3):幂运算
  • sqrt(4):开方运算
  • log(100):以e为底的对数运算
  • exp(1):返回常数e的参数次方
    求以10为底的对数,可以除以Math.LN10;求以2为底的对数,可以除以Math.LN2。
Math.log(100)/Math.LN10 // 2
Math.log(8)/Math.LN2 // 3

  • 三角函数
Math.sin(0) // 0
Math.cos(0) // 1
Math.tan(0) // 0

Math.asin(1) // 1.5707963267948966
Math.acos(1) // 0
Math.atan(1) // 0.7853981633974483
  • random():该方法返回0到1之间的一个伪随机数,可能等于0,但是一定小于1
// 返回给定范围内的随机数
function getRandomArbitrary(min, max) {
  return Math.random() * (max - min) + min;
}

// 返回给定范围内的随机整数
function getRandomInt(min, max) {
  return Math.floor(Math.random() * (max - min + 1)) + min; //包含min,max
}
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 205,033评论 6 478
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 87,725评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 151,473评论 0 338
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,846评论 1 277
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,848评论 5 368
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,691评论 1 282
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 38,053评论 3 399
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,700评论 0 258
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 42,856评论 1 300
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,676评论 2 323
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,787评论 1 333
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,430评论 4 321
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 39,034评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,990评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,218评论 1 260
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 45,174评论 2 352
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,526评论 2 343

推荐阅读更多精彩内容

  • 第5章 引用类型(返回首页) 本章内容 使用对象 创建并操作数组 理解基本的JavaScript类型 使用基本类型...
    大学一百阅读 3,211评论 0 4
  • 国家电网公司企业标准(Q/GDW)- 面向对象的用电信息数据交换协议 - 报批稿:20170802 前言: 排版 ...
    庭说阅读 10,865评论 6 13
  • 参考基础教程的整理,方便记忆 一、Object对象 (O大写) 所有其他对象都继承自这个对象。Object本身也是...
    Viaphlyn阅读 2,302评论 0 0
  • 感恩父母养育之恩愿母亲身体健康衣食无忧智慧增长!感恩国家的安定!感恩老师传道授业解惑!感恩社会大众的服务!感恩食物...
    T上善若水阅读 217评论 0 0
  • 事实包括两种:事物和事件。 观念则是我们对客观事物的主观描摹。 玻璃心:别人可能很累没有注意到你,你以为别人不关心...
    三不主义阅读 109评论 0 0