好程序员web前端学习路线大厂面试题详解

好程序员web前端学习路线大厂面试题详解,依赖注入原理

手动实现依赖注入实现方式

- var _global={

- ajax:function(){//申明服务,也可以说是内部类

- this.get=function(){

- //todo:get方式请求数据

- console.log(“get is success”);

- };

- This.post=function(){

- //todo:post方式请求数据

- console.log(“post is success”);

- }

- },

- //…还可以定义若干个不同的服务

- init:function(_server,_fx){//这个方法起到一个注入器的作用

- var _args=[];

- for(var i=0;i<_server.length;i++){

- _args.push(new this[_servers[i]]);/*这里尤为关键,必须是新new出来的对象,如果是预定义的对象的情况,很有可能改一处动全局的致命错误。*/

- }

- _fx.apply(this,_args);

- }

- }

- _global.init([“ajax”],function(_ajax){

  • /*数组中的每个元素表示服务的名称,函数中的形参顺序与数组中的顺序一致*/

- _ajax.get();

- _ajax.post();

- console.log(this);

- });

参考答案思路:

本题是要求js实现依赖注入设计模式。考察编程基础的目的。答案不唯一。

依赖注入顾名思义:有依赖关系才会注入服务。也就是需要使用的时候才会注入相关服务。

注意事项:服务不能是全局对象,必须是新实例的对象。如果是全局的对象,一是注入就显得多此一举,更重要的是有可能在多处使用,然后出现数据脏读的致命性错误。

由此可见,服务都是预定义的构造函数。

阿里·云笔试

1、阿里云产品线十分丰富,拥有ECS、RDS等数百款产品,每个产品都具有一些通用属性,例如:ID(id),地域(region),名称(name),同时每个产品又包含自己特有的属性。 ECS拥有实例(instance)属性,可选值有ecs.t1.small、ecs.t3.small、ecs.t1.large RDS拥有数据库类型(dbType)属性,可选值有mysql、mssql、PPAS 请使用你的面向对象知识,基于ES6语法编写ECS、RDS两个类,并实现如下方法: 1. config() 返回一个字面量对象,可以拿到所有的成员变量。 2. buy() 返回一个URL,格式为 https://www.aliyun.com/buy?id=xxx®ion=xxx&name=xxx&每个产品自己特有的成员变量

class Property{

constructor(_identify,_region,_name){

this.id=_identify;

this.region=_region;

this.name=_name;

}

buy(){

var _url="https://www.aliyun.com/buy?";

for(let _key in this){

if(this.hasOwnProperty(_key) && typeof(this[_key])!=="object"){

_url+=_key+"="+this[_key]+"&";

}

}

if(_url.indexOf("&")>0){

return _url.replace(/&$/g,"");

}

return _url;

}

}

class ECS extends Property{

constructor(_identify,_region,_name){

super(_identify,_region,_name);

}

config(_value){

this.instance=_value;

return this;

}

}

let _ecs=new ECS(1,"beijing","ECS");

console.log(_ecs.config("ecs.t1.small"));

console.log(_ecs.buy());

class RDS extends Property{

constructor(_identify,_region,_name){

super(_identify,_region,_name);

}

config(_type){

this.dbType=_type;

return this;

}

}

var _rds=new RDS(2,"beijing","RDS");

console.log(_rds.config("mysql"));

console.log(_rds.buy());

解题思路:

1、根据面试题描述,数百种产品均有通用的属性,那么就选择一次定义多次使用的,能达到这种效果的而且又要求面向对象,所以优先考虑继承。把公共的属性和方法放到父类。子类实现继承即可。

2、每个产品均有自己的特有属性,那么在调用config方法的时候传入配置参数,同时还要求返回一个字面两对象,还要能拿到所有属性,所以直接返回当前对象即可。

3、buy方法要求返回url,此时查看url中都包含哪些属性,我们发现均为当前产品对象的属性。所以遍历拼接即可。

2、请将编写一个函数将 [3, 5, 7, 2, 1, 8, 9, 0, 5, 23, 15, 5, 1, 5, 8] 这样的一个组件中重复的元素去除掉

function splice(){

var _arr=[3,5,7,2, 1, 8, 9, 0, 5, 23, 15, 5, 1, 5, 8];

for(var i=0;i<_arr.length;i++){

for(var n=i+1;n<_arr.length;n++){

if(_arr[i]===_arr[n]){

_arr.splice(n--,1);//因为元素数量减少了,如果向前挪动一个下标3个以上的连续重复的元素会有遗漏

}

}

}

console.log(_arr);

}

splice();

参考答案思路:

数组去重是比较常规的面试题,主要考察一个知识点数组的splice方法的使用。但是阿里出这个题个人认为他更注意的是你的认真态度,或者思维缜密性。因为在题中并没有连续3个重复的数字。在注释那一行我写的很清楚,这题的不用n—结果也是对的。但是连续出现三个数字的话,你会发现不能完全清除重复的数字。

3、编写一个递归函数查询tree给定节点的祖先链(包含给定节点),

要求:

1、要求查出祖先链后函数立即返回,不再继续递归遍历后面的节点

2、函数要有一个参数来指定tree的节点的主键名

3、使用示例代码中的options作为tree结构的参考

const options = [

{

id: ‘zhejiang‘,

text: ‘Zhejiang‘,

children: [

{

id: ‘hangzhou‘,

text: ‘Hangzhou‘,

children: [

{

id: ‘xihu‘,

text: ‘West Lake‘

}

]

}

]

},

{

id: ‘jiangsu‘,

text: ‘Jiangsu‘,

children: [

{

id: ‘nanjing‘,

text: ‘Nanjing‘,

children: [

{

id: ‘zhonghuamen‘,

text: ‘Zhong Hua Men‘

}

]

}

]

}

];

function recursion(_primary,_options){

var _parent=null;

for(var i=0;i<_options.length;i++){

if(_options[i].id!==_primary){

if(!_options[i].children){

return null;

}

_parent=recursion(_primary,_options[i].children);

if(_parent){

_parent.push(_options[i])

return _parent;

}

}else{

return [_options[i]];

}

}

}

console.log(recursion(“zhonghuamen",options));

参考答案思路:

题目要求需要递归,那么就考察我们对递归算法的了解。根据给定的节点主键查询父路径,那么首先我们要找到主键所在的位置,然后一路返回,此题的难度主要在于,当找到后立即停止,而不能继续浪费查询。在这一点上如果直接无条件return的话,第一个对象递归完就回结束递归。

4、将类似以下JSON表示的树状结构(可以无限层级)

通过parseDOM函数(使用document.createElement,document.createTextNode,appendChild等方法)

生成一颗DOM树(返回一个element元素)

const JsonTree = {

"tagName": "ul",

"props": {

"className": "list",

"data-name": "jsontree"

},

"children": [

{

"tagName": "li",

"children": [{

"tagName": "img",

"props": {

"src": "//img.alicdn.com/tps/TB1HwXxLpXXXXchapXXXXXXXXXX-32-32.ico",

"width": "16px"

}

}]

},

{

"tagName": "li",

"children": [{

"tagName": "a",

"props": {

"href": "https://www.aliyun.com",

"target": "_blank"

},

"children": "阿里云"

}]

}

]

};

function parseDOM(jsontree){

const {tagName,props,children} = jsontree;

const element = document.createElement(tagName);

//请实现过程

//....

for(let _key in props){

element[_key]=props[_key];

}

if(children && typeof(children)==="object"){

for(let i=0;i<children.length;i++){

element.appendChild(parseDOM(children[i]));

}

}else{

if(children){

element.appendChild(document.createTextNode(children));

}

}

return element;

}

document.getElementsByTagName(“body")[0].appendChild(parseDOM(JsonTree));

参考答案思路:

首先这个面试题很切合实际,在日常的开发过程中经常会遇到这种类型的数据。主要考我们对递归算法的熟练程度。具体的知识点就是题中列出的3个DOM操作的知识。

参考答案的思路是把每次创建完成的节点添加到父元素中。

原文地址:https://www.cnblogs.com/gcghcxy/p/11435997.html

时间: 2024-10-30 04:09:45

好程序员web前端学习路线大厂面试题详解的相关文章

好程序员web前端学习路线之在JavaScript中使用getters和setter

好程序员web前端学习路线之在JavaScript中使用getters和setter,大多数面向对象的编程语言都存在getter和setter,包括JavaScript.它们是代码构造,可帮助开发人员以安全的方式访问对象的属性.使用getter,您可以从外部代码访问("获取")属性的值,而setter允许您更改("设置")它们的值.我们将向您展示如何在JavaScript中创建getter和setter. JavaScript对象可以具有多个属性和存储的静态数据和动

好程序员web前端学习路线分享jQuery学习技巧

好程序员web前端学习路线分享jQuery学习技巧,jQuery在web前端学习中是一个必不可少的内容,很多小伙伴都在学习这阶段的时候遇到问题,今天我们就来聊一下jQuery,让我们一起来看一看吧! 1.关于页面元素的引用 通过jquery的$引用元素包括通过id.class.元素名以及元素的层级关系及dom或者xpath条件等方法,且返回的对象为jquery对象(集合对象),不能直接调用dom定义的方法. 2.jQuery对象与dom对象的转换 只有jquery对象才能使用jquery定义的方

好程序员web前端学习路线分享web测试之Js中的函数

好程序员web前端学习路线分享web测试之Js中的函数,在JS中,一般使用函数其实就是为了封装某些操作,或者把编写的程序进行模块化的操作. 一.函数的声明方式 1.普通的函数声明 function box(num1, num2) { return num1+ num2; } 2.使用变量初始化函数 var box= function(num1, num2) { return num1 + num2; }; 3.使用Function构造函数 var box= new Function('num1'

好程序员web前端学习路线分享css模块化方案

好程序员web前端学习路线分享css模块化方案,这篇文章主要介绍了css模块化方案,css的模块化方案可能和js的一样多,下面简单介绍几种主要的模块方案,非常具有实用价值,需要的小伙伴可以参考下. css的模块化方案可能和js的一样多,下面简单介绍几种主要的模块方案.oocss面对对象的规则,主要的原则是两种:分离结构和外观,分离容器和内容.名词解释1.分离结构和外观:增加可重复的设计单元,同时去推进产品和ui对这方面的思考,比如下面的css使用时对象模式的命名和模块化规则.2.分离容器和内容:

好程序员web前端学习路线分享了解AJAX是什么

好程序员web前端学习路线分享了解AJAX是什么首先是服务器 什么是服务器:咱们的页面来源于服务器:实例(在phpnwo上面存放一个页面), 咱们把页面放在互联网的服务器上,就有了自己的网站了. 1.异步同步 生活中的同步: 生活中的异步: 在JavaScript语言中,同步和异步的概念刚好相反. 这JavaScript中同步就是:你不执行完上面的代码,那么下面的代码你就别执行:一步一步执行,这就是同步. 异步就是可以一块执行的代码: 进程的概念 进程≠程序 程序从开始到结束的一次执行过程叫做进

好程序员web前端学习路线分享Jsonp详解

好程序员web前端学习路线分享Jsonp详解,Jsonp原理: 咱们先看看POST的数据发送位置: GET的数据发送位置 那什么情况下会发生跨域呢? 当本机请求服务器上数据的时候:会发生跨域: 当本地服务器请求其他服务器数据的时候回发生跨域: 为什么要跨域呢? 同源策略:基于浏览器的安全考虑,浏览器各个厂商之间出现了一个约定,这个约定叫做同源策略.这个约定的主要内容就是,域和域之间数据不共通. 跨域的用途是什么? 当网站发展壮大到一定地步的时候,会建立很多的节点,各个节点的IP是不同的,所以跨域

好程序员web前端学习路线分享纯css绘制各种图形

好程序员web前端学习路线分享纯css绘制各种图形,很多时候,UI设计师为了页面的好看,都会采用很多图形去做装饰,比如三角形.矩形.圆形.椭圆形.对话泡泡等,让整个页面看起来不会太单调.作为前端开发更多的时候,会采用比较快捷的实现方式就是用图片或者背景图来实现页面效果,但是有一个很大的问题就是图片可能会失真,有些情况也会发现用图片或者背景图去实现效果灵活度也不够.那么如果不用图片,用纯CSS也是可以绘制各种图形的,很多人都以为css只能写一些简单的图形,比如长方形.正方形.圆形.椭圆,其实不然,

好程序员web前端学习路线分享前端基础面试题

好程序员web前端学习路线分享前端基础面试题,希望对大家有所帮助. 1.HTML语义化的理解? 答案:HTML语义化就是让页面的内容结构化,便于对浏览器.搜索引擎解析:在没有样式CSS的情况下也以一种文档格式显示,并且是容易阅读的:搜索引擎的爬虫依赖于标记来确定上下文和各个关键字的权重,利于SEO:使阅读源代码的人对网站更容易将网站分块,便于阅读维护理解. 2.父元素透明,但是又不影响子元素的透明度怎么实现? 答案:方法一:用rgba 方法二:再加上一层与父元素同级的div装载子元素,定位到子元

好程序员web前端学习路线分享函数基础

好程序员web前端学习路线分享函数基础,在这之前先来讲一下函数是什么? 函数就一个代码块,可以是一个完全独立与其它内容没有关系的代码块,也可以是一个与外界环境紧密相关的代码块.函数是一个拥有输入和输出的独立代码块.函数是程序中最重要的组成部分. 函数,是一种封装(将一些语句,封装到函数里面).通过函数可以封装任意多条语句,而且可以在任何地方.任何时候调用执行. 在javascript里,函数即对象,程序可以随意操控它们.函数可以嵌套在其他函数中定义,这样它们就可以访问它们被定义时所处的作用域中的