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<this.length;i++){if(resArr.indexOf(this[i]) == -1){if(this[i] != this[i]){   //排除 NaNif(flag){resArr.push(this[i]);flag = false;}}else{resArr.push(this[i]);}}}return resArr;
}

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()

刷前端面经笔记(十二)相关推荐

  1. 刷前端面经笔记(二)

    1.实现三栏布局(左右两边固定宽度,中间自适应) 1)浮动布局 左右两边固定宽度,并分别设置float:left和float:right.(但这会带来高度塌陷的问题,所以要清除浮动.清除浮动的方式有: ...

  2. 刷前端面经笔记(七)

    1.描述一下渐进增强和优雅降级 优雅降级(graceful degradation):一开始就构建站点的完整功能,然后针对浏览器测试和修复. 渐进增强(progressive enhancement) ...

  3. 刷前端面经笔记(十一)

    1.栈的压入和弹出 输入两个整数序列,第一个序列表示栈的压入顺序,请判断第二个序列是否可能为该栈的弹出顺序.假设压入栈的所有数字均不相等.例如序列1,2,3,4,5是某栈的压入顺序,序列5,4,3,2 ...

  4. 刷前端面经笔记(九)

    1.JavaScript实现二分法查找? 二分法查找,也称折半查找,是一种在有序数组中查找特定元素的搜索算法. 查找过程可以分为以下步骤: (1)首先,从有序数组的中间的元素开始搜索, 如果该元素正好 ...

  5. 刷前端面经笔记(三)

    1.var的变量提升的底层原理是什么? JS引擎的工作方式是 1)先解析代码,获取所有被声明的变量: 2)然后再执行. 也就是分为预处理和执行这两个阶段. 变量提升:所有用var声明变量的语句都会被提 ...

  6. DayDayUp:《机器崛起前传》第二十二章【蹒跚而来】读后感(文章源自网络)—听课笔记

    DayDayUp:<机器崛起前传>第二十二章[蹒跚而来]读后感(文章源自网络)-听课笔记 <机器崛起前传> 1.机器岂不能有自我?         计算机的发展历程可谓蹒跚.从 ...

  7. OpenCV学习笔记(十二)——图像分割与提取

    在图像处理的过程中,经常需要从图像中将前景对象作为目标图像分割或者提取出来.例如,在视频监控中,观测到的是固定背景下的视频内容,而我们对背景本身并无兴趣,感兴趣的是背景中出现的车辆.行人或者其他对象. ...

  8. Python语言入门这一篇就够了-学习笔记(十二万字)

    Python语言入门这一篇就够了-学习笔记(十二万字) 友情提示:先关注收藏,再查看,12万字保姆级 Python语言从入门到精通教程. 文章目录 Python语言入门这一篇就够了-学习笔记(十二万字 ...

  9. python图像处理笔记-十二-图像聚类

    python图像处理笔记-十二-图像聚类 学习内容 这一章主要在学习的是聚类算法以及其在图像算法中的应用,主要学习的聚类方法有: KMeans 层次聚类 谱聚类 并将使用他们对字母数据及进行聚类处理, ...

最新文章

  1. 如何根据原理图画封装_生物水处理专用消泡剂是如何根据生物水处理工艺原理进行消泡的?...
  2. 初识boost之boost::share_ptr用法
  3. boost::hana::not_用法的测试程序
  4. MySQL(9)主从复制与读写分离
  5. 编写基于事件的CQRS读取模型
  6. 程序员表白代码python_程序员python表白代码
  7. 普中科技51单片机_【笔记】普中科技-51单片机-静态数码管显示
  8. 力扣344. 反转字符串(JavaScript)
  9. Helm 3 完整教程(二十二):如何设置 Chart 安装完成后提示 NOTE 信息
  10. JavaScript变量、属性、函数、方法的区别(1)
  11. SqlParameter类中的两对好基友:SqlDbType与DbType、SqlValue与Value
  12. [Leetcode]设计链表
  13. 解决Boost库链接出错问题
  14. java将date类型转成yyyymmdd_java中的Date怎么转换成YYYYMMDD形式的
  15. 战争机器5加速器信息:开发工作已经完成 更多内容将在科隆展上披露
  16. Mac 隔空投送 AirDrop 搜不到 iPhone
  17. PredRNN++: Towards A Resolution of the Deep-in-Time Dilemma in Spatiotemporal Predictive Learning
  18. 【数字图像处理】前期准备工作,库的安装(skimage库的安装!)
  19. 智慧工厂数字孪生 数字孪生工厂 工厂数字孪生
  20. 江淮汽车回应为小米代工;腾讯起诉腾迅获赔 30 万;鸿星尔克因公司系统崩溃、恳请顾客退款 | EA周报...

热门文章

  1. CentOS中使用Docker安装SqlServer以及遇到的那些坑
  2. 若依管理系统源码分析-导出Excel时怎样通过注解中readConverterExp实现格式化导出列的显示格式(0和1格式化为是否)
  3. Vue实现仿音乐播放器5-实现今日推荐访问百度音乐API获取数据
  4. 查看库中所有表有多少数据
  5. PHP实进程池,swoole_process实现进程池的方法示例
  6. range 小程序picker_微信小程序-官方组件picker云开发省市区三级联动选择器
  7. C#学习小结(DAY1)
  8. 自然科学 计算机,计算机科学与自然科学技术的关系
  9. python最基本的规则是关键字吗,Python 关键字
  10. pagerank算法实现matlab,Matlab 入门及PageRank算法求解.ppt