最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

20個必會的JavaScript面試題(小結(jié))

 更新時間:2019年07月02日 15:56:08   作者:前端指南  
這篇文章主要介紹了20個必會的JavaScript面試題(小結(jié)),小編覺得挺不錯的,現(xiàn)在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧

問題1:JavaScript 中 undefined 和 not defined 的區(qū)別

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

var x; // 聲明 x
console.log(x); //output: undefined 

console.log(typeof y); //output: undefined 

console.log(z); // 拋出異常: ReferenceError: z is not defined

問題2:下面的代碼輸出什么?

var y = 1;
if (function f(){}) {
  y += typeof f;
}
console.log(y);

正確的答案應該是 1undefined。

JavaScript中if語句求值其實使用eval函數(shù),eval(function f(){}) 返回 function f(){} 也就是 true。

下面我們可以把代碼改造下,變成其等效代碼。

var k = 1;
if (1) {
  eval(function foo(){});
  k += typeof foo;
}
console.log(k); 

上面的代碼輸出其實就是 1undefined。為什么那?我們查看下 eval() 說明文檔即可獲得答案

該方法只接受原始字符串作為參數(shù),如果 string 參數(shù)不是原始字符串,那么該方法將不作任何改變地返回。

恰恰 function f(){} 語句的返回值是 undefined,所以一切都說通了。

注意上面代碼和以下代碼不同。

var k = 1;
if (1) {
  function foo(){};
  k += typeof foo;
}
console.log(k); // output 1function

問題3:在JavaScript中創(chuàng)建一個真正的private方法有什么缺點?

每一個對象都會創(chuàng)建一個private方法的方法,這樣很耗費內(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都有一個increaseSalary私有方法的副本。

所以我們除非必要,非常不推薦使用私有方法。

問題4:JavaScript中什么是閉包?寫出一個例子

老生常談的問題了,閉包是在一個函數(shù)里聲明了另外一個函數(shù),并且這個函數(shù)訪問了父函數(shù)作用域里的變量。

下面給出一個閉包例子,它訪問了三個域的變量

  1. 它自己作用域的變量
  2. 父函數(shù)作用域的變量
  3. 全局作用域的變量
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);
 
  }// end of scope innerFunction)(5); // Pass 5 as parameter 
}// end of scope outerFunction )(7); // Pass 7 as parameter 
innerFunction is closure that is defined inside outerFunc

輸出很簡單:

outerArg = 7
outerFuncVar = x
innerArg = 5
innerFuncVar = y
globalVar = abc

問題5:寫一個mul函數(shù),使用方法如下。

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

答案直接給出:

function mul (x) {
  return function (y) { // anonymous function 
    return function (z) { // anonymous function 
      return x * y * z; 
    };
  };
}

簡單說明下: mul 返回一個匿名函數(shù),運行這個匿名函數(shù)又返回一個匿名函數(shù),最里面的匿名函數(shù)可以訪問 x,y,z 進而算出乘積返回即可。

對于JavaScript中的函數(shù)一般可以考察如下知識點:

  • 函數(shù)是一等公民
  • 函數(shù)可以有屬性,并且能連接到它的構(gòu)造方法
  • 函數(shù)可以像一個變量一樣存在內(nèi)存中
  • 函數(shù)可以當做參數(shù)傳給其他函數(shù)
  • 函數(shù)可以返回其他函數(shù)

問題6:JavaScript怎么清空數(shù)組?

var arrayList = ['a','b','c','d','e','f'];

怎么清空 arrayList

方法1

arrayList = [];

直接改變arrayList所指向的對象,原對象并不改變。

方法2

arrayList.length = 0;

這種方法通過設(shè)置length=0 使原數(shù)組清除元素。

方法3

arrayList.splice(0, arrayList.length);

和方法2相似

問題7:怎么判斷一個object是否是數(shù)組(array)?

方法1

使用 Object.prototype.toString 來判斷是否是數(shù)組

function isArray(obj){
  return Object.prototype.toString.call( obj ) === '[object Array]';
}

這里使用call來使 toString 中 this 指向 obj。進而完成判斷

方法二

使用 原型鏈 來完成判斷

function isArray(obj){
  return obj.__proto__ === Array.prototype;
}

基本思想是利用 實例如果是某個構(gòu)造函數(shù)構(gòu)造出來的那么 它的 __proto__是指向構(gòu)造函數(shù)的 prototype屬性。

方法3

利用JQuery

function isArray(obj){
  return $.isArray(obj)
}

JQuery isArray 的實現(xiàn)其實就是方法1

問題8:下面代碼輸出什么?

var output = (function(x){
  delete x;
  return x;
})(0);
 
console.log(output);

輸出是 0。 delete 操作符是將object的屬性刪去的操作。但是這里的 x 是并不是對象的屬性, delete 操作符并不能作用。

問題9:下面代碼輸出什么?

var x = 1;
var output = (function(){
  delete x;
  return x;
})();

console.log(output);

輸出是 1。delete 操作符是將object的屬性刪去的操作。但是這里的 x 是并不是對象的屬性, delete 操作符并不能作用。

問題10:下面代碼輸出什么?

var x = { foo : 1};
var output = (function(){
  delete x.foo;
  return x.foo;
})();

console.log(output);

輸出是 undefined。x雖然是全局變量,但是它是一個object。delete作用在x.foo上,成功的將x.foo刪去。所以返回undefined

問題11:下面代碼輸出什么?

var Employee = {
  company: 'xyz'
}
var emp1 = Object.create(Employee);
delete emp1.company
console.log(emp1.company);

輸出是 xyz,這里的 emp1 通過 prototype 繼承了 Employee的 company。emp1自己并沒有company屬性。所以delete操作符的作用是無效的。

問題12:什么是 undefined x 1 ?

在chrome下執(zhí)行如下代碼,我們就可以看到undefined x 1的身影。

var trees = ["redwood","bay","cedar","oak","maple"];
delete trees[3];
console.log(trees);

當我們使用 delete 操作符刪除一個數(shù)組中的元素,這個元素的位置就會變成一個占位符。打印出來就是undefined x 1。 注意如果我們使用trees[3] === 'undefined × 1'返回的是 false。因為它僅僅是一種打印表示,并不是值變?yōu)閡ndefined x 1。

問題13:下面代碼輸出什么?

var trees = ["xyz","xxxx","test","ryan","apple"];
delete trees[3];
 
console.log(trees.length);

輸出是5。因為delete操作符并不是影響數(shù)組的長度。

問題14:下面代碼輸出什么?

var bar = true;
console.log(bar + 0);  
console.log(bar + "xyz"); 
console.log(bar + true); 
console.log(bar + false);  

輸出是

1
truexyz
2
1

下面給出一個加法操作表

  • Number + Number -> 加法
  • Boolean + Number -> 加法
  • Boolean + Boolean -> 加法
  • Number + String -> 連接
  • String + Boolean -> 連接
  • String + String -> 連接

問題15:下面代碼輸出什么?

var z = 1, y = z = typeof y;
console.log(y); 

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

上面代碼等價于

var z = 1
z = typeof y;
var y = z;
console.log(y); 

問題16:下面代碼輸出什么?

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

輸出是拋出異常,bar is not defined。 如果想讓代碼正常運行,需要這樣修改代碼:

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

或者是

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

明確說明這個下問題

var foo = function bar(){ 
  // foo is visible here 
  // bar is visible here
  console.log(typeof bar()); // Work here :)
};
// foo is visible here
// bar is undefined here

問題17:兩種函數(shù)聲明有什么區(qū)別?

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

foo的定義是在運行時。想系統(tǒng)說明這個問題,我們要引入變量提升的這一概念。

我們可以運行下如下代碼看看結(jié)果。

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

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

輸出為

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


為什么那?為什么 foo 打印出來是 undefined,而 bar打印出來卻是函數(shù)?

JavaScript在執(zhí)行時,會將變量提升。

所以上面代碼JavaScript 引擎在實際執(zhí)行時按這個順序執(zhí)行。

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

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

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

原代碼的輸出合理解釋了。

問題18:下面代碼輸出什么?

var salary = "1000$";

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

  var salary = "5000$";

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

輸出是

Original salary was undefined
My New Salary 5000$

這題同樣考察的是變量提升。等價于以下代碼

var salary = "1000$";

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

   salary = "5000$";

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

問題19:什么是 instanceof 操作符?下面代碼輸出什么?

function foo(){ 
 return foo; 
}

console.log(new foo() instanceof foo);

instanceof操作符用來判斷是否當前對象是特定類的對象。

function Animal(){
  //或者不寫return語句
  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

問題20: 如果我們使用JavaScript的"關(guān)聯(lián)數(shù)組",我們怎么計算"關(guān)聯(lián)數(shù)組"的長度?

var counterArray = {
  A : 3,
  B : 4
};
counterArray["C"] = 1;

其實答案很簡單,直接計算key的數(shù)量就可以了。

Object.keys(counterArray).length // Output 3

本文給出的面試題答案只是很多合理答案中的幾個,可能會不全面,歡迎大家補充。

由于個人疏忽等原因,本文中難免會存在少量錯誤,歡迎大家批評指正。

以上就是本文的全部內(nèi)容,希望對大家的學習有所幫助,也希望大家多多支持腳本之家。

相關(guān)文章

  • 微信小程序解除10個請求并發(fā)限制

    微信小程序解除10個請求并發(fā)限制

    這篇文章主要介紹了微信小程序解除10個請求并發(fā)限制,小編覺得挺不錯的,現(xiàn)在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧
    2018-12-12
  • JavaScript時間戳與時間日期間相互轉(zhuǎn)換

    JavaScript時間戳與時間日期間相互轉(zhuǎn)換

    今天做項目遇到這樣的問題,要將獲取到的時間轉(zhuǎn)換為時間戳,通過查閱相關(guān)資料,問題順利解決,下面小編把具體實現(xiàn)代碼分享到腳本之家平臺,需要的朋友參考下
    2017-12-12
  • 運用Windows XP附帶的Msicuu.exe、Msizap.exe來徹底卸載頑固程序

    運用Windows XP附帶的Msicuu.exe、Msizap.exe來徹底卸載頑固程序

    運用Windows XP附帶的Msicuu.exe、Msizap.exe來徹底卸載頑固程序...
    2007-04-04
  • 使用JS正則表達式 替換括號,尖括號等

    使用JS正則表達式 替換括號,尖括號等

    下面小編就為大家?guī)硪黄褂肑S正則表達式 替換括號,尖括號等。小編覺得挺不錯的,現(xiàn)在就分享給大家,也給大家做個參考。一起跟隨小編過來看看吧
    2016-11-11
  • input鏈接頁面、打開新網(wǎng)頁等等的具體實現(xiàn)

    input鏈接頁面、打開新網(wǎng)頁等等的具體實現(xiàn)

    input可以鏈接到某頁、返回、打開新網(wǎng)頁、打開無邊框的新窗口等等,本文整理了一些,感興趣的朋友可以參考下
    2013-12-12
  • js實現(xiàn)select下拉框選擇

    js實現(xiàn)select下拉框選擇

    這篇文章主要為大家詳細介紹了js實現(xiàn)select下拉框選擇,文中示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2020-01-01
  • 淺談js中的閉包

    淺談js中的閉包

    閉包是一個比較抽象的概念,尤其是對js新手來說.書上的解釋實在是比較晦澀,對我來說也是一樣.閉包是很多語言都具備的特性,在js中,閉包主要涉及到j(luò)s的幾個其他的特性:作用域鏈,垃圾(內(nèi)存)回收機制,函數(shù)嵌套,等等.
    2015-03-03
  • js Dialog 實踐分享

    js Dialog 實踐分享

    在我們的WebApp項目中,Dialog是個不可或缺的元素,很多頁面操作都通過Dialog來進行,今天我們就Dialog顯示數(shù)據(jù)、提交數(shù)據(jù)做進一步分析
    2012-10-10
  • JavaScript 函數(shù)的執(zhí)行過程

    JavaScript 函數(shù)的執(zhí)行過程

    下面小編就為大家?guī)硪黄狫avaScript 函數(shù)的執(zhí)行過程。小編覺得挺不錯的,現(xiàn)在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧
    2016-05-05
  • 如何使用ES6的class類繼承來實現(xiàn)絢麗小球效果

    如何使用ES6的class類繼承來實現(xiàn)絢麗小球效果

    JS是由ES(ECMAScript)、DOM(瀏覽器文檔對象)、BOM(瀏覽器對象模型)組成,這篇文章主要給大家介紹了關(guān)于如何使用ES6的class類繼承來實現(xiàn)絢麗小球效果的相關(guān)資料,需要的朋友可以參考下
    2021-06-06

最新評論

漠河县| 吴江市| 通河县| 松溪县| 电白县| 连平县| 越西县| 乳山市| 横峰县| 大关县| 梧州市| 民县| 旅游| 文化| 上思县| 沙洋县| 上林县| 阿巴嘎旗| 朔州市| 浪卡子县| 会东县| 沛县| 华池县| 遂宁市| 梅河口市| 卢龙县| 太仓市| 冷水江市| 新河县| 沅陵县| 古浪县| 新河县| 乌拉特前旗| 汾西县| 涡阳县| 海南省| 汕尾市| 宜章县| 津市市| 荣成市| 双鸭山市|