Javascript筆試題匯總(一)

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

A. foo()
B. 類型錯誤
C. undefined
D. foobar

答案:B
JS中變量聲明珊拼、函數(shù)聲明會提升羹幸,而函數(shù)表達(dá)式不會提升钙皮。上面的代碼執(zhí)行順序是:var x; var foo; x=foo(); 執(zhí)行到這里會因?yàn)閒oo為undefined而報(bào)錯(foo is not a function)。如果是下面的代碼就不會報(bào)錯:

(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)
}

因?yàn)楸绢}中說的是一個對象oStringObject曼追,那它一定是用String構(gòu)造函數(shù)創(chuàng)建的對象窍仰,只能用instanceof。
需要注意的是用到instanceof時礼殊,關(guān)鍵字的左邊一定是對象驹吮,如果是基本類型的話那么返回一定是false,因?yàn)榛绢愋偷淖兞坎豢赡軐儆谌魏晤惛嘌啵缟厦娲a中的str2钥屈。關(guān)鍵字的右邊一定是類名,例如Object坝辫、String篷就、Array、Date等等或是用戶通過構(gòu)造函數(shù)自定義的類近忙,例如:

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

typeof運(yùn)算符判斷的是變量的數(shù)據(jù)類型竭业。Js中的的數(shù)據(jù)類型有:undefined、null及舍、string未辆、number、boolean锯玛、object咐柜、(function)。使用typeof運(yùn)算符返回的結(jié)果只有以上7中攘残。function被作為一種特殊的object拙友,會返回function。通過對象字面量歼郭、內(nèi)建對象的構(gòu)造函數(shù)遗契、用戶自定義的構(gòu)造函數(shù)創(chuàng)建的對象都會返回object。

關(guān)于typeof和instanceof還有一個需要注意的是null病曾,這是Javascript的歷史遺留問題

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

3.假設(shè) output 是一個函數(shù)牍蜂,輸出一行文本漾根。下面的語句輸出結(jié)果是什么?
output(typeof (function() {
    output('Hello World!')
    })()
);

答案:Hello World undefined
typeof 立即執(zhí)行函數(shù) 返回undefined喲


4.以下代碼的運(yùn)行結(jié)果:
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是一個獨(dú)立的函數(shù)鲫竞,fun和obj.b都是對foo的引用辐怕。在函數(shù)中調(diào)用this時要根據(jù)具體的上下文來輸出,下面討論幾種上下文情況:

  • 全局調(diào)用贡茅,默認(rèn)情況下執(zhí)行foo()秘蛇,此時的上下文是window。也就是代碼中通過fun()調(diào)用顶考。
  • 對象的屬性方法調(diào)用,上下文是對象本身妖泄。也就是代碼中通過obj.b()調(diào)用的情況驹沿。
  • call、apply調(diào)用蹈胡,上下文是指定的對象渊季。
  • 構(gòu)造函數(shù)中調(diào)用,上下文是被創(chuàng)建的對象罚渐。

5.關(guān)于javascript的原始類型(primitive type)却汉,錯誤的是

A. 有5種primitive type,分別是Undefined荷并、Null合砂、Boolean、Number 和 String
B. var sTemp = “test string”; alert (typeof sTemp);結(jié)果為string
C. var oTemp;alert(oTemp == undefined)為true
D. alert(null == undefined);結(jié)果為false

答案:D

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

==和===的區(qū)別簡單的總結(jié)以下:

  • 基本類型之間的比較

    1. 不同類型之間的比較:==會轉(zhuǎn)化為相同類型后比較值是否相等源织,===因類型不同直接返回false
    2. 相同類型的比較:直接比較值是否相等翩伪,兩者結(jié)果相同
  • 引用類型之間的比較

    1. 兩者都比較地址是否相等
  • 基本類型與引用類型的比較

    1. ==將引用類型轉(zhuǎn)化為基本類型后比較值是否相等,===因類型不同直接返回false

6.以下程序的運(yùn)行結(jié)果:
function Foo(){
     var i=0;
     return function(){
         document.write(i++);
     }
}
var f1=Foo(),
f2=Foo();
f1();
f1();
f2();

答案:010
關(guān)于閉包的概念和作用就不解釋了,這里想分析以下這兩段代碼(來自阮一峰博客):

代碼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的閉包谈息。有一點(diǎn)需要明確:閉包中this的上下文是全局作用域缘屹,而不是object;object.getNameFunc()中的this的上下文才是object侠仇。

第一段代碼中this.name取到的是window下的name轻姿,”This Window”。第二段代碼中由于在getNameFunc中將this存儲在that中逻炊,在閉包中就能訪問到this.name互亮。


7.下列描述中,關(guān)于 js 函數(shù)定義方式嗅骄,正確的是:

A. function add(a,b){return a+b;} 函數(shù)表達(dá)式
B. var add = new Function('a','b','return a+b') 函數(shù)表達(dá)式
C. function add(a,b){return a+b;} 函數(shù)聲明
D. var add = function(a,b){return a+b;} 函數(shù)聲明
E. var add = new Function('a','b','return a+b') 函數(shù)聲明

答案:C

//函數(shù)聲明
function add(a,b){return a+b;} 
//函數(shù)表達(dá)式或函數(shù)字面量(函數(shù)本身為匿名函數(shù)胳挎,即使這里給了函數(shù)名的話也只能在函數(shù)內(nèi)部通過函數(shù)名調(diào)用)
var add = function(a,b){return a+b;} 
//構(gòu)造函數(shù)或函數(shù)對象(可以接受任意數(shù)量的參數(shù),但最后一個始終被作為函數(shù)體)
var add = new Function('a','b','return a+b'); 

8.以下代碼的輸出結(jié)果是:
var f = function g() {
        return 23;
    };
typeof g();

A. number
B. undefined
C. function
D. 報(bào)錯

答案:D
函數(shù)表達(dá)式中的函數(shù)名是可選的溺森。如果具有函數(shù)名的話慕爬,那它相當(dāng)于函數(shù)內(nèi)部的一個變量窑眯,在函數(shù)外部是無法調(diào)用的,所以報(bào)錯會提示ReferenceError:g is not a function医窿。

在函數(shù)表達(dá)式中使用命名函數(shù)的一個情況是函數(shù)遞歸磅甩,這樣也可以避免使用非標(biāo)準(zhǔn)的arguments.callee屬性。
被函數(shù)表達(dá)式賦值的變量一定會有name屬性姥卢。name屬性可以看作函數(shù)的名字卷要,如果賦值的是匿名函數(shù)表達(dá)式時,name就是變量名独榴;如果賦值的是命名函數(shù)表達(dá)式時僧叉,name就是函數(shù)名。


9.下列描述錯誤的是:

A. 在原型上擴(kuò)展的可枚舉方法棺榔,會被for in循環(huán)出來
B. 使用object.defineProperty可向?qū)ο筇砑踊蛘咝薷膶傩?br> C. 每個對象都有prototype屬性瓶堕,返回對象類型原型的引用
D. 通過hasOwnProperty可判斷一個對象以及其原型鏈上是否具有指定名稱的屬性
E. 原型鏈?zhǔn)荍S實(shí)現(xiàn)繼承的一種模型
F. For循環(huán)是按順序的,for in循環(huán)是不一定按順序的

答案:
關(guān)于for in和for of:
我們知道for in和for of最大的區(qū)別是:for in遍歷的到的是key症歇,for of遍歷的到的是value郎笆,因此更合理的做法是使用for in遍歷對象,使用for of遍歷數(shù)組忘晤。ES6中的for of功能很強(qiáng)大宛蚓,能夠遍歷數(shù)組、字符串设塔、Set凄吏、Map、NodeList和生成器壹置。
除此之外竞思,用for in遍歷數(shù)字還有很多弊端:

  1. for in能夠遍歷包括原型上的所有可遍歷的屬性。
  2. 遍歷不一定按照數(shù)組的內(nèi)部順序

ES6中提供了一種新的方法钞护,可以輕松的獲取對象的自有鍵:

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

hasOwnProperty用于判斷對象自身是否具有某屬性
definePeoperty用于為對象添加或修改屬性盖喷,這里可以對屬性進(jìn)行更多的配置。在大部分的mvvm框架中會使用這個方法來實(shí)現(xiàn)數(shù)據(jù)綁定难咕。


10.如何判斷一個js對象是否是Array课梳。arr為要判斷的對象,其中最準(zhǔn)確的方法是余佃?

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對象構(gòu)建的場景下會失效背蟆。
arr.toString是一個函數(shù)厦幅,調(diào)用toString將數(shù)組轉(zhuǎn)換為字符串:

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]

但無法判斷用戶自定義的對象類型踪宠,會統(tǒng)一判斷為Object:

function Person(){}
Object.prototype.toString.call(new Person()); //[object Object]
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末步势,一起剝皮案震驚了整個濱河市氧猬,隨后出現(xiàn)的幾起案子背犯,更是在濱河造成了極大的恐慌,老刑警劉巖盅抚,帶你破解...
    沈念sama閱讀 212,454評論 6 493
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件漠魏,死亡現(xiàn)場離奇詭異,居然都是意外死亡妄均,警方通過查閱死者的電腦和手機(jī)柱锹,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,553評論 3 385
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來丰包,“玉大人禁熏,你說我怎么就攤上這事∫乇耄” “怎么了匹层?”我有些...
    開封第一講書人閱讀 157,921評論 0 348
  • 文/不壞的土叔 我叫張陵,是天一觀的道長锌蓄。 經(jīng)常有香客問我,道長撑柔,這世上最難降的妖魔是什么瘸爽? 我笑而不...
    開封第一講書人閱讀 56,648評論 1 284
  • 正文 為了忘掉前任,我火速辦了婚禮铅忿,結(jié)果婚禮上剪决,老公的妹妹穿的比我還像新娘。我一直安慰自己檀训,他們只是感情好柑潦,可當(dāng)我...
    茶點(diǎn)故事閱讀 65,770評論 6 386
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著峻凫,像睡著了一般渗鬼。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上荧琼,一...
    開封第一講書人閱讀 49,950評論 1 291
  • 那天譬胎,我揣著相機(jī)與錄音,去河邊找鬼命锄。 笑死堰乔,一個胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的脐恩。 我是一名探鬼主播镐侯,決...
    沈念sama閱讀 39,090評論 3 410
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼驶冒!你這毒婦竟也來了苟翻?” 一聲冷哼從身側(cè)響起韵卤,我...
    開封第一講書人閱讀 37,817評論 0 268
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎袜瞬,沒想到半個月后怜俐,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 44,275評論 1 303
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡邓尤,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,592評論 2 327
  • 正文 我和宋清朗相戀三年拍鲤,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片汞扎。...
    茶點(diǎn)故事閱讀 38,724評論 1 341
  • 序言:一個原本活蹦亂跳的男人離奇死亡季稳,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出澈魄,到底是詐尸還是另有隱情景鼠,我是刑警寧澤,帶...
    沈念sama閱讀 34,409評論 4 333
  • 正文 年R本政府宣布痹扇,位于F島的核電站铛漓,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏鲫构。R本人自食惡果不足惜浓恶,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 40,052評論 3 316
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望结笨。 院中可真熱鬧包晰,春花似錦、人聲如沸炕吸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,815評論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽赫模。三九已至树肃,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間嘴瓤,已是汗流浹背扫外。 一陣腳步聲響...
    開封第一講書人閱讀 32,043評論 1 266
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留廓脆,地道東北人筛谚。 一個月前我還...
    沈念sama閱讀 46,503評論 2 361
  • 正文 我出身青樓,卻偏偏與公主長得像停忿,于是被迫代替她去往敵國和親驾讲。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 43,627評論 2 350

推薦閱讀更多精彩內(nèi)容