20個(gè)必會(huì)的JavaScript面試題

一鼠证、JavaScript 中 undefined 和 not defined 的區(qū)別

JavaScript 未聲明變量直接使用會(huì)拋出異常:var name is not defined谨娜,如果沒(méi)有處理異常,代碼就停止運(yùn)行了。 但是,使用typeof undeclared_variable并不會(huì)產(chǎn)生異常,會(huì)直接返回 undefined。

var x; // 聲明 x
console.log(x); // undefined
console.log(typeof y); // undefined
console.log(z);  // 拋出異常: ReferenceError: z is not defined
二蚌成、 以下代碼輸出什么
var y = 1;
if (function f(){}) {
    y += typeof f;
}
console.log(y);
  • JavaScriptif語(yǔ)句求值其實(shí)使用eval函數(shù),該方法(eval())只接受原始字符串作為參數(shù)凛捏,如果 string 參數(shù)不是原始字符串担忧,那么該方法將不作任何改變地返回。
  • eval(function f(){}) 返回 function f(){} 也就是 true坯癣。
  • 結(jié)果為1function涵妥。
三、在JavaScript中創(chuàng)建一個(gè)真正的private方法有什么缺點(diǎn)

每一個(gè)對(duì)象都會(huì)創(chuàng)建一個(gè)private方法的方法坡锡,這樣很耗費(fèi)內(nèi)存

var Employee = function (name, company, salary) {
    this.name = name || "";
    this.company = company || "";
    this.salary = salary || 5000;

    // Private method
    var increaseSalary = function () {
        this.salary = this.salary + 1000;
    };

    // Public method
    this.dispalyIncreasedSalary = function() {
        increaseSlary();
        console.log(this.salary);
    };
};

// Create Employee class object
var emp1 = new Employee("John","Pluto",3000);
// Create Employee class object
var emp2 = new Employee("Merry","Pluto",2000);
// Create Employee class object
var emp3 = new Employee("Ren","Pluto",2500);

在這里 emp1,emp2,emp3都有一個(gè)increaseSalary私有方法的副本蓬网。所以除非必要,非常不推薦使用私有方法鹉勒。

四帆锋、JavaScript中什么是閉包?寫出一個(gè)例子
  • 閉包是在一個(gè)函數(shù)里聲明了另外一個(gè)函數(shù)禽额,并且這個(gè)函數(shù)訪問(wèn)了父函數(shù)作用域里的變量锯厢。
  • 下面給出一個(gè)閉包例子,它訪問(wèn)了三個(gè)域的變量脯倒。
    • 它自己作用域的變量
    • 父函數(shù)作用域的變量
    • 全局作用域的變量
var globalVar = "abc";

// Parent self invoking function
(function outerFunction (outerArg) { // begin of scope outerFunction
    // Variable declared in outerFunction function scope
    var outerFuncVar = 'x';
    // Closure self-invoking function
    (function innerFunction (innerArg) { // begin of scope innerFunction
        // variable declared in innerFunction function scope
        var innerFuncVar = "y";
        console.log(
            "outerArg = " + outerArg + "\n" +
            "outerFuncVar = " + outerFuncVar + "\n" +
            "innerArg = " + innerArg + "\n" +
            "innerFuncVar = " + innerFuncVar + "\n" +
            "globalVar = " + globalVar);

    })(5); // end of scope innerFunction, Pass 5 as parameter
})(7); // end of scope outerFunction, Pass 7 as parameter
// innerFunction is closure that is defined inside outerFunc

輸出為

outerArg = 7
outerFuncVar = x
innerArg = 5
innerFuncVar = y
globalVar = abc
五实辑、寫一個(gè)mul函數(shù)

要求使用如下:

console.log(mul(2)(3)(4)); // output : 24
console.log(mul(4)(3)(4)); // output : 48

參考函數(shù)如下:

function mul (x) {
    return function (y) { // anonymous function
        return function (z) { // anonymous function
            return x * y * z;
        };
    };
}
  • mul返回一個(gè)匿名函數(shù),運(yùn)行這個(gè)匿名函數(shù)又返回一個(gè)匿名函數(shù)藻丢,最里面的匿名函數(shù)可以訪問(wèn) x,y,z 進(jìn)而算出乘積返回即可剪撬。
  • 對(duì)于JavaScript中的函數(shù)一般可以考察如下知識(shí)點(diǎn)
    • 函數(shù)是一等公民
    • 函數(shù)可以有屬性,并且能連接到它的構(gòu)造方法
    • 函數(shù)可以像一個(gè)變量一樣存在內(nèi)存中
    • 函數(shù)可以當(dāng)做參數(shù)傳給其他函數(shù)
    • 函數(shù)可以返回其他函數(shù)
六悠反、JavaScript怎么清空數(shù)組

例:

var arrayList = ['a','b','c','d','e','f'];
  • 直接改變arrayList所指向的對(duì)象残黑,原對(duì)象并不改變。arrayList = []
  • 這種方法通過(guò)設(shè)置length=0 使原數(shù)組清除元素斋否。arrayList.length = 0
  • 和方法2相似梨水。arrayList.splice(0, arrayList.length)
七、怎么判斷一個(gè)object是否是數(shù)組(array)
  • Object.prototype.toString
function isArray(obj){
    return Object.prototype.toString.call( obj ) === '[object Array]';
}
  • 使用 原型鏈 (實(shí)例如果是某個(gè)構(gòu)造函數(shù)構(gòu)造出來(lái)的那么 它的 proto是指向構(gòu)造函數(shù)的 prototype屬性)
function isArray(obj){
    return obj.__proto__ === Array.prototype;
}
八茵臭、下面代碼輸出什么
var output = (function(x){
    delete x;
    return x;
})(0);

console.log(output);

輸出是 0疫诽。 delete 操作符是將object的屬性刪去的操作。但是這里的 x 并不是對(duì)象的屬性, delete 操作符并不能作用奇徒。

九雏亚、下面代碼輸出什么
var x = 1;
var output = (function(){
    delete x;
    return x;
})();

console.log(output);

輸出是 1。delete 操作符是將object的屬性刪去的操作逼龟。但是這里的x是并不是對(duì)象的屬性评凝,delete操作符并不能作用追葡。

十腺律、下面代碼輸出什么
var x = { foo : 1};
var output = (function(){
    delete x.foo;
    return x.foo;
})();

console.log(output);

輸出是 undefinedx雖然是全局變量宜肉,但是它是一個(gè)object匀钧。delete作用在x.foo上,成功的將x.foo刪去谬返。所以返回undefined

十一之斯、下面代碼輸出什么
var Employee = {
    company: 'xyz'
}
var emp1 = Object.create(Employee);
delete emp1.company
console.log(emp1.company);

輸出是 xyz,這里的 emp1 通過(guò) prototype 繼承了 Employee的 company遣铝。emp1自己并沒(méi)有company屬性佑刷。所以delete操作符的作用是無(wú)效的。

十二酿炸、什么是 undefined x 1
var trees = ["redwood","bay","cedar","oak","maple"];
delete trees[3];
console.log(trees);
  • 當(dāng)我們使用 delete 操作符刪除一個(gè)數(shù)組中的元素瘫絮,這個(gè)元素的位置就會(huì)變成一個(gè)占位符。打印出來(lái)就是undefined x 1填硕。 注意如果我們使用trees[3] === 'undefined × 1'返回的是 false麦萤。因?yàn)樗鼉H僅是一種打印表示,并不是值變?yōu)?code>undefined x 1扁眯。
  • 注:我自己沒(méi)有復(fù)現(xiàn)
十三壮莹、下面代碼輸出什么
var trees = ["xyz","xxxx","test","ryan","apple"];
delete trees[3];

console.log(trees.length);

輸出是5。因?yàn)?code>delete操作符并不是影響數(shù)組的長(zhǎng)度姻檀。

十四命满、下面代碼輸出什么
var bar = true;
console.log(bar + 0);
console.log(bar + "xyz");
console.log(bar + true);
console.log(bar + false);

輸出為

1
truexyz
2
1

下面給出一個(gè)加法操作表

  • Number + Number -> 加法
  • Boolean + Number -> 加法
  • Boolean + Boolean -> 加法
  • Number + String -> 連接
  • String + Boolean -> 連接
  • String + String -> 連接
十五、下面代碼輸出什么
var z = 1, y = z = typeof y;
console.log(y);

輸出是 undefined绣版。js中賦值操作結(jié)合律是右至左的 周荐,即從最右邊開始計(jì)算值賦值給左邊的變量。

上面代碼等價(jià)于

var z = 1
z = typeof y;
var y = z;
console.log(y);
十六僵娃、下面代碼輸出什么
var foo = function bar(){ return 12; };
typeof bar();

輸出是拋出異常概作,bar is not defined。 如果想讓代碼正常運(yùn)行默怨,需要這樣修改代碼

var bar = function(){ return 12; };
typeof bar();

或者是

function bar(){ return 12; };
typeof bar();
十七讯榕、下面代碼輸出什么
console.log(foo)
console.log(bar)

var foo = function(){
    // Some code
};
function bar(){
    // Some code
};

輸出為

undefined
function bar(){
    // Some code
};

JavaScript在執(zhí)行時(shí),會(huì)將變量提升。所以上面代碼JavaScript 引擎在實(shí)際執(zhí)行時(shí)按下面這個(gè)順序執(zhí)行

// foo bar的定義位置被提升
function bar(){
    // Some code
};
var foo;

console.log(foo)
console.log(bar)

foo = function(){
    // Some code
};

十八愚屁、下面代碼輸出什么
var salary = "1000$";

(function () {
    console.log("Original salary was " + salary);

    var salary = "5000$";

    console.log("My New Salary " + salary);
})();

這道題同樣考察的是變量提升济竹。等價(jià)于以下代碼

var salary = "1000$";

 (function () {
     var salary ;
     console.log("Original salary was " + salary);

     salary = "5000$";

     console.log("My New Salary " + salary);
 })();

所以輸出為

Original salary was undefined
My New Salary 5000$
十九、什么是 instanceof 操作符霎槐?下面代碼輸出什么
function foo(){
  return foo;
}

console.log(new foo() instanceof foo);
  • instanceof操作符用來(lái)判斷當(dāng)前對(duì)象是否是特定類的對(duì)象送浊。如:
function Animal(){
    //或者不寫return語(yǔ)句
    return this;
}
var dog = new Animal();
dog instanceof Animal // Output : true
  • 但是,這里的foo定義為
function foo(){
  return foo;
}
  • 所以
// here bar is pointer to function foo(){return foo}.
var bar = new foo();

所以 new foo() instanceof foo 返回 false

二十丘跌、如果我們使用JavaScript的"關(guān)聯(lián)數(shù)組"袭景,我們?cè)趺从?jì)算"關(guān)聯(lián)數(shù)組"的長(zhǎng)度
var counterArray = {
    A : 3,
    B : 4
};
counterArray["C"] = 1;
Object.keys(counterArray).length // Output 3

直接計(jì)算key的數(shù)量就可以了。

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末闭树,一起剝皮案震驚了整個(gè)濱河市耸棒,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌报辱,老刑警劉巖与殃,帶你破解...
    沈念sama閱讀 211,123評(píng)論 6 490
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場(chǎng)離奇詭異碍现,居然都是意外死亡幅疼,警方通過(guò)查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,031評(píng)論 2 384
  • 文/潘曉璐 我一進(jìn)店門昼接,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)爽篷,“玉大人,你說(shuō)我怎么就攤上這事辩棒±浅溃” “怎么了?”我有些...
    開封第一講書人閱讀 156,723評(píng)論 0 345
  • 文/不壞的土叔 我叫張陵一睁,是天一觀的道長(zhǎng)钻弄。 經(jīng)常有香客問(wèn)我,道長(zhǎng)者吁,這世上最難降的妖魔是什么窘俺? 我笑而不...
    開封第一講書人閱讀 56,357評(píng)論 1 283
  • 正文 為了忘掉前任,我火速辦了婚禮复凳,結(jié)果婚禮上瘤泪,老公的妹妹穿的比我還像新娘。我一直安慰自己育八,他們只是感情好对途,可當(dāng)我...
    茶點(diǎn)故事閱讀 65,412評(píng)論 5 384
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著髓棋,像睡著了一般实檀。 火紅的嫁衣襯著肌膚如雪惶洲。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 49,760評(píng)論 1 289
  • 那天膳犹,我揣著相機(jī)與錄音恬吕,去河邊找鬼。 笑死须床,一個(gè)胖子當(dāng)著我的面吹牛铐料,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播豺旬,決...
    沈念sama閱讀 38,904評(píng)論 3 405
  • 文/蒼蘭香墨 我猛地睜開眼钠惩,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼!你這毒婦竟也來(lái)了哈垢?” 一聲冷哼從身側(cè)響起妻柒,我...
    開封第一講書人閱讀 37,672評(píng)論 0 266
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤扛拨,失蹤者是張志新(化名)和其女友劉穎耘分,沒(méi)想到半個(gè)月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體绑警,經(jīng)...
    沈念sama閱讀 44,118評(píng)論 1 303
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡求泰,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,456評(píng)論 2 325
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了计盒。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片渴频。...
    茶點(diǎn)故事閱讀 38,599評(píng)論 1 340
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖北启,靈堂內(nèi)的尸體忽然破棺而出卜朗,到底是詐尸還是另有隱情,我是刑警寧澤咕村,帶...
    沈念sama閱讀 34,264評(píng)論 4 328
  • 正文 年R本政府宣布场钉,位于F島的核電站,受9級(jí)特大地震影響懈涛,放射性物質(zhì)發(fā)生泄漏逛万。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,857評(píng)論 3 312
  • 文/蒙蒙 一批钠、第九天 我趴在偏房一處隱蔽的房頂上張望宇植。 院中可真熱鬧,春花似錦埋心、人聲如沸指郁。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,731評(píng)論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)闲坎。三九已至,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間箫柳,已是汗流浹背手形。 一陣腳步聲響...
    開封第一講書人閱讀 31,956評(píng)論 1 264
  • 我被黑心中介騙來(lái)泰國(guó)打工, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留悯恍,地道東北人库糠。 一個(gè)月前我還...
    沈念sama閱讀 46,286評(píng)論 2 360
  • 正文 我出身青樓,卻偏偏與公主長(zhǎng)得像涮毫,于是被迫代替她去往敵國(guó)和親瞬欧。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 43,465評(píng)論 2 348

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