本文主要介紹undefined是什么軟件(軟件出現(xiàn)undefined是什么意思),下面一起看看undefined是什么軟件(軟件出現(xiàn)undefined是什么意思)相關(guān)資訊。
作者|fullstack.cafe
出處|前端之巔
根據(jù) stack overflow 的 2018 年度調(diào)查,javascript 連續(xù)六年成為最常用的編程語言。所以我們必須面對(duì)這樣的現(xiàn)實(shí),javascript 已經(jīng)成為全棧開發(fā)技能的基石,在全棧開發(fā)面試中都會(huì)不可避免地涉及到與 javascript 有關(guān)的問題。fullstack.cafe 匯編了最常見的 javascript 面試問題和答案,希望能夠幫助讀者找到下一份夢(mèng)想中的工作。
q1:javascript 中的強(qiáng)制轉(zhuǎn)型(coercion)是指什么?
難度:0在 javascript 中,兩種不同的內(nèi)置類型間的轉(zhuǎn)換被稱為強(qiáng)制轉(zhuǎn)型。強(qiáng)制轉(zhuǎn)型在 javascript 中有兩種形式:顯式和隱式。
這是一個(gè)顯式強(qiáng)制轉(zhuǎn)型的例子:
var a = 42;var b = number( a );a; // 42b; // 42 是個(gè)數(shù)字!
這是一個(gè)隱式強(qiáng)制轉(zhuǎn)型的例子:
var a = 42;var b = a * 1; // 42 隱式轉(zhuǎn)型成 42 a; // 42b; // 42 是個(gè)數(shù)字!
q2:javascript 中的作用域(scope)是指什么?
難度:?在 javascript 中,每個(gè)函數(shù)都有自己的作用域。作用域基本上是變量以及如何通過名稱訪問這些變量的規(guī)則的集合。只有函數(shù)中的代碼才能訪問函數(shù)作用域內(nèi)的變量。
同一個(gè)作用域中的變量名必須是唯一的。一個(gè)作用域可以嵌套在另一個(gè)作用域內(nèi)。如果一個(gè)作用域嵌套在另一個(gè)作用域內(nèi),最內(nèi)部作用域內(nèi)的代碼可以訪問另一個(gè)作用域的變量。
q3:解釋 javascript 中的相等性。
難度:?javascript 中有嚴(yán)格比較和類型轉(zhuǎn)換比較:
嚴(yán)格比較(例如 ===)在不允許強(qiáng)制轉(zhuǎn)型的情況下檢查兩個(gè)值是否相等;抽象比較(例如 ==)在允許強(qiáng)制轉(zhuǎn)型的情況下檢查兩個(gè)值是否相等。var a = 42;var b = 42;a == b; // truea === b; // false
一些簡(jiǎn)單的規(guī)則:
如果被比較的任何一個(gè)值可能是 true 或 false,要用 ===,而不是 ==;如果被比較的任何一個(gè)值是這些特定值(0、“”或 []),要用 ===,而不是 ==;在其他情況下,可以安全地使用 ==。它不僅安全,而且在很多情況下,它可以簡(jiǎn)化代碼,并且提升代碼可讀性。q4:解釋什么是回調(diào)函數(shù),并提供一個(gè)簡(jiǎn)單的例子。
難度:回調(diào)函數(shù)是可以作為參數(shù)傳遞給另一個(gè)函數(shù)的函數(shù),并在某些操作完成后執(zhí)行。下面是一個(gè)簡(jiǎn)單的回調(diào)函數(shù)示例,這個(gè)函數(shù)在某些操作完成后打印消息到控制臺(tái)。
function modifyarray(arr, callback) { // 對(duì) arr 做一些操作 arr.push(100); // 執(zhí)行傳進(jìn)來的 callback 函數(shù) callback();}var arr = [1, 2, 3, 4, 5];modifyarray(arr, function() { console.log(array has been modified, arr);});
q5:“use strict”的作用是什么?
難度:use strict 出現(xiàn)在 javascript 代碼的頂部或函數(shù)的頂部,可以幫助你寫出更安全的 javascript 代碼。如果你錯(cuò)誤地創(chuàng)建了全局變量,它會(huì)通過拋出錯(cuò)誤的來警告你。例如,以下程序?qū)伋鲥e(cuò)誤:
function dosomething(val) { use strict; x = val 10;}
它會(huì)拋出一個(gè)錯(cuò)誤,因?yàn)?x 沒有被定義,并使用了全局作用域中的某個(gè)值對(duì)其進(jìn)行賦值,而 use strict 不允許這樣做。下面的小改動(dòng)修復(fù)了這個(gè)錯(cuò)誤:
function dosomething(val) { use strict; var x = val 10;}
q6:解釋 javascript 中的 null 和 undefined。
難度:javascript 中有兩種底層類型:null 和 undefined。它們代表了不同的含義:
尚未初始化的東西:undefined;目前不可用的東西:null。q7:編寫一個(gè)可以執(zhí)行如下操作的函數(shù)。
難度:var addsix = createbase(6);addsix(10); // 返回 16addsix(21); // 返回 27
可以創(chuàng)建一個(gè)閉包來存放傳遞給函數(shù) createbase 的值。被返回的內(nèi)部函數(shù)是在外部函數(shù)中創(chuàng)建的,內(nèi)部函數(shù)就成了一個(gè)閉包,它可以訪問外部函數(shù)中的變量,在本例中是變量 basenumb呃.
function create base(base number){ return function(n){//我們?cè)谶@里訪問基數(shù),即使是在這個(gè)函數(shù)之外聲明的。javascript中的閉包允許我們這樣做。返回基數(shù)n;} } var add six = create base(6);add six(10);add six(21);
問題8:解釋javascript中的值和類型。
難點(diǎn):javascript有類型值,但沒有類型變量。javascript提供了以下內(nèi)置類型:
stringnumberbooleannull和undefinedobjectsymbol (es6中的es6新功能)q9:解釋事件氣泡以及如何阻止它。
難點(diǎn):事件冒泡是指嵌套最深的元素觸發(fā)一個(gè)事件,然后這個(gè)事件在嵌套順序中的父元素上觸發(fā)。
防止事件冒泡的一種方法是使用event.cancelbubble或event.stoppropagation()(低于ie 9)。
q10:javascript中的let關(guān)鍵字有什么用?
難度:除了在函數(shù)級(jí)聲明變量,es6還允許在代碼塊中聲明變量({..})使用let關(guān)鍵字。
q11:如何檢查一個(gè)數(shù)是否是整數(shù)?
難點(diǎn):檢驗(yàn)一個(gè)數(shù)是小數(shù)還是整數(shù)的一個(gè)非常簡(jiǎn)單的方法就是對(duì)1取模,看是否有余數(shù)。
函數(shù)isint(num) {返回?cái)?shù)字% 1 = = = 0;} console . log(isint(4));//true console . log(isint(12.2));//false console . log(isint(0.3));//假
q12:什么是生活(立即調(diào)用函數(shù)表達(dá)式)?
難點(diǎn):即調(diào)用函數(shù)表達(dá)式,簡(jiǎn)稱iife。該函數(shù)在創(chuàng)建后會(huì)立即執(zhí)行:
(函數(shù)life(){ console . log( 你好! );})();// 你好!
這種模式通常用于避免污染全局名稱空間,因?yàn)閘ife中的所有變量(像任何其他普通函數(shù)一樣)在其作用域之外都是不可見的。
q13如何在javascript中比較兩個(gè)對(duì)象?
難點(diǎn):對(duì)于兩個(gè)非原始值,比如兩個(gè)對(duì)象(包括函數(shù)和數(shù)組),比較= =和= =只檢查它們的引用是否匹配,不檢查實(shí)際引用的內(nèi)容。
例如,默認(rèn)情況下,一個(gè)數(shù)組將被轉(zhuǎn)換為一個(gè)字符串,數(shù)組的所有元素都用逗號(hào)連接。因此,當(dāng)比較= =:時(shí),具有相同內(nèi)容的兩個(gè)數(shù)組將不相等:
var a = [1,2,3];var b = [1,2,3];風(fēng)險(xiǎn)值c = 1,2, a = = c;//trueb = = c;//truea = = b;//假
對(duì)于對(duì)象的深度比較,可以使用庫(kù)deepequal,也可以自己實(shí)現(xiàn)遞歸比較算法。
q14:你能解釋一下es5和es6的區(qū)別嗎?
難度:ecmascript 5(es5):ecmascript第5版,2009年標(biāo)準(zhǔn)化。這個(gè)標(biāo)準(zhǔn)已經(jīng)在所有現(xiàn)代瀏覽器中完全實(shí)現(xiàn)。ecmascript 6(es6)或ecmascript 2015(es 2015):ecmascript第6版于2015年標(biāo)準(zhǔn)化。這個(gè)標(biāo)準(zhǔn)已經(jīng)在大多數(shù)現(xiàn)代瀏覽器中部分實(shí)現(xiàn)。以下是es5和es6之間的一些主要區(qū)別:
arrow函數(shù)和字符串插值:const greetings =(name)= { return ` hello $ { name } `;} const greetings = name = ` hello $ { name } `;常數(shù)
常量在很多方面和其他語言中的常量是一樣的,但是也有一些需要注意的地方。常數(shù)代表 固定參考 到價(jià)值觀。因此,當(dāng)使用常量時(shí),您實(shí)際上可以更改變量所引用的對(duì)象的屬性,但是您可以 不要改變引用本身。
const names =[];names . push( 吉姆和);console . log(names . length = = = 1);//true names =[ 史蒂夫 , 約翰 ];//錯(cuò)誤塊范圍變量。
新的es6關(guān)鍵字let允許開發(fā)人員聲明塊級(jí)范圍的變量。讓can 不要像var一樣被提升。
默認(rèn)參數(shù)值默認(rèn)參數(shù)允許我們用默認(rèn)值初始化函數(shù)。如果參數(shù)被省略或未定義,則使用默認(rèn)值,這意味著null是有效值。
//基本語法函數(shù)multiply (a,b = 2){ return a* b;}m倍數(shù)(5);// 10類定義和繼承
es6引入了對(duì)類(關(guān)鍵字class)、構(gòu)造函數(shù)(關(guān)鍵字構(gòu)造函數(shù))和擴(kuò)展關(guān)鍵字繼承的支持。
for…of運(yùn)算符for…of語句創(chuàng)建一個(gè)遍歷被迭代對(duì)象的循環(huán)。
展開操作const obj 1 = {a: 1,b: 2 } const obj 2 = {a: 2,c: 3,d: 4 } const obj 3 = {...obj1,...obj2}對(duì)象合并的承諾。
promise提供了一種處理異步操作結(jié)果的機(jī)制。您可以使用回調(diào)來實(shí)現(xiàn)相同的目標(biāo),但是promise通過方法鏈接和簡(jiǎn)潔的錯(cuò)誤處理帶來了更好的可讀性。
const isgreater = (a,b) = {return new promise ((resolve,reject)= { if(a b){ resolve(true)} else { reject(false)} } } is greater(1,2)。然后(result = { console . log( ;greater )})模塊導(dǎo)出和導(dǎo)入。
const mymodul: 1,y:()= { console . log( ;這是es5 )} }導(dǎo)出默認(rèn)mymodule從 amp導(dǎo)入我的模塊;;。/my module ;;
問題15:解釋 未定義 和 未定義 在javascript中。
難點(diǎn):在javascript中,如果你試圖使用一個(gè)變量。;不存在也沒有。;如果沒有聲明,javascript將拋出一個(gè)錯(cuò)誤var名稱未定義腳本將停止運(yùn)行。但是如果使用typeof undeclared_variable,就會(huì)返回undefined。
在進(jìn)一步討論之前,讓 讓我們理解聲明和定義之間的區(qū)別。
風(fēng)險(xiǎn)值x 意味著一個(gè)聲明,因?yàn)槟銢]有。;無法定義它的價(jià)值。這是什么?你只要宣布它存在。
var x;//聲明xconsol:未定義。
var x = 1 既是聲明又是定義(我們也可以說是初始化),x變量的聲明和賦值相繼發(fā)生。在javascript中,每個(gè)變量聲明和函數(shù)聲明都被放在當(dāng)前作用域的頂部,然后被賦值。這個(gè)過程叫做吊裝。
當(dāng)我們?cè)噲D訪問一個(gè)已聲明但未定義的變量時(shí),會(huì)出現(xiàn)一個(gè)未定義的錯(cuò)誤。
var x;//聲明if(x的類型= = 未定義 )//將返回true。
當(dāng)我們?cè)噲D引用一個(gè)既沒有聲明也沒有定義的變量時(shí),就會(huì)出現(xiàn)一個(gè)未定義的錯(cuò)誤。
consol: referenc: y未定義。
問題16:什么?;匿名函數(shù)和命名函數(shù)的區(qū)別是什么?
難度:var foo = function(){//匿名函數(shù)賦給變量foo//..};var x = function bar(){ //賦給變量x//的命名函數(shù)欄..};foo();//實(shí)際執(zhí)行函數(shù)x();
q17:什么是 關(guān)閉 用javascript?比如?
難點(diǎn):閉包是在另一個(gè)函數(shù)(稱為父函數(shù))中定義的函數(shù),可以訪問在父函數(shù)范圍內(nèi)聲明和定義的變量。
閉包可以在三個(gè)范圍內(nèi)訪問變量:
在它們自己的范圍內(nèi)聲明的變量;父函數(shù)中聲明的變量;在全局范圍內(nèi)聲明的變量。var globalvar = ampabc //由于調(diào)用函數(shù)(function outer function(outer farg){//outerfunction作用域開始//outer function作用域中聲明的變量var outer func var = ;x ;//閉包從調(diào)用函數(shù)開始(function inner function(inner arg){//inner function作用域//inner function作用域中聲明的變量,var innerfuncvar = y console . log( outerarg = outerarg n outerfuncvar = outerfuncvar n innerarg = innerarg n innerfuncvar = innerfuncvar n globalvar = global var);innerfunction作用域的結(jié)尾})(5);//以5為參數(shù)// outerfunction作用域ends })(7);//以7為參數(shù)
innerfunction是outerfunction中定義的閉包,可以訪問outerfunction范圍內(nèi)聲明和定義的所有變量。此外,閉包還可以訪問全局名稱空間中聲明的變量。
上述代碼的輸出將是:
outer arg = 7 outer func var = xinner arg = 5 innerfunc var = yglobalvar = abc
q18:如何在javascript中創(chuàng)建私有變量?
難點(diǎn):要在javascript中創(chuàng)建一個(gè)不可修改的私有變量,需要在函數(shù)中將其創(chuàng)建為局部變量。即使調(diào)用了這個(gè)函數(shù),也不能在函數(shù)外部訪問這個(gè)變量。例如:
func(){ var priv = 秘密代碼 } console . log(priv);//拋出錯(cuò)誤
要訪問這個(gè)變量,需要?jiǎng)?chuàng)建一個(gè)返回私有變量的輔助函數(shù)。
func(){ var priv = 秘密代碼 return函數(shù)(){ return priv} } var getpriv = func();console . log(getpriv());// =密碼
請(qǐng)解釋原型設(shè)計(jì)模式。
難點(diǎn):原型模式可以用來創(chuàng)建新對(duì)象,但它創(chuàng)建的不是未初始化的對(duì)象,而是用原型對(duì)象(或樣本對(duì)象)的值初始化的對(duì)象。原型模式也稱為屬性模式。
原型模式在初始化業(yè)務(wù)對(duì)象時(shí)非常有用,業(yè)務(wù)對(duì)象的值與數(shù)據(jù)庫(kù)中的默認(rèn)值相匹配。原型對(duì)象中的默認(rèn)值被復(fù)制到新創(chuàng)建的業(yè)務(wù)對(duì)象中。
經(jīng)典編程語言很少使用原型模式,但是javascript作為一種原型語言,在構(gòu)造新對(duì)象及其原型時(shí)使用這種模式。
q20:判斷一個(gè)給定的字符串是否同構(gòu)。
難點(diǎn):如果兩個(gè)字符串同構(gòu),那么字符串a(chǎn)。中出現(xiàn)的所有字符都可以用另一個(gè)字符替換,從而得到字符串b,字符的順序必須保留。字符串a(chǎn)中的每個(gè)字符必須與字符串b中的每個(gè)字符一一對(duì)應(yīng)。
論文和標(biāo)題將返回true。蛋和傷心會(huì)返回假的。dgg和add將返回true。isio morphic( 雞蛋 , 添加 );//true isisomorphic( 紙張和飲料, 標(biāo)題和標(biāo)題。;);//true isisomorphic( 踢 , 側(cè)邊 );//false函數(shù)同構(gòu)(firststring,second string){//檢查長(zhǎng)度是否相等。如果不相等,則不能同構(gòu)if (firststring.length!== secondstring.length)返回false var letter map = { };for(var i = 0;i firststring.lengthi ) { var lettera = firststring[i],letterb = second string[i];//如果lettera不存在,則創(chuàng)建一個(gè)映射,并將letterb賦給它if(lettermap[lettera]= = undefined){ lettermap[lettera]= letterb;} else if (lettermap[lettera]!== letterb) {//如果lettera已經(jīng)存在于映射中,但不對(duì)應(yīng)letterb,//那么這意味著lettera對(duì)應(yīng)多個(gè)字符。返回false} }//迭代后,如果滿足條件,則返回true。//它們是同構(gòu)的。返回true}
問題21:什么是 運(yùn)輸與運(yùn)輸刻???
難度:對(duì)于語言中新增加的語法,不能進(jìn)行polyfill。因此,最好使用能夠?qū)⑿麓a轉(zhuǎn)換為舊代碼的工具。這個(gè)過程通常被稱為轉(zhuǎn)換,即轉(zhuǎn)換編譯。
通常,您會(huì)在構(gòu)建過程中添加一個(gè)transpiler,類似于linter或。迷你放大鏡.現(xiàn)在有許多優(yōu)秀的轉(zhuǎn)換器可供選擇:
巴別:把es6轉(zhuǎn)換成es5traceur:把es6和es7轉(zhuǎn)換成es5q22:什么是 這 關(guān)鍵詞?請(qǐng)?zhí)峁┮恍┐a示例。
難度:在javascript中,這指的是 所有者和所有者正在執(zhí)行的函數(shù),或者更準(zhǔn)確地說,它是指將當(dāng)前函數(shù)作為方法的對(duì)象。
函數(shù)foo(){ consol: obj1 ,foo: foo };var obj 2 = { bar: obj2 };foo();// 全球 obj 1 . foo();// obj1 foo . call(obj 2);// obj2 new foo();//未定義
q23:如何給數(shù)組對(duì)象添加自定義方法,以便下面的代碼可以運(yùn)行?
難度:vararr = [1,2,3,4,5];var avg = arr . average();console.log(平均值);
javascript不是基于類的,但它是一種基于原型的語言。這意味著每個(gè)對(duì)象鏈接到另一個(gè)對(duì)象(即對(duì)象的原型),并繼承原型對(duì)象的方法。您可以跟蹤每個(gè)對(duì)象的原型鏈,直到到達(dá)一個(gè)沒有原型的空對(duì)象。我們需要修改數(shù)組原型,以便向全局?jǐn)?shù)組對(duì)象添加方法。
array . prototype . average = function(){//計(jì)算sum var sum = this . reduce(function(prev,cur){ return prev cur;});//將sum除以元素個(gè)數(shù),返回sum/this . length;}var arr = [1,2,3,4,5];var avg = arr . average();console.log(平均值);// = 3
q24:javascript中的推廣操作是什么?
難點(diǎn):提升是javascript解釋器將所有變量和函數(shù)聲明移動(dòng)到當(dāng)前作用域頂部的操作。促銷有兩種類型:
變化數(shù)量推廣——非常少見的功能推廣——比較常見。無論var(或函數(shù)聲明)出現(xiàn)在作用域的什么地方,它都屬于整個(gè)作用域,可以在作用域的任何地方訪問。
var a = 2;foo();//函數(shù)foo(){ a = 3;console . log(a);//3 var a;//語句是 晉升與晉升到foo () }console.log( a)的頂部;// 2
問題25:以下代碼輸出的結(jié)果是什么?
難度:0.1 0.2 = = 0.3
這段代碼的輸出是false,這是由浮點(diǎn)數(shù)的內(nèi)部表示引起的。0.1 0.2不完全等于0.3,但實(shí)際結(jié)果是0.30000000000000004。解決這個(gè)問題的一個(gè)方法是在對(duì)小數(shù)執(zhí)行算術(shù)運(yùn)算時(shí)將結(jié)果四舍五入。
問題26:請(qǐng)描述揭示模塊模式設(shè)計(jì)模式。
難點(diǎn):揭示模塊模式是模塊模式的變種,目的是維護(hù)封裝性,將對(duì)象中返回的一些變量和方法公開。如下所示:
var exposer =(function(){ var private variable = 10;var private method = function(){ console . log( ;在私有方法中! );私有變量;} var method to expose = function(){ console . log( ;這是我要曝光的一個(gè)方法! );} var othermethodwindtoexpose = function(){ privat: method to expose,second: oth:這是我要揭露的一個(gè)方法!exposer . second();//在p中輸出:rivat www . full stack . cafe/blog/top26javascriptinterview問答in2019
了解更多undefined是什么軟件(軟件出現(xiàn)undefined是什么意思)相關(guān)內(nèi)容請(qǐng)關(guān)注本站點(diǎn)。