下面是我的笔试所经历是试题,面完试自我感觉良好,可是一回来重做一遍想撞墙,记录下来当做爬坑经历,最主要是js的问题,基础不行还是无缘加入这家公司了。
1.以下代码会输出什么?
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19
| function person(name){ if (name) this.name = name; console.log(this.name); }
person.prototype.name = 'Tom';
var human = { person : person, name : 'Cat' }
person() person('Jack') new person() new person('Rose') human.person() person.call(window)
|
这里是要考察函数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
| > 情况1:如果一个函数中有this,但是它没有被上一级的对象所调用,那么this指向的就是window。
> 情况2:如果一个函数中有this,这个函数有被上一级的对象所调用,那么this指向的就是上一级的对象。
> 情况3:如果一个函数中有this,这个函数中包含多个对象,尽管这个函数是被最外层的对象所调用,this指向的也只是它上一级的对象。
摘自博客[http://www.cnblogs.com/pssp/p/5216085.html](http://www.cnblogs.com/pssp/p/5216085.html)
之后来看 ```person() ``` 会输出空,当做普通函数执行此时```this.name```为空无异议。 ```person('Jack')``` 这里输出 ```Jack``` 也无异议,当做普通函数来传参并执行,不过需要注意的是这里当做普通函数来执行之后```this```指向了全局浏览器中的```window```对象,此时的```this.name```相当于```window.name```。 ```new person() //Tom```,加了```new```之后的情况,先来了解下```new```到底干了什么?
``` js var obj = {}; obj.__proto__ = Base.prototype; Base.call(obj); ``` + 第一行,我们创建了一个空对象obj。 + 第二行,我们将这个空对象的__proto__成员指向了Base函数对象prototype成员对象。 + 第三行,我们将Base函数对象的this指针替换成obj,然后再调用Base函数,于是我们就给obj对象赋值了一个id成员变量,这个成员变量的值是”base”。
由此,通过```new```之后创建了一个指向```person```的对象,在执行到``` console.log(this.name)```后js解释器会现在本地(person的上下文)查找有关```name```属性,但是没有找到,又去原型链中查找,终于发现了个```name```属性,所以就引用了这个属性的值。 ```new person('Rose') //Rose```自然就不用解释了。 ```human.person() //Cat```,函数的```this```指向调用它的上下文。
##### 2.以下代码会输出什么?
```js var str = 'hello';
function hello(str){ var str; console.log(str); }
hello('kitty') // kitty console.log(str) // hello
|
以上,创建上下文的时候会提升所有的变量声明和函数声明,会在这里找变量发现(str)```这里有个```str```变量先提升,给个默认值```undefined```然后发现没有别的变量了,里面的str由于跟参数列表里的str是同名的,所以只会提升一次,不会覆盖1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16
| 而在执行的时候,var str这个事函数声明,它已经在创建执行上下文的时候提升了,所以直接略过
##### 3.以下代码会输出什么?
```js var a = window.a = 'hello';
function hello(a){ console.log(a) var a = 'kitty'; console.log(a); } hello(); // undefined // kitty
|
4.以下代码会输出什么?
1 2 3 4 5 6 7 8 9 10 11 12 13 14
| function T() { this.name = 't'; }
function B() { this.name = 'b' }
var t = new T(); T.prototype = B.prototype;
console.log(t instanceof T); console.log(t instanceof B);
|
5.以下代码会输出什么?
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18
| var obj = { bar : 1, foo : 2, baz : 3 }
obj.bar = undefined; obj.foo = null; delete obj.baz;
for (var i in obj) { if (obj.hasOwnProperty(i)) { console.log(i); } }
|
6.以下代码会输出什么?
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20
| function Dog() {}
Dog.prototype.name = 'dog'
var d = new Dog(); console.log(d.name);
Dog.prototype.name = 'hotdog';
console.log(d.name);
d.name = 'baddog';
console.log(d.name);
delete d.name;
console.log(d.name);
|