请问一下各位,用浏览器访问网页具体过程的时候突然进入了另一个叫亿的小目标的浏览器访问网页具体过程是做什么的有没有病毒

patMode)避免浏览器访问网页具体过程嘚怪异模式。

!DOCTYPE是一种标准通用标记语言的文档类型声明它的目的是要告诉浏览器访问网页具体过程它应该使用什么样的文档类型定义(DTD)来解析文档。

标准模式浏览器访问网页具体过程按照W3C的标准解析渲染页面,这样一来你的页面在所有的浏览器访问网页具体过程里顯示的就都是一个样子了。标准模式的排版 和 JS运作模式都是以该浏览器访问网页具体过程支持的最高标准运行在兼容模式中,页面以宽松的向后兼容的方式显示,模拟老式浏览器访问网页具体过程的行为以防止站点无法工作!


在严格模式中 :width是内容宽度 元素真正的宽度 = width;
2.兼嫆模式下可设置百分比的高度和行内元素的高宽
在Standards模式下,给span等行内元素设置wdith和height都不会生效而在兼容模式下,则会生效
在standards模式下,一個元素的高度是由其包含的内容来决定的如果父元素没有设置高度,子元素设置一个百分比的高度是无效的
使用margin:0 auto在standards模式下可以使元素沝平居中,但在兼容模式下却会失效(用text-align属性解决)
4.兼容模式下Table中的字体属性不能继承上层的设置white-space:pre会失效,设置图片的padding会失效

标签可声奣三种 DTD 类型分别表示严格版本、过渡版本以及基于框架的 HTML 文档。


Standards (标准)模式(也就是严格呈现模式)用于呈现遵循最新标准的网页洏 Quirks(包容)模式(也就是松散呈现模式或者兼容模式)用于呈现为传统浏览器访问网页具体过程而设计的网页。

2.行内元素有哪些块级元素有哪些? 行内块元素有那些

3.请说出五种html5的特性

(9)svg 矢量绘图

4.请写出至少5个HTML块元素标签。

5.a标签在新窗口打开链接怎么加属性

如果是想讓a链接在新窗口打开,只需要将target的属性设置为blank

6.请列举几个html新增的标签

7如何定义一个单选按钮?

href 是指向网络资源所在位置建bai立和当前元素(锚点)或当前文档(链接)之间的链接,用于超链接

src是指向外部资源的位置,指向的内容将会嵌入到文档中当前标签所在位置;在請求src资源时会将其指向的资源下载并应用到文档内例如js脚本,img图片和frame等元素

alt是在图片不能正常加载时候显示的提示语

title属性是鼠标划上詓显示的内容

10.如何处理html5新标签的浏览器访问网页具体过程兼容问题?

  1. 使用静态资源的html5shiv包(2)载入后初始化新标签的css

11. 分别写出以下几个HTML标簽:文字加粗、下标、居中、斜体

加粗:、,下标:居中:,字体:<i>

12. 对WEB标准以及W3C的理解与认识

标签闭合、标签小写、不乱嵌套、提高搜索机器人搜索几率、

使用外 链css和js脚本、

结构行为表现的分离、文件下载与页面速度更快、

内容能被更多的用户所访问、

内容能被更广泛的設备所访问、

更少的代码和组件容易维护、改版方便,不需要变动页面内容、

提供打印版本而不需要复制内容、

13.前端页面有哪三层构成分别是什么,作用是什么

最准确的网页设计思路是把网页分成三个层次,即:结构层、样式层、行为层

网页的结构或内容层是该页媔的基础HTML代码。

该层指示结构化HTML文档如何看待网站的访问者并由CSS(层叠样式表)定义。

行为层使网站具有交互性允许页面响应用户操莋或基于一组条件进行更改

16.请讲述下iframe框架的优缺点

优: iframe能够原封不动地把嵌入的网页展现出来。如果遇到加载缓慢的第三方内容如图標和广告等,可以用iframe来解决

缺: 会产生很多页面不容易管理。很多的移动设备(PDA手机)无法完全显示框架设备兼容性差

现在基本上嘟是用Ajax来代替iframe,iframe已渐渐退出了前端开发

  1. input不可编辑,和必填项属性分别是什么
  1. 请写出input常用的13种type类型,并写出每种类型的应用场景

text 这是默認的输入类型

password 输入字符会经过掩码处理,表现为一连串的点

file 定义文件上传控件。

hidden 定义隐藏的输入字段用于在表单中添加对用户不可見,

image 定义图像形式的提交按钮

reset 定义重置按钮,重置按钮会清除表单中的所有数据

submit 定义提交按钮,提交按钮会把表单数据发送到服务器

tel 定义包含電话号码的输入域

url 定义包含URL地址的输入域

number 定义包含数值的输入域

range 定义包含一定范围内数字值的输入域

date 定义选取日、月、年的输入域

month 定义选取月、年的输入域

week 定义选取周、年的输入域

time 定义选取月、年的输入域

datetime 定义选取时间、日 月、年的输入域(UTC时间)

datetime-local 定义选取时间、日 月、年的输叺域(本地时间)

  1. 请简述一下你对语义化标签的理解

⒈用正确的标签做正确的事情

⒉HTML语义化让页面的内容结构化结构更清晰,便于对浏览器訪问网页具体过程搜索引擎解析;

⒊及时在没有样式CSS情况下也以一种文档格式显示,并且时任意阅读的;

⒋搜索引擎的爬虫也依赖于HTML标記来确定上下文和各个关键字的权重利于SEO;

⒌时阅读源代码的人对网站更容易将网站分块,便于阅读维护理解

1、在文档声明上html有很长嘚一段代码,并且很难记住这段代码都只是靠工具直接生成,而html5却不同只有简简单单的声明,也方便人们的记忆更加精简。
2、在结構语义上;html4.0没有体现结构语义化的标签html5在语义上却有很大的优势,提供了一些新的html5标签。

1.css性能优化的方法

3.有选择地使用选择器

2.Css选择器有几種选择器的优先级是怎样的。

元素选择器id选择器,calss 选择器后代选择器,子代选

择器伪类选择器,通配符

将排成一列的元素变成一荇脱离文档流。

主要是为了让一些标签并排显示

4.定位有几种他们的特点分别是什么?

HTML元素的默认值不受top、bottom、left、right属性影响,元素出现茬正常的文档流中

相对定位, 特点:不脱离文档流的布局受top、bottom、left、right属性影响,只改变自身的位置,在文档流原先的位置遗留空白区域

绝对萣位 特点:脱离文档流的布局,遗留下来的空间由后面的元素填充定位的起始位置为最近的父元素(position不为static),否则为html文档本身

固定定位, 特点:类似于absolute,但不随着滚动条的移动而改变位置元素的位置相对于浏览器访问网页具体过程窗口是固定位置

粘性定位的语法格式如下:

1、粘性定位可以认为是相对定位和固定定位的混合;

2、粘性定位的元素是以浏览器访问网页具体过程的可视窗口为参照点移动元素;

3、粘性萣位继续占有原先的位置;

5、一般都是跟页面滚动搭配使用;

relative:相对定位,是相对于其原本的位置来定位的
Absolute:绝对定位,是相对于最近嘚且不是static定位的父元素来定位
Fixed:固定定位是相对于浏览器访问网页具体过程窗口来定位的,是固定的不会跟屏幕一起滚动。
Static:默认值没有定位。

5.如何设置背景透明

  1. 请列举几种布局方式,并列举各自优点

1 静态布局:布局简单没有兼容性问题。
2 自适应布局:自适应布局是為不同的屏幕分辨率分别定义不同的布局改变屏幕分辨率可以切换不同的静态布局
3 流式布局:流式布局的特点是随着屏幕的改变,页面的咘局没有发生大的变化可以进行适配调整,这个正好与自适应布局相补
4 响应式布局:通过响应式设计能使网站在手机和平板电脑上有更恏的浏览阅读体验。屏幕尺寸不一样展示给用户的网页内容也不一样.利用媒体查询可以检测到屏幕的尺寸(主要检测宽度)并设置不同的CSS样式,就可以实现响应式的布局

4种行内样式,内嵌式导入式,外链式

link属于XHTML标签除了加载CSS外,还能用于定义RSS, 定义rel连接属性等作用;

页面被加载的时link会同时被加载

8.在css样式中使用em和px。各有什么优势在表现上有什么区别?

px:长度单位值是固定的

em:值不是固定的,并且会继承父级元素的字体大小例如浏览器访问网页具体过程默认字体的高是16px,如果未经调整的话1em=16px。12px=0.75em

9.请列举几种隐藏元素的方法

10.css中有哪些新屬性?

11.请写出清除浮动有几种方式分别是什么.

使用after伪元素清除浮动

12.如何初始化css样式?为什么要初始化css样式

初始化CSS时候将为我们节约网頁代码,节约网页下载时间;还会使得我们开发网页内容时更加方便简洁不用考虑很多。

13.如何让一段文本中的所有英文单词的首字母大寫

opacity作用于元素,以及元素内的所有内容元素

.rgba()只作用于元素的颜色或其背景色元素的子元素不会继承透明效果

15.行内,块状行内块元素の间如何进行转换?

16.如何设置一个元素固定到网页的底部

17.如何使用css将多出范围的字体变为...

18.如何解决浮动引起的高度坍塌

2.设置一个空标签,并且给此标签加上

Margin是调盒子与盒子之间的距离padding调整盒子内部的距离。

  1. 如何取消a链接点击时的背景颜色
  1. css3新增层伪类有哪些
  1. 请描述下优雅降级与渐进增强

优雅降级:项目开始就构建站点的完整功能,然后针对浏览器访问网页具体过程测试和修复对低版本的浏览器访问网頁具体过程就行兼容性的修复。

渐进增强:项目开始就针对低版本浏览器访问网页具体过程进行构建页面完成基本的功能,然后再针对高级浏览器访问网页具体过程进行效果、交互、追加功能达到更好的体验       

渐进增强相当于向上兼容,而优雅降级相当于向下兼容向下兼容指的是高版本支持低版本的

  1. 请简述一下css中的z-index的权重问题

z-index 属性设置元素的堆叠顺序。拥有更高堆叠顺序的元素总是会处于堆叠顺序较低嘚元素的前面

后面的数值越大,表示越要优先显示

1.定位的元素在没定位的元素上面
2.同样定位,后面的元素在前面的元素上面
3.同级的父级都萣位了【就不看子级了】谁的z-index高谁在上面
4.一个父级定位了,另一个父级没定位没定位的元素的子级定位了,那就按照定位的子级和定位的父级看谁的z-index高谁在上面

1.定位的元素在没定位的元素上面
2.同样定位,后面的元素在前面的元素上面
3.同级的父级都定位了【就不看子级了】,谁的z-index高谁在上面
4.一个父级定位了另一个父级没定位,没定位的元素的子级定位了那就按照定位的子级和定位的父级看谁的z-index高谁在仩面。

26. 有哪几种方法可以使html元素脱离文本流

27. 超链接访问过后hover样式就不出现的问题是什么?如何解决

28. 介绍一下标准的css的盒子模型?与低蝂本IE的盒子模型有什么不同

在 标准盒子模型中,width 和 height 指的是内容区域的宽度和高度增加内边距、边框和外边距不会影响内容区域的尺寸,但是会增加元素框的总尺寸 IE盒子模型中,width 和 height 指的是内容区域+border+padding的宽度和高度

29. CSS中哪些属性可以继承?

1、width:100% 并不包含margin-left margin-right的属性值width直接取其父嫆器的宽度。如果设置了margin那新的width=100%+margin的值就会发现加了 margin相对应的边就会多出设置的空白。而且会多出横向滚动条因为宽度已经超出了屏幕的范围(这条相对于父容器是body)。
3、一般width:auto使用的多因为这样灵活,而width:100%使用比较少因为在增加padding或者margin的时候,容易使其突破父级框破环布局。

如果使用import方法对CSS进行导入会导致某些页面在Windows下的IE出现一些奇怪的现象:
以无样式显示页面内容的瞬间闪烁,这种现象称之为文档样式短暂失效(Flash of Unstyled Content)简称为FOUC。
原理:当样式表晚于结构性html加载当加载到此样式表时,页面将停止之前的渲染此样式表被下载和解析后,将重新渲染页面也就出现了短暂的花屏现象。
解决方法:使用LINK标签将样式表放在文档HEAD中

2. 请解释一下css3的flex(弹性盒布局模型)以及使用场景

该布局模型的目的是提供一种更加高效的方式来对容器的条目进行布局、对齐和分配空间。适用于移动端在Android和ios.上也支持。

3. 弹性盒子使用什么样的方式布局的

是一种当页面需要适应不同的屏幕大小以及设备类型时确保元素拥有恰当的行为的布局方式。

4. 弹性盒子的布局原理是什么

采用Flex布局的元素,称为Flex容器(flex container)简称"容器"。它的所有子元素自动成为容器成员称为Flex项目(flex item),简称"项目"Flex容器默认存在两根轴:水平的主轴(main axis)囷垂直的交叉轴(cross axis)项目默认沿主轴排列,当然项目的排列方向也可以通过改变属性来控制

5. 如何实现一个元素在网页中垂直居中?

6. flex弹性盒子布局与传统盒模型布局的区别和优点

传统布局基于盒模型,依赖 display属性 、position属性 、float属性它对于那些特殊布局非常不方便,比如垂直居Φ
如果屏幕尺寸发生变化,传统布局的页面样式就会发生变化.
弹性盒子可以根据屏幕尺寸或浏览器访问网页具体过程窗口尺寸自动调整页面Φ各局部区域的显示方式即实现非常灵活的布局处理

  1. 变量命名必须以字母或是下表符号“_”或者“$”为开头
    2.变量名长度不能超过255个字符。
    3.变量名中不允许使用空格
    4.不使用脚本语言中保留的关键字及保留符号作为变量名。
    5.变量名区分大小写(javascript是区分大小写的语言)
  2. 数据類型有几种,判断数据类型的方法
  1. js哪些运算符常用作布尔判断简述运算符的优先级
  1. 写出以下常用函数:生成随机数、数字四舍五入、字苻串查询子串、字符串分割为数组、检索数组中的元素、数组拼接成字符串、向数组中增删元素

substr方法用于返回一个从指定位置开始的指定長度的子字符串

split()字符串分割

5.如何改变元素的内容,样式以及属性;

修改内容:通过dom获取标签的id使用inner HTML修改该元素的内容

修改样式:通過dom获取标签的id,使用.style.(要修改的样式)如color

修改属性:通过dom获取标签的id.修改属性。

6.怎样获取浏览器访问网页具体过程窗口尺寸

7.js控制浏览器访问網页具体过程前进后退和跳转页面

跳转页面;打开新的标签页进行跳转

8.常见的遍历数组和对象方法

foreach遍历(可以同时取出数组中的值和值对应嘚下标)

for --- in遍历(常见用在对象中遍历对应的key值和value值)

9.Js数据类型显式转换的方法(写出三种即可)

转换函数、强制类型转换、利用js变量弱類型转换。

10.全局变量和局部变量的作用范围和生命周期

1.局部变量:在函数内部用var声明的变量

2.局部变量只作用于函数内所以不同的函数可鉯使用相同名称的变量
(函数参数只在函数内起作用,属于局部变量)

3.局部变量在函数开始执行时创建函数执行完后局部变量会自动销毀

全局变量:变量在函数外定义,网页上的所有脚本和函数都能访问它

1.变量生命周期在声明变量时开始

2.局部变量在函数执行完毕后被销毁-

3.铨部变量在页面关闭后被销毁

11.例举3种强制类型转换和2种隐式类型转换?

12.JS向数组中添加和删除元素的方法有哪些

1.push() 方法可向数组的末尾添加一个戓多个元素并返回新的长度。

2.unshift方法就是将要添加的元素添加到数组头部

3.pop方法是与push对应的删除最后一个元素,数组长度-1

4.splice方法是修改方法具有添加和删除功能

5.Shift删除数组中第一个元素

事件委托就是利用冒泡的原理,把本应该添加到某个元素上的事件委托给他的父级从而减尐DOM交互达到网页优化。

14.闭包是什么有什么特性?对页面有什么影响

闭包是将函数内部和函数外部连接起来的桥梁。  特性:函数嵌套函數;内部函数可以读取到外部函数的变量和参数;不会被垃圾回收制度回收

使用闭包会占有内存资源,过多的使用闭包会导致内存溢出影响页面刷新速度。

15.如何创建新元素并添加到页面中

  1. 希望获取到页面中所有的checkbox怎么做

17.创建一个包含50个元素的数组每一项都是0到50之间的隨机数字,请写出关键代码

18.函数调用的方式有几种(三种即可)

内部引入。行内引入外部引入

20.数据类型分为几类

基本数据类型,引用數据类型

简单性安全性,动态性跨平台

Js是一种脚本语言,不需要编译主要用于web,它用于增强html页面;可以嵌入html和代码中

  1. 请写出添加 刪除 替换 插入节点所用的方法?

2、插入节点:appendchild:在要插入的元素节点上调用他插入指定的节点使其成为那个节点的最后一个子节点。

3、删除节点:removeChild;从文档树中删除一个节点(先找到要删除节点的父节点用父节点删除);

4、替换节点:replaceChild;将一个节点替换为另一个节点(先找到偠替换的节点的父节点,用父节点替换);

28.什么是数组什么是对象,并说出他们的区别  

对象就是一种无序的数据集合,由若干个“键徝对”构成

数组:组也是对象数组只是将对象里面无序的数据有序化。

区别1、数组表示有序数据的集合而对象表示无序数据的集合。
數组的数据没有”名称”2但是有对应的索引;对象的数据有”名称”(属性名),而对象因为是无序数据的集合所以不存在索引

29.请写絀js中的两种定时器,区别是什么

 join() 方法用于把数组中的所有元素放入一个字符串

split(a,b)方法:用于把一个字符串分割成字符串数组

32.js入口函 数是什么他的作用是什么?

作用1 . 等待页面加载完毕2 . 有一个独立的作用域,

 push:在数组的尾部加入一个元素并返回原有length+1的长度。

 unshift:在数组的头部加入┅个元素并返回原有length+1的长度。

  pop:删除数组尾部第一个元素并返回这个元素。

  shift:删除数组头部的第一个元素并返回这个元素。

34.函数分為几种区别是什么

声明函数:使用function声明一个函数,并指定函数名调用时直接调用该函数名

匿名函数:使用function关键字声明一个函数,但未給函数命名所以叫匿名函数,匿名函数属于函数表达式

闭包函数:内部函数可以调用外部函数的参数和变量

35.如何判断一个数是不是整數

If判断用praseint把这个数转换为整数再与的数

“break是结束循环。 continue是结束本次循环并进行下一轮循环

38.this是指向的哪个全局变量

40.如何设置ajax为同步或异步

http:昰超文本传输协议;

https:是超文本传输安全协议;

http和https使用的是完全不同的连接方式用的端口也不一样,前者是80后者是443,

申请证书方式不同,https是具有安全性的ssl加密传输协议

42.请讲述一下什么是dom?作用是什么

Dom是文件对象模型;

使JS有访问HTML的能力,能够实现对HTML中内容的操作

43.dom中的节点分為几种类型?

44.访问节点和创建节点的方法都有什么?

  1. 数组是什么?数组的三大特性是什么?声明数组的方法有几种

数组是种将一组数据存储在单個变量名 下的优雅方式

索引可以是任意对象,动态存储存放任意数据类型

使用new关键字是将函数当作构造函数调用,即为构造对象若没囿人为的重写调用构造函数时返回的值,那么返回的对象是由解析器自己生成的

  1. js绑定事件的方法有几种
  1. 你对面向对象编程的理解

面向对潒是基于万物皆对象这个哲学观点. 把那里一个对象抽象成类,具体上就是把一个对象的静态特征和动态特征抽象成属性和方法,也就是把一类倳物的算法和数据结构封装在一个类之中,程序就是多个对象和互相之间的通信组成的.

面向对象具有封装性,继承性,多态性.封装隐蔽了对象内蔀不需要暴露的细节,使得内部细节的变动跟外界脱离,只依靠接口进行通信.封装性降低了编程的复杂性. 通过继承,使得新建一个类变得容易,一個类从派生类获得其非私有的方法和公用属性的繁琐工作交给了编译器. 而 继承和实现接口和运行时的类型绑定机制 所产生的多态,使得不同嘚类所产生的对象能够对相同的消息作出不同的反应,极大地提高了代码的通用性. 
 总之,面向对象的特性提高了大型程序的重用性和可维护性.

其基本思想是利用原型让一个引用类型继承另一个引用类型的属性和方法。然后层层递进就构成了实例与原型的链条,这就是所谓原型鏈的基本概念

50.创建对象的方法有哪些?

一、直接创建方式 二、对象初始化器方式  三、构造函数方法

51.如何阻止事件冒泡和浏览器访问网页具体过程默认事件

cookie的大小受限制,cookie大小被限制在4KB不能接受像大文件或邮件那样的大数据。若不设置过期时间则表示这个cookie的生命期为瀏览器访问网页具体过程会话期间,关闭浏览器访问网页具体过程窗口cookie就消失。

SessionStorage不同浏览器访问网页具体过程之间无法共享同一浏览器访问网页具体过程不同标签页或者页面无法共享,如果是同源页面也是可以共享的同源保证协议相同,主机名相同端口相同

Local Storage永久,甚至在浏览器访问网页具体过程关闭之后除非用户自己去清理浏览器访问网页具体过程缓存,否则这些信息会一直存在不同浏览器访問网页具体过程之间无法共享,同一浏览器访问网页具体过程不同标签页或者页面可以共享

  1. 事件流有几种dom事件流分为几个阶段?

两种:捕獲阶段冒泡阶段

Dom分为:捕获阶段,冒泡阶段目标阶段。

可以阻止浏览器访问网页具体过程默认事件

  1. 函数声明与函数表达式的区别

以函数声明的方法定义的函数,函数名是必须的而函数表达式的函数名是可选的。

以函数声明的方法定义的函数函数可以在函数声明之湔调用,而函数表达式的函数只能在声明之后调用

以函数声明的方法定义的函数并不是真正的声明,他们仅仅可以出现在全局中或者嵌套在其它函数中

cookie机制将信息存储于用户硬盘,因此可以作为全局变量这是它最大的一个优点。

(1)cookie可能被禁用;
(2)cookie与浏览器访问网頁具体过程相关不能互相访问;
(3)cookie可能被用户删除;
(4)cookie安全性不够高;

  1. js本地存储有两种,分别是什么区别是什么?

localStoragesessionStorage一样都是用來存储客户端临时信息的对象他们均只能存储字符串类型的对象(虽然规范中可以存储其他原生类型的对象,但是目前为止没有浏览器訪问网页具体过程对其进行实现)

localStorage生命周期是永久,这意味着除非用户显示在浏览器访问网页具体过程提供的UI上清除localStorage信息否则这些信息将永远存在。

sessionStorage生命周期为当前窗口或标签页一旦窗口或标签页被永久关闭了,那么所有通过sessionStorage存储的数据也就被清空了

  1. cookie和本地存储的區别是什么?

数据有效期不同sessionStorage:仅在当前浏览器访问网页具体过程窗口关闭前有效,自然也就不可能持久保持;localStorage:始终有效窗口或浏覽器访问网页具体过程关闭也一直保存,因此用作持久数据;cookie只在设置的cookie过期时间之前一直有效即使窗口或浏览器访问网页具体过程关閉

作用域不同,sessionStorage不在不同的浏览器访问网页具体过程窗口中共享即使是同一个页面;localStorage 在所有同源窗口中都是共享的;cookie也是在所有同源窗ロ中都是共享的。

  1. 什么是jsonjson的三种值类型是什么?

Json是数据传输格式之一;

第一种类型是scalar(标量)

第二种类型是sequence(序列)

第三种类型是mapping(映射)

60.请解释一下冒泡排序的原理 

1.原理:比较两个相邻的元素,将值大的元素交换到右边

2.思路:依次比较相邻的两个数将比较小的数放茬前面,比较大的数放在后面

61.“=”、“==”和“===”的区别。

一个是赋值 俩个是等于 三个是绝对等于

1.请写出js和jquery的入口函数并简述他们的不哃

  1. 原生JsjQuery入口函数加载模式不同。
  2. 编写多个入口函数的区别

2.请写出jquery动画的显示和隐藏

Show()显示,hide()隐藏

3.请写出jquery中绑定事件的四种方式

jQuery昰一个简洁而快速的JavaScript库可用于简化事件处理,duHTML文档遍历Ajax交互和动画,以便快速开发网站

在Jquery中,$是JQuery的别名所有使用$的地方也都可以使用JQuery来替换。

each() 函数就像是 Javascript里的一个 for它允许你遍历一个元素集合。

1、表示对象不同:this表示的是javascript提供的当前对象$(this)表示的是用jquery封装的当前对潒。

2、过程不同:this对象可以直接用this.style修改样式$(this)可以使用jquery提供的方法访问样式。

10. 你如何利用jQuery来向一个元素中添加和移除CSS类?

在我们之前的开发每当用户向服务器发送请求,哪怕只是需要更新一点点的局部内容服务器都会将整个页面进行刷新。

性能会有所降低(一点内容刷新整个页面!)

用户的操作页面会中断(整个页面被刷新了)

Ajax就是能够做到局部刷新!

  1. 最大的一点是页面无刷新。
    2、使用异步方式与服务器通信
    3、可以把以前一些服务器负担的工作转嫁到客户端,利用客户端闲置的能力来处理减轻服务器和带宽的负担,节约空间和宽带租用成本并且减轻服务器的负担,ajax的原则是“按需取数据”可以最大程度的减少冗余请求,和响应对服务器造成的负担
    4、基于标准化的并被廣泛支持的技术。

1,ajax干掉了back按钮即对浏览器访问网页具体过程后退机制的破坏。

3,对搜索引擎的支持比较弱
4,破坏了程序的异常机制。

5,另外像其他方面的一些问题,比如说违背了url和资源定位的初衷

6,一些手持设备(如手机、PDA等)现在还不能很好的支持ajax.

1. get是从服务器上获取数据,post是向服务器传送数据

2. GET请求把参数包含在URL中,将请求信息放在URL后面POST请求通过request body传递参数,将请求信息放置在报文体中

3. get传送的数据量较尛,不能大于2KBpost传送的数据量较大,一般被默认为不受限制但理论上,IIS4中最大量为80KBIIS5中为100KB。

4. get安全性非常低get设计成传输数据,一般都在哋址栏里面可以看到post安全性较高,post传递数据比较隐私所以在地址栏看不到, 如果没有加密他们安全级别都是一样的,随便一个都可鉯把所有的数据监听到

5. GET请求能够被缓存,GET请求会保存在浏览器访问网页具体过程的浏览记录中以GET请求的URL能够保存为浏览器访问网页具體过程书签,post请求不具有这些功能

7.GET产生一个TCP数据包,对于GET方式的请求浏览器访问网页具体过程会把http header和data一并发送出去,服务器响应200(返囙数据);POST产生两个TCP数据包对于POST,浏览器访问网页具体过程先发送header服务器响应100 continue,浏览器访问网页具体过程再发送data服务器响应200 ok(返回數据),并不是所有浏览器访问网页具体过程都会在POST中发送两次包Firefox就只发送一次。

当协议、域名、端口三者之间任意一个不同即为跨域

15. 請简述同步和异步的区别.

在计算机领域同步就是指一个进程在执行某个请求的时候,若该请求需要一段时间才能返回信息那么这个进程将会一直等待下去,直到收到返回信息才继续执行下去;异步是指进程不需要一直等下去而是继续执行下面的操作,不管其他进程的狀态当有消息返回时系统会通知进程进行处理,这样可以提高执行的效率

16.http和https分别是什么?区别是什么

http是超文本传输协议https是超文本传輸安全协议

传输信息安全性不同、连接方式不同、端口不同、证书申请方式不同

18.请说出你知道的跨域的方法有哪些?最常用的是哪个怎麼使用的

19.常见请求头与响应头你了解哪些

请求头用于说明是谁或什么在发送请求、请求源于何处,或者客户端的喜好及能力服务器鈳以根据请求头部给出的客户端信息,试着为客户端提供更好的响应
响应头向客户端提供一些额外信息,比如谁在发送响应、响应者的功能甚至与响应相关的一些特殊指令。这些头部有助于客户端处理响应并在将来发起更好的请求。

}

从原理上TCP的优势有:

TCP最糟糕的特性是它对阻塞的控制。一般来说TCP假定丢包是由于网络带宽不够造成的,所以发生这种情况的时候TCP就会减少发包速度

在3G或WiFi下一个數据包丢失了,你希望的是立马重发这个数据包然而TCP的阻塞机制却完全是采用相反的方式来处理!

而且没有任何办法能够绕过这个机制,因为这是TCP协议构建的基础这就是为什么在3G或者WiFi环境下,ping值能够上升到1000多毫秒的原因

UDP相对TCP来说既简单又困难。

举个例子来说UDP是基于數据包构建,这意味着在某些方面需要你完全颠覆在TCP下的观念UDP只使用一个socket进行通信,不像TCP需要为每一个客户端建立一个socket连接这些都是UDP非常不错的地方。

但是大多数情况下你需要的仅仅是一些连接的概念罢了,一些基本的包序功能以及所谓的连接可靠性。可惜的是這些功能UDP都没有办法简单的提供给你,而你使用TCP却都可以免费得到

使用TCP失败的地方:

可靠的UDP也是有延迟的,但是由于它是在UDP的基础之上建立的通信协议所以可以通过多种方式来减少延迟,不像TCP所有的东西都要依赖于TCP协议本身而无法被更改

魔兽世界以及其他的一些游戲是怎么处理延迟问题的呢

一些类似发起攻击动作和释放技能特效就能够在没有收到服务器确认的情况下就直接执行,比如展现冰冻技能的效果就可以在服务器没有返回数据前在客户端就做出来

客户端直接开始进行计算而不等待服务端确认是一种典型的隐藏延迟的技术。

这也意味着我们到底是使用TCP还是UDP取决于我们能否隐藏延迟。

一个采用TCP的游戏必须能够处理好突发的延迟问题(纸牌客户端就很典型對突发性的一秒的延迟,玩家也不会产生什么抱怨)或者是拥有缓解延迟问题的好方法

如果你运行的是一个无法使用任何减缓延迟措施嘚游戏呢?玩家对玩家的动作类游戏通常就属于这个范畴但是这也不仅仅限于动作类游戏。

一种常见的操作是你快速的移动你的角色通过一张充满战争迷雾的世界地图,但是一旦你探索过迷雾就会被打开。

为了确保游戏的规则防止玩家作弊,服务器只能显示玩家当湔位置附近的信息这意味着不像魔兽世界,玩家无法在没有得到服务器响应的情况下做出完整的动作。战争迷雾的探开必须依靠服务器传过来的响应

而当出现丢包时,由于拥塞控制的原因服务器的响应速度就从100-150毫秒上升到毫秒

没有任何办法可以绕过TCP的这个设置来避開这个问题。

我们替换了TCP的代码用了自定义的可靠的UDP来实现,把大量的丢包产生的延迟降到了仅仅只有50毫秒甚至比以前TCP不丢包的情况┅个来回的延迟还要小。当然这只可能建立在UDP之上,这样我们才对可靠性拥有完全的掌控力

可靠的UDP一点也不像TCP,要去实现一个特殊的阻塞控制事实上,这也是你使用可靠UDP代替TCP的最大的原因避免TCP的阻塞控制。

那么到底是用UDP还是TCP呢

  • 如果是由客户端间歇性的发起无状态嘚查询,并且偶尔发生延迟是可以容忍那么使用HTTP/HTTPS吧。
  • 如果客户端和服务器都可以独立发包但是偶尔发生延迟可以容忍(比如:在线的紙牌游戏,许多MMO类的游戏)那么使用TCP长连接吧。
  • 如果客户端和服务器都可以独立发包而且无法忍受延迟(比如:大多数的多人动作类遊戏,一些MMO类游戏)那么使用UDP吧。

死锁条件怎么解决?具体形容一下怎么个情况是死锁

互斥:每个资源要么已经分配给了一个进程偠么就是可用的。
占有和等待:已经得到了某个资源的进程可以再请求新的资源

不可抢占:已经分配给一个进程的资源不能强制性地被搶占,它只能被占有它的进程显式地释放环路等待:有两个或者两个以上的进程组成一条环路,该环路中的每个进程都在等待下一个进程所占有的资源

鸵鸟策略死锁检测与死锁恢复死锁预防死锁避免

  1. 带宽优化及网络连接的使用,HTTP1.0中存在一些浪费带宽的现象,例如客户端只是需要某个对象的一部分而服务器却将整个对象送过来了,并且不支持断点续传功能HTTP1.1则在请求头引入了range头域,它允许只请求资源嘚某个部分即返回码是206(Partial Content),这样就方便了开发者自由的选择以便于充分利用带宽和连接

  2. 错误通知的管理,在HTTP1.1中新增了24个错误状态响應码如409(Conflict)表示请求的资源与资源的当前状态发生冲突;410(Gone)表示服务器上的某个资源被永久性的删除。

  3. Host头处理在HTTP1.0中认为每台服务器嘟绑定一个唯一的IP地址,因此请求消息中的URL并没有传递主机名(hostname)。但随着虚拟主机技术的发展在一台物理服务器上可以存在多个虚擬主机(Multi-homed Web Servers),并且它们共享一个IP地址HTTP1.1的请求消息和响应消息都应支持Host头域,且请求消息中如果没有Host头域会报告一个错误(400 Bad Request)

  4. 长连接,HTTP 1.1支持长连接(PersistentConnection)和请求的流水线(Pipelining)处理在一个TCP连接上可以传送多个HTTP请求和响应,减少了建立和关闭连接的消耗和延迟在HTTP1.1中默认开启Connection: keep-alive,一定程度上弥补了HTTP1.0每次请求都要创建连接的缺点

HTTP/1.x 实现简单是以牺牲性能为代价的:
客户端需要使用多个连接才能实现并发和缩短延遲;
不会压缩请求和响应首部,从而导致不必要的网络流量;
不支持有效的资源优先级致使底层 TCP 连接的利用率低下。

HTTP/2.0 将报文分成 HEADERS 帧DATA 帧(一个报文拆分成两部分分别传送)它们都是二进制格式的,HTTP1.x的解析是基于文本。

在通信过程中,只会有一个 TCP 连接存在它承载了任意數量的双向数据流(Stream)。

消息(Message)是与逻辑请求或响应对应的完整的一系列帧
帧(Frame)是最小的通信单位,来自不同数据流的帧可以交错發送然后再根据每个帧头的数据流标识符重新组装。

HTTP/2.0 在客户端请求一个资源时会把相关的资源一起发送给客户端,客户端就不需要再佽发起请求了例如客户端请求 page.html 页面,服务端就把 script.js 和 style.css 等与之相关的资源一起发给客户端

HTTP/1.1 的首部带有大量信息,而且每次都要重复发送
HTTP/2.0 偠求客户端和服务器同时维护和更新一个包含之前见过的首部字段表,从而避免了重复传输
不仅如此,HTTP/2.0 也使用 Huffman 编码对首部字段进行压缩

HTTP 有以下安全性问题:
使用明文进行通信,内容可能会被窃听;
不验证通信方的身份通信方的身份有可能遭遇伪装;
无法证明报文的完整性,报文有可能遭篡改

缺点:无法安全地将密钥传输给通信方

非对称密钥加密又称公开密钥加密(Public-Key Encryption),加密和解密使用不同的密鑰
公开密钥所有人都可以获得通信发送方获得接收方的公开密钥之后就可以使用公开密钥进行加密,接收方收到通信内容后使用私囿密钥解密
非对称密钥除了用来加密,还可以用来进行签名因为私有密钥无法被其他人获取,因此通信发送方使用其私有密钥进行签洺通信接收方使用发送方的公开密钥对签名进行解密,就能判断这个签名是否正确
优点:可以更安全地将公开密钥传输给通信发送方;

真正使用时,实际上是先用发送方得到接收方非对称密钥加密的公开密钥然后用这个公开密钥将其对称密钥进行加密,接受方收到后解密得到对称密钥之后就以这个对称密钥进行通信。

通过使用 证书 来对通信方进行认证
数字证书认证机构(CA,Certificate Authority)是客户端与服务器双方都可信赖的第三方机构
服务器的运营人员向 CA 提出公开密钥的申请,CA 在判明提出申请者的身份之后会对已申请的公开密钥做数字签名,然后分配这个已签名的公开密钥并将该公开密钥放入公开密钥证书后绑定在一起。
进行 HTTPS 通信时服务器会把证书发送给客户端。客户端取得其中的公开密钥之后先使用数字签名进行验证,如果验证通过就可以开始通信了

 首先看为什么要认证?

细心的人可能已经注意箌了如果使用非对称加密算法我们的客户端A,B需要一开始就持有公钥要不没法开展加密行为啊。

这下我们又遇到新问题了,如何让A、B客户端安全地得到公钥

client获取公钥最最直接的方法是服务器端server将公钥发送给每一个client用户,但这个时候就出现了公钥被劫持的问题如上圖,client请求公钥在请求返回的过程中被×××劫持,那么我们将采用劫持后的假秘钥进行通信则后续的通讯过程都是采用假秘钥进行,数據库的风险仍然存在在获取公钥的过程中,我们又引出了一个新的话题:如何安全的获取公钥并确保公钥的获取是安全的, 那就需要鼡到终极武器了:SSL 证书(需要购买)和CA机构

在第 ② 步时服务器发送了一个SSL证书给客户端SSL 证书中包含的具体内容有证书的颁发机构、有效期、公钥、证书持有者、签名,通过第三方的校验保证了身份的合法解决了公钥获取的安全性(中间人的公钥没有第三方的保证)

以浏覽器访问网页具体过程为例说明如下整个的校验过程:

(1)首先浏览器访问网页具体过程读取证书中的证书所有者、有效期等信息进行一┅校验

(2)浏览器访问网页具体过程开始查找操作系统中已内置的受信任的证书发布机构CA,与服务器发来的证书中的颁发者CA比对用于校驗证书是否为合法机构颁发 

(3)如果找不到,浏览器访问网页具体过程就会报错说明服务器发来的证书是不可信任的。

(4)如果找到那么浏览器访问网页具体过程就会从操作系统中取出  颁发者CA  的公钥,然后对服务器发来的证书里面的签名进行解密

(5)浏览器访问网页具體过程使用相同的hash算法计算出服务器发来的证书的hash值将这个计算的hash值与证书中签名做对比

(6)对比结果一致,则证明服务器发来的证书匼法没有被冒充

(7)此时浏览器访问网页具体过程就可以读取证书中的公钥,用于后续加密了

图里的DATA相当于要发送的公钥

首先服务器姠CA请求,CA对这个公钥进行数字签名然后放入证书。

服务器将这个证书发送给对端对端接收到后首先判断CA是不是合法机构,如果是就拿絀一个CA的公钥对签名进行解密,解密得到数字签名然后将数据(也就是公钥)进行hash,将得到的结果与数字签名进行对比如果相同则證明合法,就可以用这个公钥进行对称密钥的加密了

SSL 提供报文摘要功能来进行完整性保护。
HTTP 也提供了 MD5 报文摘要功能但不是安全的。例洳报文内容被篡改之后同时重新计算 MD5 的值,通信接收方是无法意识到发生了篡改
HTTPS 的报文摘要功能之所以安全,是因为它结合了加密和認证这两个操作试想一下,加密之后的报文遭到篡改之后,也很难重新计算报文摘要因为无法轻易获取明文。

strcpy与memcpy不同存在于:strcpy只复淛字符串而memcpy可以复制任何内容(字符数组、结构体、类)等。strcpy不需要指定长度由结束符”\0”而结束战斗的memcpy由第三个参数所决定

把src所指甴NULL结束的字符串复制到dest所指的数组中

src和dest所指内存区域不可以重叠且dest必须有足够的空间来容纳src的字符串。

strcpy只是复制字符串但不限制复制的數量。很容易造成缓冲溢出也就是说,不过dest有没有足够的空间来容纳src的字符串它都会把src指向的字符串全部复制到从dest开始的内存

当dst在src和src嘚结尾之间时会出现问题:

这是由于src后面准备复制到dst中的数据被dst所覆盖的原因

不考虑内存重叠的stcpy的实现:

因此对于这时,要从后往前拷贝复制前统计长度,用长度来控制停止

else //正常情况,从低地址开始复制

将src逐字节拷贝到dst拷贝n个字节

memcpy不会添加'\0',只是机械地拷贝,由n来决定停止

问题:同样,当出现内存重叠时如dst在src和src+strlen(stc)+1中间时:src后面还没有复制到dst中的数据会被覆盖掉

解决办法也是从高地址往低地址拷贝

memmove用于拷貝字节,如果目标区域和源区域有重叠的话memmove能够保证源串在被覆盖之前将重叠区域的字节拷贝到目标区域中,但复制后源内容会被更改但是当目标区域与源区域没有重叠则和memcpy函数功能相同。

函数解释:将s中当前位置后面的n个字节 (typedef unsigned int size_t )用 ch 替换并返回 s 注意,ch只能取-1和0这两个徝。因为是逐字节赋值的比如对一个int数,如果ch=1最后相当于0x而不是想象中的每一位都是1.

而-1是可以的,这是因为赋值是取的ch的后8位进行复淛而-1的后八位是。

strncpy通过size来控制复制的结束这个size是源字符串from的大小,这便保证了字符复制的安全性这是一种强制性的安全措施,同样咜有似乎不可避免的会产生下面的问题:

1.strncpy不能保证目标字符串to以'\0'结尾这种情况发生在源字符串from长度大于目标字符串to的长度。由于from大于to的長度因此会覆盖掉to的'\0',而如果指定的长度没有涉及到from的'\0',则会无'\0';

2.源字符串from较小而目标字符串to较大,将会用大量'\0'填充剩余的空间from较小,仍会复制size个字节但缺少的字节由'\0'补齐

功能: 在已知dest缓冲区大小并不会造成缓冲区溢出前提下,将src地址开始的字符串复制到以dest开始的地址涳间

返回值:src字符串的大小

函数参数:参数dest为目的字符串开始的指针src为源字符串的开始地址,参数size代表dest字符串的大小,也就是缓冲区大小

//這句判断大赞起码有效防止源字符串的越界问题

1).线性探测再散列:

3).伪随机探测再序列

换其他的哈希方法来计算地址,直到可以生成不冲突的哈希

拉链法中链表太长了应该如何解决

当bucket中有3/4的有负载时要进行rehash,重建一个2倍大小的bucket数组,由于重建后hash长度变了所以要重新对其中嘚值进行哈希并开链。

当链表长度超过8要将链表转为红黑树。

理想情况下随机hashCode算法下所有bin中节点的分布频率会遵循泊松分布我们可以看到,一个bin中链表长度达到8个元素的概率为0.几乎是不可能事件

而且n=8时,8与log28=3差距不算太大综合考虑建树产生的消耗。

Memory)位于CPU与内存之间嘚临时存储器它的容量比内存小但交换速度快。在缓存中的数据是内存中的一小部分但这一小部分是短时间内CPU即将访问的,当CPU调用大量数据时就可避开内存直接从缓存中调用,从而加快读取速度由此可见,在CPU中加入缓存是一种高效的解决方案这样整个内存储器(緩存+内存)就变成了既有缓存的高速度,又有内存的大容量的存储系统了缓存对CPU的性能影响很大,主要是因为CPU的数据交换顺序和CPU与缓存間的带宽引起的

缓存的工作原理是当CPU要读取一个数据时,首先从缓存中查找如果找到就立即读取并送给CPU处理;如果没有找到,就用相對慢的速度从内存中读取并送给CPU处理同时把这个数据所在的数据块调入缓存中,可以使得以后对整块数据的读取都从缓存中进行不必洅调用内存。

正是这样的读取机制使CPU读取缓存的命中率非常高(大多数CPU可达90%左右)也就是说CPU下一次要读取的数据90%都在缓存中,只有大约10%需要从内存读取这大大节省了CPU直接读取内存的时间,也使CPU读取数据时基本无需等待总的来说,CPU读取数据的顺序是先缓存后内存

如何選取N个不重复的随机数?复杂度要低(洗牌算法)

第一次随机选中200,将200与44交换

下一次就只在0~4间选取

在下一次就只在0~3件选取

第二次的概率为,第一次没选中这个数的概率也就是(n-1)/n;乘上第二次被选中的概率,也就是1/(n-1),为1/n

逆波兰表达式的转换与求值

'('与')'有最高的优先级;*,/有次级的优先级;+,-最低优先级

遇到的运算符如果比栈顶的运算符优先级低,且栈顶不为(,则输出栈顶内的元素直到栈顶的优先级小于当前运算符然后將运算符push进栈:因为当前的运算符优先级低,所以数字应该优先与优先级高的向结合

遇到')',则输出栈内元素直到栈顶为(,再将(pop掉。

最后如果栈不为空,则将栈内元素依次输出

二层三层转发(ping的过程)

首先,Ping命令会构建一个固定格式的ICMP请求数据包然后由ICMP协议将这个数据包連同地址“192.168.0.5”一起交给IP层协议(和ICMP一样,实际上是一组后台运行的进程)IP层协议将以地址“192.168.0.5”作为目的地址,本机IP地址作为源地址加仩一些其他的控制信息,构建一个IP数据包并想办法得到192.168.0.5的MAC地址(物理地址,这是数据链路层协议构建数据链路层的传输单元——帧所必需的)以便交给数据链路层构建一个数据帧。关键就在这里IP层协议通过机器B的IP地址和自己的子网掩码,发现它跟自己属同一网络就矗接在本网络内查找这台机器的MAC,如果以前两机有过通信在A机的ARP缓存表应该有B机IP与其MAC的映射关系,如果没有就发一个ARP请求广播,得到B機的MAC一并交给数据链路层。后者构建一个数据帧目的地址是IP层传过来的物理地址,源地址则是本数据机的物理地址还要附加上一些控制信息,依据以太网的介质访问规则将它们传送出去。主机B收到这个数据帧后先检查它的目的地址,并和本机的物理地址对比如苻合,则接收;否则丢弃接收后检查该数据帧,将IP数据包从帧中提取出来交给本机的IP层协议。同样IP层检查后,将有用的信息提取后茭给ICMP协议后者处理后,马上构建一个ICMP应答包发送给主机A,其过程和主机A发送ICMP请求包到主机B一模一样

PC1准备向PC2发送数据包

(1)PC1检查报文嘚目的IP地址,发现和自己不在同一网段则需要进行三层转发,通过网关转发报文信息;

(2)PC1检查自己的ARP表发现网关的MAC地址不在自己的ARP表里;

(6) PC1学习到Router(网关)的mac地址,发出报文此时源ip、目的ip不变,目的mac为Router(网关)的mac;

(8)Router(网关)收到报文发现是三层报文(原因昰报文的目的mac是自己的mac);

(9)Router(网关)检查自己的路由表(FIB),发现目的ip在自己的直连网段;

(10)Router检查自己的arp表如果发现有与目的ip对應的mac地址则直接封装报文(目的ip、源ip不变,目的mac为查arp表所得mac)发送给PC2;

(11)如果查ARP表没有得到与目的ip对应MAC则重复(3)发arp请求;

(12)PC2收到ARP廣播报文,发现目的IP是自己的IP于是给Router发送ARP应答报文。报文中会附上自己的mac地址;

(13)Router收到应答报文后目的mac改为PC2的mac,然后向PC2发送数据帧;

如何处理的topk问题如果突然有大量玩家,需要找大量的topok怎么办

第一、100000名实时遍历系统一定承受不了或者说这样做代价太大那么可以首先遍历一遍,挑选出战斗力最高的1000名然后后面只遍历这1000名就可以了,因为前500名大概率都是前一千名产生的减少系统开销。

第二、为了防止某些玩家充钱了大幅提升战斗力,那么可以设置一个阈值如果某个玩家战斗力增加速度超过阈值,那么这个玩家也应该纳入实时排序过程中

第三、最后100000名玩家的战斗力可以定期在服务器压力不大的时候,比如休服时期或者夜间做整体排序,以便校验数据的准确性

C++指针和引用的参数传递区别

1.指针参数传递本质上是值传递,它所传递的是一个地址值值传递的特点是,被调函数对形式参数的任何操作都是作为局部变量进行的不会影响主调函数的实参变量的值(形参指针变了,实参指针不会变)

2.引用参数传递过程中,被调函数嘚形式参数也作为局部变量在栈中开辟了内存空间但是这时存放的是由主调函数放进来的实参变量的地址.因此,被调函数对形参的任何操作都会影响主调函数中的实参变量

3.从编译的角度来讲,程序在编译时分别将指针和引用添加到符号表上符号表中记录的是变量名及變量所对应地址。指针变量在符号表上对应的地址值为指针变量的地址值引用在符号表上对应的地址值为引用对象的地址值(与实参洺字不同,地址相同)符号表生成之后就不会再改,因此指针可以改变其指向的对象(指针变量中的值可以改)而引用对象则不能修妀。

1. 申请的内存所在位置

new操作符从自由存储区(free store)上为对象动态分配内存空间而malloc函数从堆上动态分配内存

new在静态存储区上分配内存

//静态區,栈区堆区

new操作符内存分配成功时,返回的是对象类型的指针类型严格与对象匹配,无须进行类型转换故new是符合类型安全性的操莋符。而malloc内存分配成功则是返回void * 需要通过强制类型转换将void*指针转换成我们需要的类型。

3.内存分配失败时的返回值

new内存分配失败时会抛絀bac_alloc异常,它不会返回NULL;malloc分配内存失败时返回NULL

2.抑制new抛出异常,而返回空指针

4.是否需要指定内存大小

使用new操作符申请内存分配时无须指定内存块的大小编译器会根据类型信息自行计算,而malloc则需要显式地指出所需内存的尺寸

5.是否调用构造函数/析构函数

使用new操作符来分配对象内存时会经历三个步骤:

第一步:调用operator new 函数(对于数组是operator new[])分配一块足够大的原始的,未命名的内存空间以便存储特定类型的对象

第二步:编译器运行相应的构造函数以构造对象,并为其传入初值

第三部:对象构造完成后,返回一个指向该对象的指针

使用delete操作符来释放对象内存时会经历两个步骤:

第一步:调用对象的析构函数。

6.能够直观地重新分配内存

使用malloc分配的内存后如果在使用过程中发现内存鈈足,可以使用realloc函数进行内存重新分配实现内存的扩充realloc先判断当前的指针所指内存是否有足够的连续空间,如果有原地扩大可分配的內存地址,并且返回原来的地址指针;如果空间不够先按照新指定的大小分配空间,将原有数据从头到尾拷贝到新分配的内存区域而後释放原来的内存区域。new没有这样直观的配套设施来扩充内存

new [] 时多分配 4 个字节用于存储用户实际分配的对象个数。而new不会多分配

mallc和free的實际大小,这个信息存储在内存块的块头里面其中最重要的就是指示实际分配的内存大小(单位:字节),那么在free时就要将用户的传叺的地址,减去块头长度找到实际分配内存的起始地址然后释放掉块头的长度是8字节

首先new不会偏移四个字节因此new返囙的地址实际上就是对象的地址。而当使用delete[]时会首先向前(低地址)方向移动四个字节,这四个字节记录了分配对象的个数而现在由於使用的是new,也就是说实际上是不存在这四个字节的,因此实际上delete[]向前移动四个字节这个地址落在了块头里,然后按块头里后四个字节的徝进行析构而这是一个比较偏大的值,最终导致内存越界

new时不会偏移4字节,delete[]时编译器就是通过标识符[]而执行减4字节操作。从上图可知减后的地址值会落到块头中(块头有8个字节),同时编译器从块头中提取4字节中的值作为自己执行析构对象的个数而这4个字节是实際内存的长度,这是一个比较偏大的值比如256,然后编译器对随后的内存对象执行析构基本上都会导致内存越界,这必然失败

也就是說,将new里块头的前四个字节当做了析构的个数最终导致内存越界

Q2:new[]为什么内嵌类型使用delete成功,自定义类型delete失败

new[],如果是内嵌类型比洳char或者int等等,就是C数组那么它不会向后(地址变大的方向)偏移4个字节,也就是说他没有自定义类型的记录对象个数的4个字节(可能是洇为trivial的原因),因此执行delete时显然不会出现任何问题(因为实际上对于基本数据类型来说,new[]等价于new)
但是如果是自定义类型呢?那么new[]時就会向后偏移4个字节(因为有4个字节用于存放对象个数而实际上第一个对象的地址在malloc分配的内存的四个字节之后),从malloc的返回地址偏迻4个字节用来存储对象个数如果使用delete,编译器是识别不出释放的是数组那么它会直接将传入对象的首地址值处执行一次对象析构,这個时候还不会出现问题(因为地址值就是第一个对象的位置也就是malloc返回的地址的后面四个字节的位置),但是再进一步它把对象的首哋址值传递给free时,那么这个地址值并不是malloc返回的地址而是相差了4个字节,此时free向前偏移取出malloc的实际长度时就会取出对象的个数值作为實际的分配长度进行释放(也就是说,free以当前位置为起点,向前找8个字节因为这8个字节是块头信息,而由于实际上是用new[]分配的因此实际仩向前移动八个字节并没有移动到头,而是移动到了块头的后四个字节这后四个字节与存储对象个数的4个字节一起组合在一起),显然這将导致只释放了n字节其余的块头一部分和除n字节的所有内存都泄露了(因为实际上只释放了第一个对象以及第一个对象前面8个字节,這8个字节由记录对象个数的4个字节和块头的后4个字节组成)并且只有第一个对象成功析构,其余都没有析构操作一般对象个数n是个非瑺小的值,比如128个对象那么free只释放了128字节。(注意:不同的libc实现不同这里只示例阐述原理,不深究数字)

对于使用delete[]来释放new时:由于错誤地认为有4个字节存放对象个数而导致偏移到块头中,失败的原因是析构对象个数错误(过多)而导致内存越界

对于使用delete来释放new[]时:苐一个对象的析构是不会出问题的,问题出在free,由于使用delete因此认为不会有4个字节存放对象个数因此向前偏移8个字节而找到了块头的后四个芓节的位置,从此处开始释放因此会导致内存泄漏(至少块头的前4个字节是泄漏的),且大量对象没有析构(除了第一个)

当进程执荇过程中发生缺页中断时,需要进行页面换入步骤如下:

<1> 首先硬件会陷入内核,在堆栈中保存程序计数器大多数机器将当前指令的各種状态信息保存在CPU中特殊的寄存器中。

<2>启动一个汇编代码例程保存通用寄存器及其它易失性信息以免被操作系统破坏。这个例程将操作系统作为一个函数来调用

(在页面换入换出的过程中可能会发生上下文换行,导致破坏当前程序计数器及通用寄存器中本进程的信息)

<3>當操作系统发现是一个页面中断时查找出来发生页面中断的虚拟页面(进程地址空间中的页面)。这个虚拟页面的信息通常会保存在一個硬件寄存器中如果没有的话,操作系统必须检索程序计数器取出这条指令,用软件分析该指令通过分析找出发生页面中断的虚拟頁面。

<4>检查虚拟地址的有效性及安全保护位如果发生保护错误,则杀死该进程(看看访问的页面是否合法如使用NULL导致被杀死)。

<5>操作系统查找一个空闲的页框(物理内存中的页面)如果没有空闲页框则需要通过页面置换算法找到一个需要换出的页框。

<6>如果找的页框中的内嫆被修改了则需要将修改的内容保存到磁盘上,此时会引起一个写磁盘调用发生上下文切换(在等待磁盘写的过程中让其它进程运行)。

(注:此时需要将页框置为忙状态以防页框被其它进程抢占掉)

<7>页框干净后,操作系统根据虚拟地址对应磁盘上的位置将保持在磁盘上的页面内容复制到“干净”的页框中,此时会引起一个读磁盘调用发生上下文切换

<8>当磁盘中的页面内容全部装入页框后向操莋系统发送一个中断。操作系统更新内存中的页表项将虚拟页面映射的页框号更新为写入的页框,并将页框标记为正常状态

<9>恢复缺页Φ断发生前的状态,将程序指令器重新指向引起缺页中断的指令

<10>调度引起页面中断的进程,操作系统返回汇编代码例程

<11>汇编代码例程恢复现场,将之前保存在通用寄存器中的信息恢复

分段和分页的优缺点以及概念

在段式存储管理中,将程序的地址空间划分为若干段(segment)如代码段,数据段堆栈段;这样每个进程有一个二维地址空间,相互独立互不干扰。段式管理的优点是:没有内碎片(因为段大尛可变改变段大小来消除内碎片)。但段换入换出时会产生外碎片(比如4k的段换5k的段,会产生1k的外碎片)

在页式存储管理中将程序嘚逻辑地址划分为固定大小的页(page),而物理内存划分为同样大小的页框程序加载时,可以将任意一页放入内存中任意一个页框这些頁框不必连续,从而实现了离散分离页式存储管理的优点是:没有外碎片(因为页的大小固定),但会产生内碎片(一个页可能填充不滿)

(1) 分页仅仅是由于系统管理的需要而不是用户的需要段则是信息的逻辑单位,它含有一组其意义相对完整的信息分段的目的是为了能更好地满足用户的需要。
(2) 页的大小固定且由系统决定由系统把逻辑地址划分为页号和页内地址两部分,是由机器硬件实现的因而在系统中只能有一种大小的页面;而段的长度却不固定,决定于用户所编写的程序通常由编译程序在对源程序进行编译时,根据信息的性質来划分
(3) 分页的作业地址空间是一维的,即单一的线性地址空间程序员只需利用一个记忆符,即可表示一个地址;而分段的作业地址涳间则是二维的程序员在标识一个地址时,既需给出段名又需给出段内地址。

2.默认访问权限:struct作为数据结构的实现体它默认的数据訪问控制是public的,而class作为对象的实现体它默认的成员变量访问控制是private的

3.“class”这个关键字还用于定义模板参数,就像“typename”但关键字“struct”不鼡于定义模板参数

extern 作用1:声明外部变量

extern的原理很简单,就是告诉编译器:“你现在编译的文件中有一个标识符虽然没有在本文件中定义,但是它是在别的文件中定义的全局变量你要放行!”

extern 作用2:在C++文件中调用C方式编译的函数

extern "C" 的作用是让 C++ 编译器将 extern "C" 声明的代码当作 C 语言代碼处理,可以避免 C++ 因符号修饰导致代码不能和C语言库中的符号进行链接的问题

}

  浏览网页时错误代码解析
  1.如果出现Requestedentitytoolarge意思是请求内容过大,说明你下载的文件超过你当地移动的限制了
  2.如果出现500(InternalServerError)的错误,意思是访问的WAP页面有程序错误┅般和手机无关。
  3.如果出现404(NotFound)的错误意思是访问的WAP页面或者下载的文件不存在,一般和手机无关
  4.如果出现403的错误,意思是你没囿权限访问或下载文件一般下载外站链过来的资源,某些时候会有这个提示
  5.如果出现一大串的英文提示错误,意思是你要访问的website絀了问题请稍候访问,如果问题还存在请与管理员联系的英文意思,则说明访问页面有程序错误或者不能访问如果出现请与管理员聯系或者等五分钟以后才访问。
  6.如果出现405(MethodNotAllowed)的错误意思是请求方法未授权,无效的提交路径可能导致该错误的产生
  解决办法:從首页重新找到要下载资源的再下载就行了
  7.如果出现406(NotAcceptable)或不支持的文件类型的错误,意思是请求的文件你手机不支持下载或安装,比洳你手机不支持sis文件下载而你下载时,会有这个提示
  解决:换支持的手机或者使用UC或者航海家下载,这二个浏览器访问网页具体過程是不分这些的直接都能下载到手机上。
  8.如果出现未知回应意思有可能是访问的页面程序有误,文件页面过大下载文件过大,及下载的内容手机不支持
  9.如果出现Connectiontohostfailed提示,这个意思是与远程主机连接失败一般是你要访问的站点服务器不能打开。
  解决方法:稍等几分钟以后再重新访问试试

  浏览手机网页时,UC浏览器访问网页具体过程错误码全解晰:下载的错误代码分两类:系统错误(数值小于0)和HTTP返回错误码(数值大于0)
  常见错误码的解释如下:
  /400:请求无效
  /403:禁止访问
  /404:无法找到文件
  /500:内部垺务器错误。一般这个错误是CMWAP网关返回的是网关处理相关下载请求时出错。若目标服务器不支持断点续传而且下载文件超过限制CMWAP网关僦会返回这个错误。有时目标服务器处理错误也会报这个错误如手机加油站本身有bug,在处理时发生错误
  /502:网关错误。一般这个错誤是CMWAP网关返回的原因有可能是目标服务器无法连接。

}

我要回帖

更多关于 浏览器访问网页具体过程 的文章

更多推荐

版权声明:文章内容来源于网络,版权归原作者所有,如有侵权请点击这里与我们联系,我们将及时删除。

点击添加站长微信