前端面试题之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
}

你可能感兴趣的:(前端面试题之JavaScript(五))