亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb

首頁 > 開發 > JS > 正文

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

2024-05-06 16:52:59
字體:
來源:轉載
供稿:網友

問題1:JavaScript 中 undefined 和 not defined 的區別

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

var x; // 聲明 xconsole.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函數,eval(function f(){}) 返回 function f(){} 也就是 true。

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

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

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

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

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

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

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

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

每一個對象都會創建一個private方法的方法,這樣很耗費內存

觀察下面代碼

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 objectvar emp1 = new Employee("John","Pluto",3000);// Create Employee class objectvar emp2 = new Employee("Merry","Pluto",2000);// Create Employee class objectvar emp3 = new Employee("Ren","Pluto",2500);

在這里 emp1,emp2,emp3都有一個increaseSalary私有方法的副本。

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

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

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

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

  1. 它自己作用域的變量
  2. 父函數作用域的變量
  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函數,使用方法如下。

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 返回一個匿名函數,運行這個匿名函數又返回一個匿名函數,最里面的匿名函數可以訪問 x,y,z 進而算出乘積返回即可。

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

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

問題6:JavaScript怎么清空數組?

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

怎么清空 arrayList

方法1

arrayList = [];

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

方法2

arrayList.length = 0;

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

方法3

arrayList.splice(0, arrayList.length);

和方法2相似

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

方法1

使用 Object.prototype.toString 來判斷是否是數組

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

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

方法二

使用 原型鏈 來完成判斷

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

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

方法3

利用JQuery

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

JQuery isArray 的實現其實就是方法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.companyconsole.log(emp1.company);

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

問題12:什么是 undefined x 1 ?

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

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

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

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

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

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

問題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中賦值操作結合律是右至左的 ,即從最右邊開始計算值賦值給左邊的變量。

上面代碼等價于

var z = 1z = 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:兩種函數聲明有什么區別?

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

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

我們可以運行下如下代碼看看結果。

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

輸出為

undefinedfunction bar(){   // Some code}; 

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

JavaScript在執行時,會將變量提升。

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

// 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的"關聯數組",我們怎么計算"關聯數組"的長度?

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

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

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

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

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

以上就是本文的全部內容,希望對大家的學習有所幫助,也希望大家多多支持VeVb武林網。


注:相關教程知識閱讀請移步到JavaScript/Ajax教程頻道。
發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
人人澡人人澡人人看欧美| 亚洲女成人图区| 欧美高清视频在线播放| 992tv在线成人免费观看| 欧美精品电影在线| 亚洲在线免费视频| 欧美另类69精品久久久久9999| 久久精品成人欧美大片| 日韩在线欧美在线| 日本午夜在线亚洲.国产| 亚洲欧美一区二区激情| 97久久超碰福利国产精品…| 97精品免费视频| 久久久久久久久久久成人| 国产精品999| 成人网在线免费看| 久久久av电影| 欧美国产中文字幕| 国产精品久久久久久av下载红粉| 国产综合久久久久| 国产一区二区三区网站| 欧美成人免费在线观看| 久久久国产精彩视频美女艺术照福利| 国产精品96久久久久久| 欧美精品少妇videofree| 情事1991在线| 国产精品久久久久久久电影| 国产做受69高潮| 亚洲第一福利网站| 亚洲激情视频在线播放| 怡红院精品视频| 亚洲区一区二区| 亚洲成人精品视频| 国产亚洲欧美日韩一区二区| 国产精品日韩欧美大师| 不卡av在线播放| 中文字幕日韩av综合精品| 青青a在线精品免费观看| 91久久久久久久久久| 欧美精品激情在线观看| 国产精品视频导航| 亚洲美女av在线播放| 亚洲精品电影在线观看| 久久久最新网址| 亚洲缚视频在线观看| 亚洲免费av片| 26uuu另类亚洲欧美日本老年| 欧美日韩国内自拍| 精品久久久久久久大神国产| 91久久久久久久一区二区| 欧美日韩精品中文字幕| 亚洲aaa激情| 中文字幕日韩av电影| 自拍视频国产精品| 亚洲japanese制服美女| 久久国产精品首页| 亚洲欧美日韩国产精品| 国产欧美在线播放| 96pao国产成视频永久免费| 色妞色视频一区二区三区四区| 欧美激情欧美狂野欧美精品| 亚洲欧美一区二区三区四区| 欧美日韩高清在线观看| 欧美日本国产在线| 97精品国产91久久久久久| 亚洲精品福利在线观看| 曰本色欧美视频在线| 久久精品国产一区| 日韩在线视频播放| 性色av一区二区三区免费| 国产精品丝袜视频| 久久久噜噜噜久久久| 欧美三级欧美成人高清www| 美女久久久久久久久久久| 久久天天躁狠狠躁夜夜躁2014| 久久69精品久久久久久国产越南| 国产一区二区黄| 亚洲精品国产精品国产自| 国产一区二区三区在线观看视频| 日韩一二三在线视频播| 精品国产老师黑色丝袜高跟鞋| 成人免费视频97| 日韩中文字幕av| 日韩毛片中文字幕| 日韩高清av在线| 国产成人高潮免费观看精品| 国产视频亚洲视频| 国产精品wwww| 久久成人亚洲精品| 97超级碰在线看视频免费在线看| 在线日韩精品视频| 国产深夜精品福利| 亚洲女人被黑人巨大进入| 国产999在线| 亚洲美女福利视频网站| 亚洲v日韩v综合v精品v| 日韩精品视频在线观看网址| 亚洲欧洲国产伦综合| 欧洲一区二区视频| 亚洲二区中文字幕| 久久91超碰青草是什么| 亚洲精品电影网在线观看| 日韩欧美在线视频日韩欧美在线视频| 一区二区欧美久久| 国产精品福利网| 欧美黑人巨大xxx极品| 日韩在线中文字| 日本午夜人人精品| 久热精品视频在线观看一区| 欧美猛男性生活免费| 成人在线视频福利| 久久久精品中文字幕| 亚洲精品有码在线| 奇米影视亚洲狠狠色| 91久久久久久久| 色综合视频网站| 欧美大全免费观看电视剧大泉洋| 久久久免费电影| 日韩极品精品视频免费观看| 欧美性色视频在线| 18久久久久久| 久久全球大尺度高清视频| 国产综合色香蕉精品| 一本色道久久综合狠狠躁篇怎么玩| 亚洲国产高清自拍| 高清欧美一区二区三区| 97av在线视频免费播放| 911国产网站尤物在线观看| 亚洲视频在线免费观看| 亚洲一区二区三区在线视频| 亚洲精品中文字幕女同| 久久久久久高潮国产精品视| 国产日韩欧美成人| 国产精品一久久香蕉国产线看观看| 亚洲变态欧美另类捆绑| 欧美精品国产精品日韩精品| 在线电影欧美日韩一区二区私密| 日韩极品精品视频免费观看| 亚洲国产精品一区二区久| 日韩成人激情在线| 在线精品国产成人综合| 日韩精品极品视频| 国产精品精品久久久| 欧美大片免费观看在线观看网站推荐| 亚洲另类欧美自拍| 亚洲一区二区三区sesese| 九九视频直播综合网| 欧美成人激情视频免费观看| 热久久美女精品天天吊色| 国产欧美一区二区三区在线看| 久久久亚洲影院| 欧美日本在线视频中文字字幕| 一本色道久久88亚洲综合88| 欧美激情精品久久久久久| 国产在线精品成人一区二区三区| 少妇高潮 亚洲精品| 精品国产精品三级精品av网址| 一个色综合导航| 欧美一区二区三区免费视| 97国产精品免费视频| 久久夜色精品国产亚洲aⅴ| 欧美极品第一页| 欧美精品免费在线| 欧美日本精品在线|