Javascript笔试题汇总(一)

1.以下代码的输出是:
(function() {
    var x=foo();
    var foo=function foo() {
        return "foobar"
    };
    return x;
})();

A. foo()
B. 类型错误
C. undefined
D. foobar

答案:B
JS中变量声明、函数声明会提升,而函数表达式不会提升。上面的代码执行顺序是:var x; var foo; x=foo(); 执行到这里会因为foo为undefined而报错(foo is not a function)。如果是下面的代码就不会报错:

(function() {
    var x=foo();
    function foo() {
        return "foobar"
    };
    return x;
})();

2.下面哪些语句可以 在JS里判断一个对象oStringObject是否为String:

A. oStringObject instanceof String
B. typeof oStringObject == ‘string’
C. oStringObject is String
D. 以上答案都不正确

答案:A

var str1 = new String('js');
var str2 = 'js';
typeof str1; //object
typeof str2; //string
str1 instanceof String; //true
str2 instanceof String; //false

判断一个变量是否是字符串的周全的办法:

function isString(str){
    return (typeof str == 'string')||(str instanceof String)
}

因为本题中说的是一个对象oStringObject,那它一定是用String构造函数创建的对象,只能用instanceof。
需要注意的是用到instanceof时,关键字的左边一定是对象,如果是基本类型的话那么返回一定是false,因为基本类型的变量不可能属于任何类,例如上面代码中的str2。关键字的右边一定是类名,例如Object、String、Array、Date等等或是用户通过构造函数自定义的类,例如:

function Person(name){
    this.name = name;
}
var p = new Person();
p instanceof Person; //true

typeof运算符判断的是变量的数据类型。Js中的的数据类型有:undefined、null、string、number、boolean、object、(function)。使用typeof运算符返回的结果只有以上7中。function被作为一种特殊的object,会返回function。通过对象字面量、内建对象的构造函数、用户自定义的构造函数创建的对象都会返回object。

关于typeof和instanceof还有一个需要注意的是null,这是Javascript的历史遗留问题

typeof null; //object
null instanceof Object; //false

3.假设 output 是一个函数,输出一行文本。下面的语句输出结果是什么?
output(typeof (function() {
    output('Hello World!')
    })()
);

答案:Hello World undefined
typeof 立即执行函数 返回undefined哟


4.以下代码的运行结果:
var obj ={a:1,b:function () {alert(this.a)}}; 
var fun =obj.b; 
fun();

答案:undefined
以上代码这样看比较清晰:

var foo = function(){
    alert(this.a);
}
var obj ={a:1,b:foo}; 
var fun =obj.b; 
fun();

foo是一个独立的函数,fun和obj.b都是对foo的引用。在函数中调用this时要根据具体的上下文来输出,下面讨论几种上下文情况:

  • 全局调用,默认情况下执行foo(),此时的上下文是window。也就是代码中通过fun()调用。
  • 对象的属性方法调用,上下文是对象本身。也就是代码中通过obj.b()调用的情况。
  • call、apply调用,上下文是指定的对象。
  • 构造函数中调用,上下文是被创建的对象。

5.关于javascript的原始类型(primitive type),错误的是

A. 有5种primitive type,分别是Undefined、Null、Boolean、Number 和 String
B. var sTemp = “test string”; alert (typeof sTemp);结果为string
C. var oTemp;alert(oTemp == undefined)为true
D. alert(null == undefined);结果为false

答案:D

null == undefined; //true
null === undefined; //false

==和===的区别简单的总结以下:

  • 基本类型之间的比较

    1. 不同类型之间的比较:==会转化为相同类型后比较值是否相等,===因类型不同直接返回false
    2. 相同类型的比较:直接比较值是否相等,两者结果相同
  • 引用类型之间的比较

    1. 两者都比较地址是否相等
  • 基本类型与引用类型的比较

    1. ==将引用类型转化为基本类型后比较值是否相等,===因类型不同直接返回false

6.以下程序的运行结果:
function Foo(){
     var i=0;
     return function(){
         document.write(i++);
     }
}
var f1=Foo(),
f2=Foo();
f1();
f1();
f2();

答案:010
关于闭包的概念和作用就不解释了,这里想分析以下这两段代码(来自阮一峰博客):

代码1:
   var name = "The Window";
  var object = {
    name : "My Object",
    getNameFunc : function(){
      return function(){
        return this.name;
      };
    }
  };
    alert(object.getNameFunc()());
代码2:
   var name = "The Window";
  var object = {
    name : "My Object",
    getNameFunc : function(){
      var that = this;
      return function(){
        return that.name;
      };
    }
  };
  alert(object.getNameFunc()());

代码中object.getNameFunc()()取到的是getNameFunc的闭包。有一点需要明确:闭包中this的上下文是全局作用域,而不是object;object.getNameFunc()中的this的上下文才是object。

第一段代码中this.name取到的是window下的name,”This Window”。第二段代码中由于在getNameFunc中将this存储在that中,在闭包中就能访问到this.name。


7.下列描述中,关于 js 函数定义方式,正确的是:

A. function add(a,b){return a+b;} 函数表达式
B. var add = new Function('a','b','return a+b') 函数表达式
C. function add(a,b){return a+b;} 函数声明
D. var add = function(a,b){return a+b;} 函数声明
E. var add = new Function('a','b','return a+b') 函数声明

答案:C

//函数声明
function add(a,b){return a+b;} 
//函数表达式或函数字面量(函数本身为匿名函数,即使这里给了函数名的话也只能在函数内部通过函数名调用)
var add = function(a,b){return a+b;} 
//构造函数或函数对象(可以接受任意数量的参数,但最后一个始终被作为函数体)
var add = new Function('a','b','return a+b'); 

8.以下代码的输出结果是:
var f = function g() {
        return 23;
    };
typeof g();

A. number
B. undefined
C. function
D. 报错

答案:D
函数表达式中的函数名是可选的。如果具有函数名的话,那它相当于函数内部的一个变量,在函数外部是无法调用的,所以报错会提示ReferenceError:g is not a function

在函数表达式中使用命名函数的一个情况是函数递归,这样也可以避免使用非标准的arguments.callee属性。
被函数表达式赋值的变量一定会有name属性。name属性可以看作函数的名字,如果赋值的是匿名函数表达式时,name就是变量名;如果赋值的是命名函数表达式时,name就是函数名。


9.下列描述错误的是:

A. 在原型上扩展的可枚举方法,会被for in循环出来
B. 使用object.defineProperty可向对象添加或者修改属性
C. 每个对象都有prototype属性,返回对象类型原型的引用
D. 通过hasOwnProperty可判断一个对象以及其原型链上是否具有指定名称的属性
E. 原型链是JS实现继承的一种模型
F. For循环是按顺序的,for in循环是不一定按顺序的

答案:
关于for in和for of:
我们知道for in和for of最大的区别是:for in遍历的到的是keyfor of遍历的到的是value,因此更合理的做法是使用for in遍历对象,使用for of遍历数组。ES6中的for of功能很强大,能够遍历数组、字符串、Set、Map、NodeList和生成器。
除此之外,用for in遍历数字还有很多弊端:

  1. for in能够遍历包括原型上的所有可遍历的属性。
  2. 遍历不一定按照数组的内部顺序

ES6中提供了一种新的方法,可以轻松的获取对象的自有键:

var obj = {a:'a',b:'b'};
Object.keys(obj); //['a','b']

hasOwnProperty用于判断对象自身是否具有某属性
definePeoperty用于为对象添加或修改属性,这里可以对属性进行更多的配置。在大部分的mvvm框架中会使用这个方法来实现数据绑定。


10.如何判断一个js对象是否是Array。arr为要判断的对象,其中最准确的方法是?

A.typeof(arr)
B. arr instanceof Array
C. arr.toString==='[object Array]'
D. Object.prototype.toString.call(arr) === '[object Array]'

答案:D
arr instanceof Array返回true,但在跨frame对象构建的场景下会失效。
arr.toString是一个函数,调用toString将数组转换为字符串:

var arr = [1,2,3];
arr.toString() //"1,2,3"

Object.prototype.toString.call()可用于精确判断对象的类型,它会返回object和对象类型的组合:

Object.prototype.toString.call(123); //[object Number]
Object.prototype.toString.call('123'); //[object String]
Object.prototype.toString.call([1,2,3]); //[object Array]
Object.prototype.toString.call({}); //[object Object]
Object.prototype.toString.call(new Date()); //[object Date]
Object.prototype.toString.call(new Function()); //[object Function]

但无法判断用户自定义的对象类型,会统一判断为Object:

function Person(){}
Object.prototype.toString.call(new Person()); //[object Object]
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 215,634评论 6 497
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 91,951评论 3 391
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 161,427评论 0 351
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 57,770评论 1 290
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 66,835评论 6 388
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 50,799评论 1 294
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,768评论 3 416
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 38,544评论 0 271
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,979评论 1 308
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,271评论 2 331
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,427评论 1 345
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,121评论 5 340
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,756评论 3 324
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,375评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,579评论 1 268
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 47,410评论 2 368
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,315评论 2 352

推荐阅读更多精彩内容