任何一个默认值参数()都不能再出现没有默认值的普通位置参数?

更多“定义函数时,带有默认值的参数必须出现在参数列表的最右端,任何一个带有默认值的参数右边不允许出”相关的问题

A.正确B.错误此题为判断题(对,错)。请帮忙给出正确答案和分析,谢谢!

对具有多个形参的函数的一个或多个参数指定默认值时,指定默认值的参数必须放在参数列表中的最右边。()

下面C++带有默认参数函数的叙述,正确的是()。A.不允许设置函数的默认值B.函数的默认值只能有一

下面C++带有默认参数函数的叙述,正确的是()。

A.不允许设置函数的默认值

B.函数的默认值只能有一个

C.函数的默认值应该先设置右边然后再设置左边

D.函数的默认值应该先设置左边然后再设置右边

调用带有默认值参数的函数时,不能为默认值参数传递任何值,必须使用函数定义时设置的默认值。此题为判断题(对,错)。请帮忙给出正确答案和分析,谢谢!

A.正确B.错误此题为判断题(对,错)。请帮忙给出正确答案和分析,谢谢!

下列说法中错误的是______。

A.不允许设置参数的默认值

B.设置参数的默认值只能在定义函数时设置

C.设置参数的默认值时,应该设置右边的参数

D.设置参数的默认值时,应该全部参数都设置

如果一个函数带有参数说明,则参数的默认值应该在()中给出。A.函数定义B.函数声明C.函数定义或声明

如果一个函数带有参数说明,则参数的默认值应该在()中给出。

以下正确的描述是()。A.不允许设置参数的默认值B.设置参数的默认值只能在定义函数时设置C.设置

以下正确的描述是()。

A.不允许设置参数的默认值

B.设置参数的默认值只能在定义函数时设置

C.设置参数的默认值时,应该设置右边的参数

D.设置参数的默认值时,应该全部参数都设置

下面关于函数的说法正确的是

A.可以用保留字作为函数的名字

B.调用带有默认值参数的函数时,不能为默认值参数传递任何值,必须使用定义时设置的默认值

C.函数定义必须放在函数调用之前

D.函数中将a声明为global,对a的操作与全局变量无关

下面关于函数的说法正确的是()

A.可以用保留字作为函数的名字

B.调用带有默认值参数的函数时,不能为默认值参数传递任何值,必须使用定义时设置的默认值

C.函数定义必须放在函数调用之前

D.函数中将 a 声明为 global ,对 a 的操作与全局变量无关

}

在进行详解之前,我想先声明一下,本次我们进行讲解说明的是 Kafka 消息存储的信息文件内容,不是所谓的 Kafka 服务器运行产生的日志文件,这一点希望大家清楚。

Kafka 消息是以主题为单位进行归类,各个主题之间是彼此独立的,互不影响。每个主题又可以分为一个或多个分区。每个分区各自存在一个记录消息数据的日志文件。也就是该文要着重关注的内容。我们根据如下的图进行进一步说明:

中,实现了负载均衡的效果。在分区日志文件中,你会发现很多类型的文件,比如:.index、.timestamp、.log、.snapshot 等,其中,文件名一致的文件集合就称为 LogSement。我们先留有这样的一个整体的日志结构概念,接下来我们一一的进行详细的说明其中的设计。

我们已经知道分区日志文件中包含很多的 LogSegment ,Kafka 日志追加是顺序写入的,LogSegment 可以减小日志文件的大小,进行日志删除的时候和数据查找的时候可以快速定位。同时,ActiveLogSegment 也就是活跃的日志分段拥有文件拥有写入权限,其余的 LogSegment 只有只读的权限。

日志文件存在多种后缀文件,重点需要关注 .index、.timestamp、.log 三种类型。其他的日志类型功能作用,请查询下面图表:

每个 LogSegment 都有一个基准偏移量,用来表示当前 LogSegment 中第一条消息的 offset。偏移量是一个 64 位的长整形数,固定是20位数字,长度未达到,用 0 进行填补,索引文件和日志文件都由该作为文件名命名规则(.index、.timestamp、.log)。特别说明一下,如果日志文件名为 .log ,则当前日志文件的一条数据偏移量就是 121,偏移量是从 0 开始的。

增加索引项字节间隔密度,会影响索引文件中的区间密度和查询效率
当前日志分段中消息的最大时间戳与当前系统的时间戳的差值允许的最大范围,毫秒维度
当前日志分段中消息的最大时间戳与当前系统的时间戳的差值允许的最大范围,小时维度
触发偏移量索引文件或时间戳索引文件分段字节限额

偏移量索引文件用于记录消息偏移量与物理地址之间的映射关系。时间戳索引文件则根据时间戳查找对应的偏移量。

Kafka 中的索引文件是以稀疏索引的方式构造消息的索引,他并不保证每一个消息在索引文件中都有对应的索引项。每当写入一定量的消息时,偏移量索引文件和时间戳索引文件分别增加一个偏移量索引项和时间戳索引项,通过修改 log.index.interval.bytes 的值,改变索引项的密度。

从上文中可知,日志文件和索引文件都会存在多个文件,组成多个 SegmentLog,那么其切分的规则是怎样的呢?

当满足如下几个条件中的其中之一,就会触发文件的切分:

  1. 追加的消息的偏移量与当前日志分段的偏移量之间的差值大于 Integer.MAX_VALUE,即要追加的消息的偏移量不能转变为相对偏移量。

在偏移量索引文件中,每个索引项共占用 8 个字节,并分为两部分。相对偏移量和物理地址。

相对偏移量:表示消息相对与基准偏移量的偏移量,占 4 个字节

物理地址:消息在日志分段文件中对应的物理位置,也占 4 个字节

索引文件会根据 log.index.size.max.bytes 值进行预先分配空间,即文件创建的时候就是最大值,当真正的进行索引文件切分的时候,才会将其裁剪到实际数据大小的文件。这一点是跟日志文件有所区别的地方。其意义降低了代码逻辑的复杂性。

偏移量索引由相对偏移量和物理地址组成。

注意:offset 与 position 没有直接关系哦,由于存在数据删除和日志清理。

e.g. 如何查看 偏移量为 23 的消息?

那栏,然后从日志分段文件中的物理位置为320 开始顺序查找偏移量为 23 的消息。

在上文已经有所提及,通过时间戳方式进行查找消息,需要通过查找时间戳索引和偏移量索引两个文件。

e.g. 查找时间戳为 0 开始的消息?

  • 将 0 和每个日志分段中最大时间戳 largestTimeStamp 逐一对比,直到找到不小于 0 所对应的日志分段。日志分段中的 largestTimeStamp 的计算是先查询该日志分段所对应时间戳索引文件,找到最后一条索引项,若最后一条索引项的时间戳字段值大于 0 ,则取该值,否则去该日志分段的最近修改时间。
  • 找到相应日志分段之后,使用二分法进行定位,与偏移量索引方式类似,找到不大于 0 最大索引项,也就是 [0 430]。
  • 拿着偏移量为 430 到偏移量索引文件中使用二分法找到不大于 430 最大索引项,即 [20,320] 。
  • 日志文件中从 320 的物理位置开始查找不小于 0 数据。

在偏移量索引文件中,索引数据都是顺序记录 offset ,但时间戳索引文件中每个追加的索引时间戳必须大于之前追加的索引项,否则不予追加。在 Kafka 0.11.0.0 以后,消息信息中存在若干的时间戳信息。如果 broker 端参数 log.message.timestamp.type 设置为 LogAppendTIme ,那么时间戳必定能保持单调增长。反之如果是 CreateTime 则无法保证顺序。

日志清理,不是日志删除哦,这还是有所区别的,日志删除会在下文进行说明。

Kafka 提供两种日志清理策略:

日志删除:按照一定的删除策略,将不满足条件的数据进行数据删除

日志压缩:针对每个消息的 Key 进行整合,对于有相同 Key 的不同 Value 值,只保留最后一个版本。

是否支持针对具体的 Topic 进行配置?

运行保留日志文件最大值

Kafka 会周期性根据相应规则进行日志数据删除,保留策略有 3 种:基于时间的保留策略、基于日志大小的保留策略和基于日志其实偏移量的保留策略。

如何查找日志分段文件中已经过去的数据呢?

Kafka 依据日志分段中最大的时间戳进行定位,首先要查询该日志分段所对应的时间戳索引文件,查找时间戳索引文件中最后一条索引项,若最后一条索引项的时间戳字段值大于 0,则取该值,否则取最近修改时间。

为什么不直接选最近修改时间呢?

因为日志文件可以有意无意的被修改,并不能真实的反应日志分段的最大时间信息。

  1. 从日志对象中所维护日志分段的跳跃表中移除待删除的日志分段,保证没有线程对这些日志分段进行读取操作。

如果活跃的日志分段中也存在需要删除的数据时?

Kafka 会先切分出一个新的日志分段作为活跃日志分段,然后执行删除操作。

  1. 计算需要被删除的日志总大小 (当前日志文件大小-retention值)。
  2. 从日志文件第一个 LogSegment 开始查找可删除的日志分段的文件集合。

基于日志起始偏移量的保留策略的判断依据是某日志分段的下一个日志分段的起始偏移量是否大于等于日志文件的起始偏移量,若是,则可以删除此日志分段。

注意:日志文件的起始偏移量并不一定等于第一个日志分段的基准偏移量,存在数据删除,可能与之相等的那条数据已经被删除了。

  • 从头开始遍历每一个日志分段,日志分段 1 的下一个日志分段的起始偏移量为 11,小于 logStartOffset,将 日志分段 1 加入到删除队列中
  • 日志分段 2 的下一个日志分段的起始偏移量为 23,小于 logStartOffset,将 日志分段 2 加入到删除队列中
  • 日志分段 3 的下一个日志分段的起始偏移量为 30,大于 logStartOffset,则不进行删除。
}

闭包就是函数中的函数,里面的函数可以访问外面函数的变量,外面的变量是内部函数的一部分。

闭包的作用:使用闭包可以访问函数中的变量。

可以使变量长期保存在内存中,生命周期比较长。

缺点:闭包不能滥用,否则会导致内存泄漏,影响网页的性能。闭包使用完了,要立即释放资源,将引用变量指向      //只允许所有域名访问

28、防抖动与节流的区别:

1)防抖动是将多次执行变为最后一次执行。

应用场景:使用在用户输入停止一段时间过去后再去获取数据,而不是每次输入都去获取。

// 实现一个防抖函数,在规定时间内未触发第二次则执行

2)节流是将多次执行变成每隔一段时间执行。

应用场景:懒加载时要监听计算滚动条的位置,但不必每次滑动都触发,可以降低计算的频率,而不必去浪费资源;

另外还有做商品预览图的放大镜效果时,不必每次鼠标移动都计算位置。

// 实现一个节流函数,在规定时间内只触发一次

29、浏览器渲染过程:

1)浏览器将获取的HTML文档并解析成DOM树

3)将DOM和CSSDOM合并为渲染树(rending tree)将会被创建,代表一系列将被渲染的对象

4)渲染树的每个元素包含的内容都是计算过的,它被称为布局layout。浏览器使用一种流式处理的方法,只需要一次pass绘制操作就可以布局所有的元素

5)将渲染树的各个节点绘制到屏幕上,这一步被称为绘制painting

30、计算机网络TCP和UDP的区别:

1)TCP面向连接(如打电话要先拨号建立连接);UDP是无连接的,即发送数据之前不需要建立连接

2)TCP提供可靠的服务。即,通过TCP连接传送的数据,无差错,不丢失,不重复,且按序到达;UDP尽最大努力交付,即不保证可靠交付。TCP通过校验,重传控制,序号标识,滑动窗口,确认应答实现可靠传输。如,丢包时的重发控制,还可以对次序乱掉的分包进行顺序控制。

3)UDP具有较好的实时性,工作效率比TCP高,适用于对高速传输和实时性有较高的通信或广播通信。

4)每一条TCP连接只能是点到点的;UDP支持一对一,一对多,多对一和多对多的交互通信

5)TCP系统资源要求较多,UDP对系统资源要求较少

31、进程和线程的区别:

1)一个程序至少有一个进程,一个进程至少有一个线程

2)线程的划分尺度小于进程,使得多线程程序的并发性高

3)进程在执行过程中拥有独立的内存单元,而多个线程共享内存,从而极大的提高了程序的运行效率。

4)线程在执行过程中与进程还是有区别的。每个独立的线程有一个程序运行的入口,顺序执行序列和程序的出口。但是线程不能独立执行,必须依存在应用程序中,由应用程序提供多个线程执行控制。

5)从逻辑角度来看,多线程的意义在于一个应用程序中,有多个执行部分可以同时执行。但操作系统并没有将多个线程看做多个独立的应用,来实现进程调度和管理以及资源分配。

32、如何让事件先冒泡后捕获:

在Dom标准事件模型中,是先捕获后冒泡。但是如果要实现先冒泡后捕获的效果,对于同一个事件,监听捕获和冒泡,分别对应相应的处理函数,监听到捕获事件,先暂缓执行,直到冒泡事件被捕获后再执行捕获之间。

简介:事件委托指的是,不在事件的发生地(直接dom)上设置监听函数,而是在其父元素上设置监听函数,通过事件冒泡,父元素可以监听到子元素上事件的触发,通过判断事件发生元素Dom的类型,来做出不同的响应。

举例:最经典的就是ul和li标签的事件监听,比如我们在添加事件时候,采用事件委托机制,不会再li标签上直接添加,而是再ul父元素上添加。

好处:比较合适动态元素的绑定,新添加的子元素也会有监听函数,也可以有事件触发机制。

34、图片的懒加载和预加载

预加载:提前加载图片,当用户需要查看时可直接从本地缓存中渲染‘

懒加载:懒加载的主要目的时作为服务器前端的优化,减少请求数或延迟请求数

两种技术的本质:两者的行为时相反的,一个时提前加载,一个是迟缓甚至不加载

懒加载对服务器前端有一定的缓解压力作用,预加载则会增加服务器前端压力

属于高阶函数应用,传递给函数部分参数来调用柯里化函数,让它返回一个函数去处理剩下的参数。

把接收多个参数的函数转换成接收一个单一参数的函数。

requestAnimationFrame( )方法告诉浏览器,希望执行动画并请求浏览器在下一次重绘之前调用指定的函数来更新动画。该方法使用一个回调函数作为参数,这个回调函数会在浏览器重绘之前调用

38、数据属性与访问器属性的区别:

在JS中对象的属性分为两种类型:数据属性和访问器属性。

1)数据属性:它包含的是一个数据值的位置,在这可以对数据值进行读写。

configurable:表示能否通过delete删除属性从而重新定义属性,能否修改属性的特性,或能否把属性修改为访问器属性,默认为true

writable:表示能否修改属性的值

修改数据属性的默认特性: 使用Object.defineProperty( )方法,这个方法有三个参数:属性所在的对象,属性名,一个描述符对象。

2)访问器属性:这个属性不包含数据值,包含的是一对get和set方法,在读写访问器属性时,就是通过这两个方法来进行操作处理的。

configurable:表示能否通过delete删除属性从而重新定义属性,能否修改属性的特性,或能否把属性修改为访问器属性,默认为false

Get:在读取属性时调用的函数,默认值为undefined

Set:在写入属性时调用的函数,默认值为undefined

注意:访问器属性不能直接定义,要通过Object.defineProperty( )这个方法来定义。

39、Proxy 对象用于定义基本操作的自定义行为(如,属性查找、赋值、枚举、函数调用等)。

target,要使用Proxy包装的目标对象(可以时任何类型的对象,包括原生数组,函数,甚至另一个代理)。

handle,一个通常以函数作为属性的对象,各属性中的函数分别定义了在执行各种操作时代理的行为。

toolBox:{...}-----工具栏组件,内置有导出图片,数据视图,动态类型切换,数据区域缩放,重置5个工具

series:[...]-----系列,它是一个数组,里面的元素是一个对象,每个对象就是一组数据的所有信息

action:{...}-----主要是包含一些event事件和一些数据可视化的行为设置例如高亮,tooltip位置设置等

a、当X轴上面要渲染的数据太多的时候就会出现只渲染出来一部分,但是图标中的数据显示(比如说柱状图中的每个柱子)又会自动的进行宽度的缩放,所以会导致X轴与图中的信息不相匹配的问题,解决的方法是在X轴设置axisLable:{interval:0}这个属性问题就可以解决了,Y轴的使用相同的方法。

Echarts:1)封装好的方法直接调用

2)兼容到IE6以及以上的所有主流浏览器

4)封装好的,直接用,不能修改

D3:1)太底层,学习成本大

2)兼容到IE9以上以及所有的主浏览器

3)D3通过svg来绘制图形

Svg:1)不依赖分辨率

2)基于xml绘制图形,可以操作dom

4)复杂度高,会减慢页面的渲染速度

4)能以png/jpg的格式保存图片

2)IP协议之上,使用Tcp来确保数据的完整有序

三次握手,滑动窗口,慢启动,挥手,分包,重发

3)Tcp协议之上,使用http协议来作为网页传输的协议(应用层)

44、XSS防御总结:

原理:XSS攻击涉及到三方,攻击者、用户、web serve。用户是通过浏览器来访问web server上的网页,XSS攻击就是攻击者通过各种办法,在用户访问的网页中插入自己的脚本,让其在用户访问网页时在其浏览器中进行执行。攻击者通过插入的脚本的执行,来获取用户的信息,如cookie,发送到攻击者自己的网站(跨站了)。所以称为跨站脚本攻击。

(XSS,就是在用户的浏览器中执行攻击者自己定制的脚本。)

1)反射型XSS,也就是非持久性XSS。用户点击攻击连接,服务器解析后响应,在返回的响应内容中出现攻击者的XSS代码,被浏览器执行。一来一去,XSS攻击脚本被web server反射回来给浏览器,所以称为反射型XSS。

特点:XSS攻击代码非持久性,也就是没有保存在web server中,而是出现在URL地址中;一般时攻击者通过邮件,聊天软件等等方式发送攻击URL,然后用户点击来达到攻击目的。

XSS 攻击的防御:对输入(和URL参数)进行过滤,对输出进行编码。

http协议有一个缺陷,通信只能由客户端发起。做不到服务器主动向客户端推送信息。这种单向请求,注定了如果服务器有连续的状态变化,客户端要获知,只能使用“轮询”,每隔一段时间,就发出一个询问,了解服务器有没有新的信息。最典型的场景就是聊天室。轮询的效率低,非常浪费资源。

webSocket是HTML5开始提供的一种在单个TCP连接上进行全双工通讯的协议。webSocket使得客户端和服务器之间的数据交换变得更加简单,允许服务端主动向客户端推送数据。在webSocket API中,浏览器和服务器只需要完成一次握手,两者之间就直接可以创建持久性的连接,并进行双向数据传输。它最大的特点就是,服务器可以主动向客户端推送信息,客户端也可以主动向服务器发送信息,是真正的双向平等对话,属于服务器推送技术的一种。

1)建立在TCP协议之上,服务器端的实现比较容易

2)与http有良好的兼容性,默认端口也是80与443,并且握手阶段采用http协议,因此握手时不容易屏蔽,能通过各种http代理服务器

3)数据格式比较轻量,性能开销小,通信高效

4)可以发送文本,也可以发送二进制数据

5)没有同源限制,客户端可以与任意服务器通信

6)协议标识符是WS(如果加密,则为wss),服务器网站就是URL

// webSocket对象作为一个构造函数,用于新建webSocket实例,实行下面语句后,客户端就会与服务器进行连接。

// 用于指定收到服务器数据后的回调函数,除了动态判断收到的数据类型,也可以用binaryType属性,显示指定收到的二进制数据类型

46、web前端性能优化常见方法:

      1)减少HTTP请求数,因为一个完整的请求要经过DNS寻址,与服务器建立连接,发送数据,等待服务器响应,接收数据这样一个消耗时间成本和资源成本的复杂的过程。  常见方法:合并多个CSS文件和JS文件,利用雪碧图整合图像,Inline Image(使用data:URL scheme在实际的页面嵌入图像数据),合理设置HTTP缓存等。

      7)最小化iframe的数量:iframes提供了一个简单的方式把一个网站的内容嵌入到另一个网站中。但其创建速度比其他包括JavaScript和CSS的DOM元素的创建慢了1-2个数量级。

      8)避免404:HTTP请求时间消耗是很大的,因此使用HTTP请求来获得一个没有用处的响应(例如404没有找到页面)是完全没有必要的,它只会降低用户体验而不会有一点好处。

      1)使用内容分发网络(CDN):把网站内容分散到多个,处于不同地域位置的服务器上可以加快下载速度。

      2)将JavaScript和CSS作为外部文件来引用,在实际应用中使用外部文件可以提高页面速度,因为JavaScript和CSS文件都能在浏览器中产生缓存

   6)JavaScript代码注意:谨慎使用with,避免使用eval Function函数,减少作用域链查找(eval将对应的字符串解析成js并执行,应该避免使用js,因为非常耗性能(2次,一次解析成js,一次执行))

47、JS里的垃圾回收机制是什么,常用的是哪种,怎么处理的?

JS的垃圾回收机制是为了以防内存泄漏。内存泄漏的含义就是当已经不需要某块内存时这块内存还存在着,垃圾回收机制就是间歇的不定期的寻找到不再使用的变量,并释放掉它们所指向的内存。

JS中最常见的垃圾回收方式是标记清除。

工作原理:是当变量进入环境时,将这个变量标记为“进入环境”。当变量离开环境时,则将其标记为“离开环境”。标记“离开环境”的就回收内存。

1)垃圾回收器,在运行的时候会给存储在内存中的所有变量都加上标记。

2)去掉环境中的变量以及被环境中的变量引用的变量的标记。

3)再被加上标记的会被视为准备删除的变量。

4)垃圾回收器完成内存清除工作,销毁那些带标记的值并回收他们所占用的内存空间。

程序不需要的内存,由于某些原因其不会返回到操作系统或者可用内存中。内存泄漏会导致(运行缓慢,高延迟,崩溃)的问题。

常见的导致内存泄漏的原因有:

2)被遗忘的计时器或回调函数

3)脱离文档的DOM的引用

1)循环对象属性的时候,使用for...in,遍历数组的时候使用for...of

Math.min( )如果没有参数,则返回Infinity。Infinity是JavaScript中全局对象的一个属性,在浏览器环境中就是window对象的一个属性,表示无穷大。

50、前端JS加密方法:

}

我要回帖

更多关于 默认值怎么设置 的文章

更多推荐

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

点击添加站长微信