TC - front end

1、一个数组 par 中存放有多个人员的信息,每个人员的信息由年龄 age 和姓名 name 组成,如{age: 2, name: ‘xx’}。请写一段 JS 程序,对这个数组按年龄从小到大进行排序。

function getAge (arr) {
return arr.sort(function(x,y){
return x.age - y.age;
});
}

2、有字符串 var = ‘abc345efgabcab’,请写出 3 条 JS 语句分别实现如下 3 个功能:
1)去掉字符串中的a、b、c 字符,形成结果:’345efg’
2)将字符串中的数字用中括号括起来,形成结果:’abc[3][4][5]efgabcab’
3)将字符串中的每个数字的值分别乘以 2,形成结果:’abc6810efgabcab’

str.replace(/[a-c]/g,”);
str.replace(/(\d)/g, “[$1]”);
str.replace(/(\d)/g, function(a){return a*2});

3、请写一段 JS 程序类,定义一个列表类List,该类包含两个成员:属性 length(表示列表中的元素个数)和方法 add (像列表中添加元素),其中要求构造函数和 add 方法的参数为动态参数。

function List(arrArg){
this.arr = arrArg || [];
this.arrlength = this.arr.length || 0;
}

List.prototype = {
constructor: List,
add: function(arg) {
this.arr.push(arg);
this.arrlength = this.arr.length;
return this.arr;
}

}

4、请问以前 JS 程序有什么问题?应该如何优化?

function setStyle(element) {
element.style.fontWeight = “bold”;
element.style.textDecoration = “none”;
element.style.color = “#000000”;
}
我这边优化如下:

function setStyle(element) {
if (!element.style) {
return;
}
var eleStyle = element.style;
eleStyle.fontWeight = “bold”;
eleStyle.textDecoration = “none”;
eleStyle.color = “#000000”;
}

扫描二维码关注公众号,回复: 1915389 查看本文章

5、请写出一下正则表达式:
1)匹配一个全部是数字的字符串
2)提取一个 url 所使用的协议类型如 http、ftp 和 host 名称

我这边实现如下:

// 1)
var str = ‘1234’;
/^\d+$/.test(str);
// 2)
var str = ‘http://tencent.com‘;
str.match(/(([a-zA-Z]{3,5}):\/\/)?(www.)?([a-zA-Z_-]+).([a-zA-Z]+)$/);

6、XSS,CSRF,hash碰撞,阐述与防治

7、请写出下面 JS 程序中几个 document.write 的结果:

function Parent() {
this.a = 1;
this.b = [1, 2, this.a];
this.c = {demo: 5};
this.show = function() {
document.write(this.a + ’ ’ + this.c.demo + ‘:’ + this.b + ‘
’)
}
}
function Child() {
this.a = 2;
this.change = function() {
this.b.push(this.a);
this.a = this.b.length;
this.c.demo = this.a++;
}
}
Child.prototype = new Parent();
var parent = new Parent();
var child1 = new Child();
var child2 = new Child();
child1.a = 11;
child2.a = 12;
parent.show();
child1.show();
child2.show();
child1.change();
child2.change();
parent.show();
child1.show();
child2.show();

8、请用 js 程序实现二分算法。

9、JS作用域:
for es5

1、没有var声明属于全局申明,一般不太规范
2、变量提前在申明前使用,变量提升
3、js没有块级作用域,只有函数作用域
4、函数内部可以访问外部变量,外部无法访问内部变量
5、函数中变量查找是就近原则去寻找

作用域链:多层嵌套,最深层的作用域在作用域链的最开始层(水平描述在最左侧),最上层的作用域window在作用域链的最终层(水平描述在最右侧),作用域链最深访问处理越耗时;

10、变量查找顺序
javascript搜索引擎LHS和RHS作用域链查询

LHS - 等号左侧: 试图找到变量容器的本身,对其赋值;
RHS - 等号右侧:找到变量

非严格模式下,a = 4; console.log(a); // LHS查询,找不到变量给它赋值全局变量
console.log(b); b = 4; // RHS查询,找不到变量,则返回引用异常未定义ReferenceError:b is not defined

func();
// 先通过RHS查找变量,可以找到定义不报ReferenceError错, 但使用不合法;
// func 为undefined,执行了一个函数
var func = function () {
console.log(100);
};

ReferenceError代表作用域判别失败,也就是作用域内查询变量失败。
TypeError代表作用域判别成功,但是对结果的操作是非法或者不合理的。

11、浏览器事件模型
捕获阶段
目标阶段
冒泡阶段

一个3层元素结构模型,点击最里层元素,触发流程:
由外向里层层捕获,到目标,层层向上冒泡,
如果给目标绑定捕获和冒泡事件,即触发2次,

addEventListener(event, fn, Boolean);
// event, 事件方法
// fn 执行事件函数
// Booolean, true为捕获阶段触发事件,false为冒泡阶段触发事件

attachEvent(on + ‘event’, fn); // ie事件模型, 仅有冒泡阶段事件处理,没有捕获阶段的程序控制,但整个事件流程也是有捕获和冒泡的;

阻止事件传播
e.stopPropagation(),阻止事件传播既可以是在冒泡阶段,也可以是在捕获阶段;
(e.stopPropagation()很少用到在捕获阶段去阻止事件的传播,大家就以为e.stopPropagation()只能阻止事件在冒泡阶段传播。)

阻止默认行为
e.preventDefault(), 默认行为是指:点击a标签就转跳到其他页面、拖拽一个图片到浏览器会自动打开、点击表单的提交按钮会提交表单等等,因为有的时候我们并不希望发生这些事情,所以需要阻止默认行为。

12、JS事件模型

DOM0级模型
html事件绑定:

html事件绑定


js事件绑定:
var ep = document.getElementById(‘eventP’);
ep.onclick = fun;
事件移除:
ep.onclick = null;

IE事件模型
var btn = document.getElementById(‘.btn’);
btn.attachEvent(‘onclick’, showMessage);
btn.detachEvent(‘onclick’, showMessage);

DOM2级模型
见,11、浏览器事件模型

DOM事件模型中的事件对象常用属性:

    type用于获取事件类型

    target获取事件目标

    stopPropagation()阻止事件冒泡

    preventDefault()阻止事件默认行为

IE事件模型中的事件对象常用属性:

    type用于获取事件类型

    srcElement获取事件目标

    cancelBubble阻止事件冒泡

    returnValue阻止事件默认行为

自定义事件:
JS中已经内置了很多事件,如click, mouseover等等,但是内置事件毕竟有限,有时候我们想自己定义一些事件,例如三连击,threeclick。如何实现自定义事件呢?

首先要创建一个事件。可以使用以下方式:

var event = new Event('threeclick', {"bubbles":true, "cancelable":false});
然后我们需要为事件注册监听函数:

target.addEventListener('threeclick', hello, false);
最后我们要在合适的时机触发该事件,我们可以使用dispatchEvent函数。该方法在当前节点触发指定事件,从而触发监听函数执行。该方法返回一个布尔值,只要有一个监听函数调用了Event.preventDefault(), 则返回false, 否则返回true。

target.dispatchEvent(event);

JQuery Event模型
JQuery解决的一个主要问题就是浏览器的兼容问题,它有自己的事件模型实现方式。它主要有以下特性:

重定义了JQuery.Event对象, 统一了事件属性和方法, 统一了事件模型

可以在一个事件类型上添加多个事件处理函数, 可以一次添加多个事件类型的事件处理函数

支持自定义事件(事件命名空间)

提供了toggle, hover组合事件

提供了one, live-die, delegate-undelegate

提供了统一的事件封装, 绑定, 执行, 销毁机制

$(document).ready();

....

13、事件捕获作用

14、事件代理原理/事件委托
事件代理: 事件在冒泡过程中会上传到父节点,因此可以把子节点的监听函数定义在父节点上,由父节点的监听函数统一处理多个子元素的事件,这种方式称为事件代理(Event delegation)。
我们有一个div元素,它包含三个按钮:

<div id="box">
    <input type="button" value="按钮" id="btn">
    <input type="button" value="按钮2" id="btn2">
    <input type="button" value="按钮3" id="btn3">
</div>
我们可以在父节点上一次性的为所有子节点注册监听函数:

var box = document.getElementById('box');

box.addEventListener('click', function(event) {
  if (event.target.tagName.toLowerCase() === 'input') {
    // some code
  }
});

15、状态码

16、dns

17、cdn

18、前沿技术

猜你喜欢

转载自blog.csdn.net/weixin_42284354/article/details/80525577