面试题整理

1. new操作符具体做了什么

1
2
var Func = function() {};
var func = new Func();

new共经过了四个阶段

1. 创建一个空对象

1
var obj = new Object();

2. 设置原型链

1
obj.__proto__= Func.prototype;

3. 让Func中的this指向obj,并执行Func的函数体。

1
var result = Func.call(obj);

4. 判断Func的返回值类型:

如果是值类型,返回obj。如果是引用类型,就返回这个引用类型的对象。

1
2
3
4
5
if(typeof(result) == "object") {
func = result;
} else {
func = obj;
}

最后再贴出来波同学的写法

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
// 先一本正经的创建一个构造函数,其实该函数与普通函数并无区别
var Person = function(name, age) {
this.name = name;
this.age = age;
this.getName = function() {
return this.name;
}
}

// 将构造函数以参数形式传入
function New(func) {

// 声明一个中间对象,该对象为最终返回的实例
var res = {};
if (func.prototype !== null) {

// 将实例的原型指向构造函数的原型
res.__proto__ = func.prototype;
}

// ret为构造函数执行的结果,这里通过apply,将构造函数内部的this指向修改为指向res,即为实例对象
var ret = func.apply(res, Array.prototype.slice.call(arguments, 1));

// 当我们在构造函数中明确指定了返回对象时,那么new的执行结果就是该返回对象
if ((typeof ret === "object" || typeof ret === "function") && ret !== null) {
return ret;
}

// 如果没有明确指定返回对象,则默认返回res,这个res就是实例对象
return res;
}

// 通过new声明创建实例,这里的p1,实际接收的正是new中返回的res
var p1 = New(Person, 'tom', 20);
console.log(p1.getName());

// 当然,这里也可以判断出实例的类型了
console.log(p1 instanceof Person); // true

2. JQuery 中 $.fn.extend 函数的实现(实现核心代码即可)

参考一

3. 伪元素和伪类的区别

伪类

伪类存在的意义是为了通过选择器找到那些不存在与DOM树中的信息以及不能被常规CSS选择器获取到的信息。

伪类由一个冒号:开头,冒号后面是伪类的名称和包含在圆括号中的可选参数。

任何常规选择器可以再任何位置使用伪类。伪类语法不区别大小写。一些伪类的作用会互斥,另外一些伪类可以同时被同一个元素使用。并且,为了满足用户在操作DOM时产生的DOM结构改变,伪类也可以是动态的。

标准伪类索引

:active
:any
:checked
:default
:dir()
:disabled
:empty
:enabled
:first
:first-child
:first-of-type
:fullscreen
:focus
:hover
:indeterminate
:in-range
:invalid
:lang()
:last-child
:last-of-type
:left
:link
:not()
:nth-child()
:nth-last-child()
:nth-last-of-type()
:nth-of-type()
:only-child
:only-of-type
:optional
:out-of-range
:read-only
:read-write
:required
:right
:root
:scope
:target
:valid
:visited

伪元素

伪元素在DOM树中创建了一些抽象元素,这些抽象元素是不存在于文档语言里的(可以理解为html源码)。比如:documen接口不提供访问元素内容的第一个字或者第一行的机制,而伪元素可以使开发者可以提取到这些信息。并且,一些伪元素可以使开发者获取到不存在于源文档中的内容(比如常见的::before,::after)。

伪元素的由两个冒号::开头,然后是伪元素的名称。

使用两个冒号::是为了区别伪类和伪元素(CSS2中并没有区别)。当然,考虑到兼容性,CSS2中已存的伪元素仍然可以使用一个冒号:的语法,但是CSS3中新增的伪元素必须使用两个冒号::。

一个选择器只能使用一个伪元素,并且伪元素必须处于选择器语句的最后。

注:不排除未来会加入同时使用多个伪元素的机制。

所有伪元素

::after
::before
::first-letter
::first-line
::selection

4. 找出整形数组中乘积最大的三个数

雯子 wechat
更多内容请关注我的公众号-雯子推