资讯专栏INFORMATION COLUMN

刷前端面经笔记(十二)

Rocko / 3170人阅读

摘要:以下递归函数存在栈溢出的风险,请问如何优化解答请实现一个计算最大公约数的函数在这里编写代码解答数组去重如果数组中有排除用实现斐波那契数列函数返回第个斐波那契数。父类我的名字是我今年岁原型继承构造函数继承组合继承组合继承优化

1.以下递归函数存在栈溢出的风险,请问如何优化?
function factorial(n){
    return n*factorial(n-1)
}

解答:

function factorial(n){
    return n > 1 ? n * factorial(n-1) : 1;
}
2.请实现一个计算最大公约数的函数:
function greatestCommonDivisor(a,b){
//在这里编写代码
}
greatestCommonDivisor(8, 12) //4
greatestCommonDivisor(8, 16) //8
greatestCommonDivisor(8, 17) //1

解答:

function greatestCommonDivisor(a,b){
  var num=0;  
      while(b!=0){       
           num=a%b;  
           a=b;  
           b=num;  
      }  
      return a;

}
3.数组去重(如果数组中有NaN)
Array.prototype.uniq = function () {
   var resArr = [];
   var flag = true;
      
   for(var i=0;i
4.用 JavaScript 实现斐波那契数列函数,返回第n个斐波那契数。 f(1) = 1, f(2) = 1 等
function fibonacci(n) {
    if(n ==1 || n == 2){
        return 1
    }
    return fibonacci(n - 1) + fibonacci(n - 2);
}
5.根据包名,在指定空间中创建对象

输入描述:

namespace({a: {test: 1, b: 2}}, "a.b.c.d")

输出描述:

{a: {test: 1, b: {c: {d: {}}}}}
function namespace(oNamespace, sPackage) {
 
    var properties = sPackage.split(".");
    var parent = oNamespace;
 
    for (var i = 0, lng = properties.length; i < lng; ++i) {
 
        var property = properties[i];
 
        if (Object.prototype.toString.call(parent[property])!== "[object Object]") {
            parent[property] = {};
        }
 
        parent = parent[property];
 
    }
 
    return oNamespace;
 
}
6.封装函数 f,使 f 的 this 指向指定的对象
function bindThis(f, oTarget) {
    return function(){
        var parames = Array.prototype.slice.call(arguments);
        return f.apply(oTarget,parames); //注意这里需要返回f的执行结果
    }  
}
7.dom 节点查找

查找两个节点的最近的一个共同父节点,可以包括节点自身

输入描述:

oNode1 和 oNode2 在同一文档中,且不会为相同的节点
function commonParentNode(oNode1, oNode2) {
    if(oNode1.contains(oNode2)){
        return oNode1;
    }else if(oNode2.contains(oNode1)){
        return oNode2;
    }else{
        return commonParentNode(oNode1.parentNode,oNode2);
    }
}
8.关系型数组转换成树形结构对象

关系型数组:

var obj = [
    { id:3, parent:2 },
    { id:1, parent:null },
    { id:2, parent:1 },
]

期望结果:

o = {
  obj: {
    id: 1,
    parent: null,
    child: {
      id: 2,
      parent: 1,
      child: {
          id: ,3,
          parent: 2
      }
    }
  }
}

实现源码:

function treeObj(obj) {
  obj.map(item => {
    if (item.parent !== null) {
      obj.map(o => {
        if (item.parent === o.id) {
          if (!o.child) {
            o.child = [];
          }
          o.child.push(item);
          o.child = o.child;
        }
      });
    }
  });
  return obj.filter(item => item.parent === null)[0]
}

或者:

function treeObj(obj) {
  return obj.sort((a, b) => b.parent - a.parent)
      .reduce((acc, cur) => (acc ? { ...cur, child: acc } : cur));
}
9.JS如何判断一组数字是否连续
// 当出现连续数字的时候以‘-’输出
[1, 2, 3, 4, 6, 8, 9, 10]

期望结果:

["1-4", 6, "8-10"]

实现代码:

判断是否连续:

var arrange = function(arr){
    var result = [],temp = [];
    arr.sort(function(source, dest){
        return source - dest;
    }).concat(Infinity).reduce(function(source, dest){
        temp.push(source);
        if(dest-source > 1){
            result.push(temp);
            temp = [];
        }
        return dest;
    });
    return result;
};

格式化实现:

var formatarr = function(arr) {
    var newArr = []
    var arr1 = arrange(arr)
    for (var i in arr1) {
        var str = "";
        if (arr1[i].length > 1) {
            str = arr1[i][0] + "-" + arr1[i][arr1[i].length - 1];
            newArr.push(str)
        } else {
            newArr.push(arr1[i][0]);
        }
   }
   return newArr;
}
10.创建子类Child,使用原型和构造函数的方式继承父类People的方法,并调用say函数说出姓名和年龄。

父类:

function People(name,age){
     this.name=name;
     this.age=age;
     this.say=function(){
         console.log("我的名字是:"+this.name+"我今年"+this.age+"岁!");
     };
}

原型继承:

function Child(name, age){
    this.name = name;
    this.age = age;
}
Child.prototype = new People();
var child = new Child("Rainy", 20);
child.say()

构造函数继承:

function Child(name, age){
    People.call(this)
    this.name = name;
    this.age = age;
}
var child = new Child("Rainy", 20);
child.say()

组合继承:

function Child(name, age){
    People.call(this);
    this.name = name;
    this.age = age;
}
Child.prototype = People.prototype;
var child = new Child("Rainy", 20);
child.say()

组合继承优化:

function Child(name, age){
    People.call(this);
    this.name = name;
    this.age = age;
}
Child.prototype = Object.create(People.prototype);
Child.prototype.constructor = Child;
var child = new Child("Rainy", 20);
child.say()

文章版权归作者所有,未经允许请勿转载,若此文章存在违规行为,您可以联系管理员删除。

转载请注明本文地址:https://www.ucloud.cn/yun/101830.html

相关文章

  • 前端面经笔记(一)

    摘要:协商缓存从缓存数据库中取出缓存的标识,然后向浏览器发送请求验证请求的数据是否已经更新,如果已更新则返回新的数据,若未更新则使用缓存数据库中的缓存数据。 1.CSS的盒子模型 包含元素内容content、内边距padding、边框border、外边距marginbox-sizing:border-box;content-box;inherit;1) content-box:总宽度=mar...

    刘德刚 评论0 收藏0
  • 前端面经笔记(二)

    摘要:但这会带来高度塌陷的问题,所以要清除浮动。核心内置类,会尝试先于例外的是,利用的是转换。安全性请求可被缓存,请求保存在浏览器的历史记录中则不能被缓存。与相比,的安全性较差,因为发送的数据是的一部分。 1.实现三栏布局(左右两边固定宽度,中间自适应) 1)浮动布局左右两边固定宽度,并分别设置float:left和float:right。(但这会带来高度塌陷的问题,所以要清除浮动。清除浮动...

    rottengeek 评论0 收藏0
  • 到就是赚到!八月阿里 Android 高级岗面经(年薪百万)

    摘要:前段时间,前同事跳槽,机缘巧合下面了阿里,本来凭着试一试的态度,却不料好事成双,拿到了,而且薪资也了。面就没啥东西可聊的,基本上就是对此次面试的一个评价定薪等等一些之内的话题。如果是现场面试,记得关注当天的天气,提前查一下路线。 ...

    aisuhua 评论0 收藏0
  • 我的阿里之路+Java面经考点

    摘要:我的是忙碌的一年,从年初备战实习春招,年三十都在死磕源码,三月份经历了阿里五次面试,四月顺利收到实习。因为我心理很清楚,我的目标是阿里。所以在收到阿里之后的那晚,我重新规划了接下来的学习计划,将我的短期目标更新成拿下阿里转正。 我的2017是忙碌的一年,从年初备战实习春招,年三十都在死磕JDK源码,三月份经历了阿里五次面试,四月顺利收到实习offer。然后五月怀着忐忑的心情开始了蚂蚁金...

    姘搁『 评论0 收藏0
  • "双非"应届生校招如何获得大厂青睐?(内附前端大厂面经+技术岗超全求职攻略)

    摘要:拿到秋招的同学,如确定入职需与用人单位签署三方协议,以保证双方的利益不受损失。当然每个岗位所要求的侧重点不同,但却百变不离其宗。方法论要想达成某个目标都有其特定的方法论,学习技术也不例外,掌握适当的学习方法才能事半功倍。 写在前面的话 笔者从17年的2月份开始准备春招,其中遇到不少坑,也意识到自己走过的弯路。故写了这篇文章总结一番,本文适合主动学习的,对自己要学的课程不明确的,对面试有...

    jeffrey_up 评论0 收藏0

发表评论

0条评论

Rocko

|高级讲师

TA的文章

阅读更多
最新活动
阅读需要支付1元查看
<