这很面试题

这很面试题

JS中typeof与instanceof的区别


JavaScript 中 typeof 和 instanceof 常用来判断一个变量是否为空,或者是什么类型的。但它们之间还是有区别的:

typeof:typeof 是一个一元运算,放在一个运算数之前,运算数可以是任意类型。
它返回值是一个字符串,该字符串说明运算数的类型。typeof 一般只能返回如下几个结果:
number,boolean,string,function,object,undefined。我们可以使用 typeof 来获取一个变量是否存在,如 if(typeof a!=”undefined”){alert(“ok”)},而不要去使用 if(a) 因为如果 a 不存在(未声明)则会出错,对于 Array,Null 等特殊对象使用 typeof 一律返回 object,这正是 typeof 的局限性。

instanceof的语法结构:a instanceof b ,其中a是要判断的变量,b是数据的基本类型;

a instanceof b?alert(“true”):alert(“false”); //a是b的实例?真:假
instanceof 用于判断一个变量是否某个对象的实例,如 var a=new Array();alert(a instanceof Array); 会返回 true,同时 alert(a instanceof Object) 也会返回 true;这是因为 Array 是 object 的子类。再如:function test(){};var a=new test();alert(a instanceof test) 会返回true;

谈到 instanceof 我们要多插入一个问题,就是 function 的 arguments,我们大家也许都认为 arguments 是一个 Array,但如果使用 instaceof 去测试会发现 arguments 不是一个 Array 对象,尽管看起来很像。

测试 var a=new Array();if (a instanceof Object) alert(‘Y’);else alert(‘N’);得’Y’

但 if (window instanceof Object) alert(‘Y’);else alert(‘N’);得’N’

所以,这里的 instanceof 测试的 object 是指 js 语法中的 object,不是指 dom 模型对象。

使用 typeof 会有些区别 alert(typeof(window)) 会得 object。

面试题:

01

(function () {  //arruments是对象
return typeof arguments;  
})();  
A. "object"
B. "array"
C. "arguments"
D. "undefined"
答案:A

02

var f = function g() {    //没有这种写法
    return 23;
};
typeof g();
A. "number"
B. "undefined"
C. "function"
D. Eorror
答案:D

03

(function (x) {
delete x;    //delete可以删除对象的属性,删除不了变量,函数 
return x;
})(1);
A. 1
B. null
C. undefined
D. Error
答案:A

04

var y = 1,
x = y = typeof x;    
x;    //要把浏览器页面关闭再打开,要不会出现干扰

typeof打印出来的console不带"",实际上typeof的输出值是字符串形象,如"number","undefined"
A. 1
B. "number"
C. undefined
D. "undefined" 
答案: D

05

(function f(f) {
return typeof f();
})(function () {
return 1;
});

理解:
(function f(f){
console.log(typeof f()) //这里的f()实际上就是调用了下面的匿名函数
})(function(){return 1});//这里的function作为整体看就是(f)里地f,当参数传入

A. "number"
B. "undefined"
C. "function"    
D. Error
答案:A

06

var foo = {
bar: function () {
    return this.baz;
},
baz: 1
};
(function () {
return typeof arguments[0]();
})(foo.bar);

理解:
var foo = {
bar: function () {
     return this.baz;
    console.log(this.baz) ;    //此时返回的时undefined
},
baz: 1
};

console.log(foo.bar())//foo.barfunction函数加()可以读取到1
console.log((foo.bar)());和上面等同
console.log(foo.baz)    //在外部才可以读取1

(function () {
return typeof arguments[0]();
})(foo.bar) 

A. "undefined"
B. "object"
C. "number"
D. "function"
答案:A

07

var foo = {
bar: function () {
    return this.baz;
},
baz: 1
};
typeof (f=foo.bar)();

理解:
var foo = {
bar: function () {
    return this.baz;
},
baz: 1
};

f=foo.bar();
console.log(f)//得到1
f=foo.bar;
console.log(f())//undefined

console.log(typeof (f=foo.bar)() )//输出结果undefined
console.log(typeof(f=foo.bar()))//输出结果是number

A. "undefined"
B. "object"
C. "number"
D. "function"
答案:A

08

var f = (function f() {
return "1";
}, function g() {
return 2;
})();

理解:    //后面的把前面的覆盖掉了
var f = 
console.log(typeof (function f() {
return "1";
})())    
console.log(typeof (function g() {
return 2;
})())
typeof f;
A. "string"
B. "number"
C. "function"
D. "undefined"
答案: B

09

var x = 1;
if (function f() {}) {
x += typeof f;
}
x;
A. 1
B. "1function"    
C. "1undefined"    //if中的参数只作为判断条件;
D. NaN
答案: C

10

var x = [typeof x, typeof y][1];
typeof typeof x;
A. "number"
B. "string"    //typeof x是字符串所以就是字符串
C. "undefined"
D. "object"
答案: B

11

(function (foo) {
return typeof foo.bar;
})({
foo: {
    bar: 1
}
});

理解:
(function (f) {
return typeof f.foo.bar;
})(f={foo: { bar: 1}});

A、“undefined” 
B、“object” 
C、“number” 
D、Error
答案: A

12

(function f() {
function f() {
    return 1;
}
return f();
function f() {    //第一公民优先解析漂到js最上面
    return 2;
}
})();
A、1 
B、2 
C、Error (e.g. “Too much recursion”) 
D、undefined
答案:B

13

function f() {
return f;
}
new f() instanceof f;

console.log(new f() instanceof f)//false  return f 是一个死循环
如果return f 变成return 'f'或者1等等,就是true; //此时f是一个函数,new f() 就是衍生出来的它的子类,就是true;
A、true 
B、false
答案:B