前端常见面试题

本文详细解释了面向对象编程的概念,对比了面向对象与面向过程的区别,举例说明了如何使用对象解决问题。同时,介绍了Java对象、C++指针的工作原理,以及垃圾回收机制。此外,还涵盖了Ajax的工作原理和Vue的生命周期。最后,概述了软件开发的完整流程,包括需求分析、设计、编码、测试和维护等阶段。
摘要由CSDN通过智能技术生成

解释面向对象编程?

面向过程(Procedure Oriented 简称PO :如C语言):

从名字可以看出它是注重过程的。当解决一个问题的时候,面向过程会把事情拆分成: 一个个函数和数据(用于方法的参数) 。然后按照一定的顺序,执行完这些方法(每个方法看作一个过程),等方法执行完了,事情就搞定了。

面向对象(Object Oriented简称OO :如C++,JAVA等语言):

看名字它是注重对象的。当解决一个问题的时候,面向对象会把事物抽象成对象的概念,就是说这个问题里面有哪些对象,然后给对象赋一些属性和方法,然后让每个对象去执行自己的方法,问题得到解决。

例子一:

问题: 洗衣机里面放有脏衣服,怎么洗干净?

面向过程的解决方法:

1、执行加洗衣粉方法;

2、执行加水方法;

3、执行洗衣服方法;

4、执行清洗方法;

5、 执行烘干方法;

以上就是将解决这个问题的过程拆成一个个方法(是没有对象去调用的),通过一个个方法的执行来解决问题。

面向对象的解决方法:

1、我先弄出两个对象:“洗衣机”对象和“人”对象

2、针对对象“洗衣机”加入一些属性和方法:“洗衣服方法”“清洗方法”、“烘干方法”

3、针对对象“人”加入属性和方法:“加洗衣粉方法”、“加水方法”

4、然后执行

人.加洗衣粉

人.加水

洗衣机.洗衣服

洗衣机.清洗

洗衣机.烘干

解决同一个问题 ,面向对象编程就是先抽象出对象,然后用对象执行方法的方式解决问题。

面向对象是以功能来划分问题,而不是步骤。

四、面向对象编程的特性

三大基本特性:封装,继承,多态

封装

封装,就是把客观事物封装成抽象的类,并且类可以把自己的数据和方法只让可信的类或者对象操作,对不可信的进行信息隐藏。一个类就是一个封装了数据以及操作这些数据的代码的逻辑实体。在一个对象内部,某些代码或某些数据可以是私有的,不能被外界访问。通过这种方式,对象对内部数据提供了不同级别的保护,以防止程序中无关的部分意外的改变或错误的使用了对象的私有部分。

继承

继承,指可以让某个类型的对象获得另一个类型的对象的属性的方法。它支持按级分类的概念。继承是指这样一种能力:它可以使用现有类的所有功能,并在无需重新编写原来的类的情况下对这些功能进行扩展。 通过继承创建的新类称为“子类”或“派生类”,被继承的类称为“基类”、“父类”或“超类”。继承的过程,就是从一般到特殊的过程。要实现继承,可以通过 “继承”(Inheritance)和“组合”(Composition)来实现。继承概念的实现方式有二类:实现继承与接口继承。实现继承是指直接使用父类的属性和方法而无需额外编码的能力;接口继承是指仅使用属性和方法的名称、但是子类必须提供实现的能力。

多态

多态,是指一个类实例的相同方法在不同情形有不同表现形式。多态机制使具有不同内部结构的对象可以共享相同的外部接口。这意味着,虽然针对不同对象的具体操作不同,但通过一个公共的类,它们(那些操作)可以通过相同的方式予以调用。

解释java的对象?

对象是由类抽象出来的,所有的问题都是通过对象来处理,对象可以操作类的属性和方法来解决问题

解释C++指针?

​ 本质上讲指针也是一种变量,指针变量包含的是内存中的一块地址,这块地址指向某个变量或者函数,指针就是地址。指针是一个指示器,它告诉程序在内存的哪块区域可以找到数据。

​ 指针的内容包含4部分:指针的类型,指针所指向的类型,指针的值,指针本身所占有的内存区。

指针的类型是指把指针声明语句中的指针名字去掉所剩下的部分。
指针指向的是一块内存区域,指针所指向的类型取决于这块内存在编译时是什么类型

指针只是一个整数,它包含一个内存地址

指针是一个对象

指针是无类型的

解释java垃圾回收?

Java拥有一套完整的垃圾回收机制,用户不必担心废弃的对象占用内存,垃圾回收器将回收无用的占用内存的资源。每个对象都有生命周期,当对象的生命周期结束时,分配给该对象的内存地址将会被回收。对象引用超过其作用范围,将对象赋值为null;这个对象将视为垃圾;

Ajax原理和运行机制

ajax是一种支持异步请求的技术, XMLHttpRequest是ajax的核心机制,javascript可以及时向服务器提出请求和处理响应,而不阻塞用户。达到无刷新的效果。

工作原理:1.定义一个xmlHttp来引用创建的XMLHttpRequest;2.创建完XMLHTTPRequest对象后发出一个XMLHTTPRequest请求;5.例如通过属性设定回调函数,服务器处理完XMLHttpRequest并返回给浏览器,指派的回调方法将自动调用;

**总结:**XMLHttpRequest是完全用来向服务器发出请求的,它的作用是整个ajax实现的关键,ajax无非是两个过程,发出请求和响应请求。并且它完全是一种客户端的技术。而XMLHttpRequest正是处理了服务器端和客户端通信的问题所以才会如此的重要。

解释对象和类的区别

答:对象是由属性和方法组成的:是一个无序键值对的集合,指的是一个具体的事物

  • 属性:事物的特征,在对象中用属性来表示(常用名词)
  • 方法:事物的行为,在对象中用方法来表示(常用动词)

使用 class 关键字声明一个类,之后以这个类来实例化对象。类抽象了对象的公共部分(手机、明星),它泛指某一大类(class)对象特指某一个,通过类实例化一个具体的对象

解释面向对象和面向过程的区别

答: 面向过程就是分析出解决问题所需要的步骤,然后用函数把这些步骤一步一步实现,使用的时候再一个一个的依次调用就可以了。

​ 面向对象是把事务分解成为一个个对象,然后由对象之间分工与合作。

var、let、const的区别
  1. var定义的变量,没有块的概念,可以跨块访问, 不能跨函数访问。

  2. let定义的变量,只能在块作用域里访问,不能跨块访问,也不能跨函数访问。

  3. const用来定义常量,使用时必须初始化(即必须赋值),只能在块作用域里访问,而且不能修改。(面试题:const可改变里面的属性值,不改变const的指针)

    const person = {
    name : ‘jiuke’,
    sex : ‘男’
    }

    person.name = ‘test’ /可行


const person = {
name : ‘jiuke’,
sex : ‘男’
}

person = {
name : ‘test’,
sex : ‘男’
} /不可行

jQuery相较于js的优势
原生JS的缺点:

不能添加多个入口函数(window.onload),如果添加了多个,后面的会把前面的给覆盖
原生JS的API名字都太长太难记
原生JS有的时候会造成代码冗余
原生JS中有些方法或属性,有浏览器兼容问题
原生JS容错率比较低,前面的代码出了问题,后面的代码执行不了

jQuery的优势:

是可以写多个入口函数的
jQuery的API名字都容易记忆
jQuery的代码简洁(具有隐式迭代机制)
jQuery帮我们解决了浏览器兼容问题
容错率较高,前面的代码出了问题,后面的代码不受影响

软件开发流程:

1)需求分析:深入了解和分析需求,编写系统的功能需求文档。列出系统大致的大功能模块,大功能模块有哪些小功能模块,并且列出相关的界面和界面功能。

2)概要设计:确定系统的基本处理流程、系统的组织结构、模块划分、功能分配、接口设计、运行设计、数据结构设计和出错处理设计等,为详细设计提供基础。

3)详细设计:描述具体模块所涉及的主要算法、数据结构、类的层次结构及调用关系。保证软件的需求完全分配给整个软件。能够根据详细设计报告进行编码。

4)编码:根据详细设计报告进行编写程序工作,实现各模块功能。

5)测试:根据需求对功能进行测试。按照测试执行方,可分为内部测试和外部测试;按照测试范围,可分为模块测试和整体联调;按照测试条件,可分为正常操作情况测试和异常情况测试;按照测试的输入范围,可分为全覆盖测试和抽样测试。

6)软件交付:向客户提交开发的目标安装程序、数据库的数据字典、《用户安装手册》、《用户使用指南》、需求报告、设计报告、测试报告等双方约定的产物。

7)验收:客户验收。

8)维护:根据需求的变化或环境的变化,对程序进行全部或部分修改。

vue的生命周期:

beforeCreate( 创建前 )

在实例初始化之后,数据观测和事件配置之前被调用,此时组件的选项对象还未创建,el 和 data 并未初始化,因此无法访问methods, data, computed等上的方法和数据。

created ( 创建后 )

实例已经创建完成之后被调用,在这一步,实例已完成以下配置:数据观测、属性和方法的运算,watch/event事件回调,完成了data 数据的初始化,el没有。 然而,挂在阶段还没有开始, $el属性目前不可见,这是一个常用的生命周期,因为你可以调用methods中的方法,改变data中的数据,并且修改可以通过vue的响应式绑定体现在页面上,,获取computed中的计算属性等等,通常我们可以在这里对实例进行预处理,也有一些童鞋喜欢在这里发ajax请求,值得注意的是,这个周期中是没有什么方法来对实例化过程进行拦截的,因此假如有某些数据必须获取才允许进入页面的话,并不适合在这个方法发请求,建议在组件路由钩子beforeRouteEnter中完成

beforeMount(挂载前)

挂载开始之前被调用,相关的render函数首次被调用(虚拟DOM),实例已完成以下的配置: 编译模板,把data里面的数据和模板生成html,完成了el和data 初始化,注意此时还没有挂在html到页面上。

mounted(挂载后)

挂载完成,也就是模板中的HTML渲染到HTML页面中,此时一般可以做一些ajax操作,mounted只会执行一次。

beforeUpdate(更新前)

在数据更新之前被调用,发生在虚拟DOM重新渲染和打补丁之前,可以在该钩子中进一步地更改状态,不会触发附加地重渲染过程

updated(更新后)

在由于数据更改导致地虚拟DOM重新渲染和打补丁只会调用,调用时,组件DOM已经更新,所以可以执行依赖于DOM的操作,然后在大多是情况下,应该避免在此期间更改状态,因为这可能会导致更新无限循环,该钩子在服务器端渲染期间不被调用

beforeDestroy(销毁前)

在实例销毁之前调用,实例仍然完全可用,

  1. 这一步还可以用this来获取实例,
  2. 一般在这一步做一些重置的操作,比如清除掉组件中的定时器 和 监听的dom事件

destroyed(销毁后)

在实例销毁之后调用,调用后,所以的事件监听器会被移出,所有的子实例也会被销毁,该钩子在服务器端渲染期间不被调用

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值