笔试高频易错题集01
大家在参加面试之前都应该看看的这些题,说不定你笔试就遇到了呢!
▼ 判断下面创建对象的方式哪个是错误的:
① 方式一:
// 01 方式一 var obj1 = new Object(); obj1.name = "NZGZ"; obj1.getName = function () { return this.name; } console.log(obj1.getName());
② 方式二:
//02 方式二 var obj2 ={ name:"ZML", getName: function () { return this.name; } } console.log(obj2.getName());
③ 方式三:
//03 方式三
var MYClass = function(){ this.name = "ZDYGZ"; console.log(this.getName()); } var obj3 = new MYClass(); console.log(obj3);
④ 方式四:
//04 方式四 var obj4; obj4.name = "CWFS"; obj4.getName = function () { return this.name; } console.log(obj4);
题目分析:Ⅰ 本题考察的是创建对象的方式。创建对象的方式有四种:
ⅰ字面量的方式创建对象 var obj = {}
ⅱ 采用内置构造函数来创建对象 var obj = new Object();...
ⅲ 采用工厂函数的方式
ⅳ 自定义构造函数的方式
Ⅱ 题目中的 方式四 是错误的创建对象方式,因为obj4 是基本类型的变量,给它添加属性虽然不报错,但是不是一个对象;其次打印出 obj4.name 的结果是undefined
ⅰ 方式一 是内置构造函数的方式创建对象
ⅱ 方式二 是字面量的方式创建对象
ⅲ 自定义构造函数的方式创建对象
题目外延伸:
Ⅰ 利用工厂函数方式创建对象
function Product(sno,name){ var o = new Object(); o.sno =sno; o.name = name; return o; } var yangwawa = Product("007","芭比娃娃"); console.log(yangwawa);
Ⅱ 自定义构造函数创建对象的常见方式
function Person(name,age){ this.name = name; this.age = age; this.showName = function(){ console.log(this.name); } }
▼下面输出的各个结果是什么?
//第一处输出结果
console.log(test); function test(){}
//第二处输出结果 console.log(typeof test); var test ="2017";
//第三处输出结果 console.log(test);
题目分析:
Ⅰ. 本题考察的是 函数和变量声明提升的问题,并且函数和变量同名的情况;函数和变量声明提升的情况有以下三种:
ⅰ 变量和变量同名的情况,处理方式是后面的变量会把前面的变量覆盖
ⅱ 函数与函数同名的情况 ,处理方式也是后面的覆盖前面的
ⅲ 变量和函数同名的情况,处理方式是 函数声明会正常提升,而变量声明可以看作被忽略了(不管函数声明在前还是在后)
Ⅱ. 输出结果为:
//第一处: function test (){}
//第二处: function
//第三处: 2017
这里的函数和变量同名,函数的声明正常提升,而变量的声明看作被忽视,变量提升后代码的结构可以看作是这样的:
function test(){} console.log(test); console.log(typeof test); test ="2017"; console.log(test);
▼下面输出的各个结果是什么?
var f = new Number(true); if (f == true){ var a = 10; } function fn(){ var b =20; c =30; } fn(); console.log(a); console.log(b); console.log(c);
题目分析:
Ⅰ. 本题考察的是 js中的作用域和变量的提升;js中只有两种作用域:
ⅰ script 标签创建的,全局作用域
ⅱ 函数创建的,局部作用域
ⅲ js本身没有块级作用域(try...catch除外)
Ⅱ 输出结果: 10 报错 30
结果分析:
Ⅰ. var f = new Number(true); 这句代码,只有传入 true和 1 的 时候 f ==true 为真,其他都是假,所以此处 a = 10
Ⅱ. 因为 b 在函数 fn中声明的,所以是 b 是局部变量,在外部不能够访问 ,故打印 b 的值会找不到,即 报错
Ⅲ. c 虽然写在函数 fn中 ,但是它并没有使用var来声明,所以会默认成为 window 的属性,所以可以访问 ,c =30
▼下面我们将上面的题目稍作修改,输出的各个结果是什么?
var f = new Number(0); if (f == true){ var a = 10; } function fn(){ var b =20; c =30; } fn(); console.log(a); console.log(b); console.log(c);
输出结果 : undefined 报错 30
结果分析:注意 if语句中声明的 a 是全局变量,因为js中只有两种作用域,没有块级作用域。
▼下面输出的各个结果是什么?
var str1 = new String("demo1"); var str2 = new String("demo2"); var str3 = "demo1"; console.log(str1 == str2); console.log(str1 == str3);
题目分析: Ⅰ. 这道题考察的是 == 的比较;相等比较:
ⅰ. 如果比较的是引用类型,那么比较的是他们的地址(因为引用类型的内容是地址)
ⅱ. 如果相比较的一个是引用类型,一个是基本类型,那么会有一个隐式转换,比较的是( 对象.valueof ==基本类型值)
输出结果: false true
▼下面输出的各个结果是什么?
var name = "worid"; (function(){ if (typeof name == undefined){ var name = "老薛"; console.log("Goodbye" + name); } else { console.log("Hello " + name); } })()
题目分析:这道题和上面的题目很相似。考察的知识点是作用域和变量提升的问题,但是有一个注意点 , “undefined” == undefined 输出结果不是 true ,而是 false .
打印结果: Hello undefined
结果分析:在函数体中,变量提升,进行if判断时,typeof name 是 "undefined" ,所以执行 else中的内容。
▼下面输出的各个结果是什么?
var a = []; if(a){ console.log([1] == true); } else { console.log("No"); }
题目分析:
Ⅰ这道题看似简单,包含的内容有对象和布尔类型的比较,数组与布尔类型的比较,以及if判断中的类型:
ⅰ. 对象和布尔类型(true|false)比较,结果永远都是false
ⅱ.数组在和布尔类型比较时,只有 [1]==true 结果为true,其他都为false;
ⅲ.if 判断的时候,只要是引用类型都为true , [0]、[1] 、[] 、{} 这些都是真;
输出结果:true
▼下面输出的各个结果是什么?
var a = {}; var b = Object.prototype; console.log(a.prototype === b); console.log(Object.getPrototypeOf(a) === b);
题目分析:
Ⅰ 考察 prototype 和 .__proto__
ⅰ. prototype 是构造函数的属性
ⅱ. 实例化对象.__proto__ 和对象.prototype 不是一回事
Ⅱ Object.getPrototypeOf(对象) 获取对象的原型对象
输出结果: false true
Ⅰ 对象.prototype指的是访问对象的prototype属性;如果该对象是一个普通的对象(非构造函数),那么不存在该属性。
Ⅱ 对象.__proto__指的是访问创建该对象的构造函数的原型对象,等价于其构造函数.prototype
Ⅲ console.log(a.__proto__ == Object.prototype); 结果为 true
▼下面输出的各个结果是什么?
function f(){} var a = f.prototype; var b = Object.getPrototypeOf(f); console.log(a === b); console.log(b == f);
输出结果: false false
ⅰ. a 是构造函数 f 的原型对象
ⅱ.b 是 f 对象的原型对象 ,是空函数 (因为构造函数也是对象,也有它的原型对象)
ⅲ. b 和 f 比较,,虽然都是空函数,但是他们都是对象,对象比较时,比较的是地址,所以也是false

浙公网安备 33010602011771号