在前端開(kāi)發(fā)中,JavaScript(以下簡(jiǎn)稱JS)是一種非常重要的編程語(yǔ)言。因此,JS基礎(chǔ)面試題成為了面試前端工程師的常見(jiàn)問(wèn)題之一。想要順利進(jìn)入一家優(yōu)秀公司,掌握J(rèn)S的基礎(chǔ)知識(shí)是必不可少的。
一、JS中的變量類型
JS中有五種基本數(shù)據(jù)類型:undefined、null、boolean、number、string。其中undefined指的是變量未定義,而null表示變量的值為空。而boolean代表真或假,number和string則分別代表數(shù)字和字符串。此外,JS還有一種復(fù)雜數(shù)據(jù)類型——對(duì)象(Object)。
// 示例代碼 var a; console.log(a); // 輸出: undefined var b = null; console.log(b); // 輸出: null var c = true; console.log(c); // 輸出: true var d = 10; console.log(d); // 輸出: 10 var e = "Hello World"; console.log(e); // 輸出: Hello World var f = {name: "David", age: 20}; console.log(f); // 輸出: Object { name: "David", age: 20 }二、JS中的變量作用域 變量作用域指的是變量的生命周期和可見(jiàn)范圍。在JS中,變量的作用域分為全局作用域和局部作用域。全局作用域代表著整個(gè)代碼的生命周期,而局部作用域代表著某個(gè)函數(shù)或代碼塊的生命周期。在函數(shù)內(nèi)部定義的變量是局部變量,而在函數(shù)外定義的變量則是全局變量。
// 示例代碼 var a = 10; // 全局變量 function test() { var b = 20; // 局部變量 console.log(a, b); // 輸出: 10, 20 } test(); console.log(a, b); // 輸出: 10, undefined三、JS中的數(shù)據(jù)類型轉(zhuǎn)換 在JS中,不同的數(shù)據(jù)類型之間可以相互轉(zhuǎn)換。比如,可以將字符串轉(zhuǎn)換成數(shù)字,也可以將布爾值轉(zhuǎn)換成字符串等等。在字符串和數(shù)字之間的轉(zhuǎn)換中,字符串可以通過(guò)Number()方法轉(zhuǎn)換成數(shù)字,數(shù)字也可以通過(guò)String()方法轉(zhuǎn)換成字符串。而在布爾值和字符串之間的轉(zhuǎn)換中,非空字符串為真,空字符串為假,反之亦然。
// 示例代碼 var a = "10"; console.log(Number(a)); // 輸出: 10 var b = 20; console.log(String(b)); // 輸出: "20" var c = "Hello World"; console.log(Boolean(c)); // 輸出: true var d = ""; console.log(Boolean(d)); // 輸出: false四、JS中的閉包 閉包是指函數(shù)和它所在的環(huán)境(詞法環(huán)境)的組合,其中函數(shù)可以訪問(wèn)父級(jí)域中的變量。在JS中,由于變量的作用域問(wèn)題,內(nèi)部函數(shù)無(wú)法訪問(wèn)外部函數(shù)中的變量。但是,可以通過(guò)閉包的方式,將外部函數(shù)中的變量保存在內(nèi)部函數(shù)中,從而實(shí)現(xiàn)對(duì)其進(jìn)行訪問(wèn)。
// 示例代碼 function createCounter() { var counter = 0; return function () { counter++; console.log(counter); }; } var counter1 = createCounter(); counter1(); // 輸出: 1 counter1(); // 輸出: 2 counter1(); // 輸出: 3 var counter2 = createCounter(); counter2(); // 輸出: 1 counter2(); // 輸出: 2五、JS中的原型和繼承 在面向?qū)ο缶幊讨校^承是非常重要的一部分。在JS中,繼承是通過(guò)原型(prototype)來(lái)實(shí)現(xiàn)的。原型是一個(gè)對(duì)象,它包含了其他對(duì)象共享的屬性和方法。每一個(gè)JS對(duì)象都有一個(gè)原型對(duì)象,它可以通過(guò)對(duì)象的__proto__屬性來(lái)訪問(wèn)。當(dāng)我們?cè)L問(wèn)一個(gè)對(duì)象的屬性或方法時(shí),如果這個(gè)對(duì)象自身沒(méi)有這個(gè)屬性或方法,就會(huì)在它的原型對(duì)象上查找,直到找到為止。
// 示例代碼 function Animal(name) { this.name = name; } Animal.prototype.sayName = function () { console.log(this.name); }; function Dog(name, breed) { Animal.call(this, name); this.breed = breed; } Dog.prototype = Object.create(Animal.prototype); Dog.prototype.constructor = Dog; Dog.prototype.sayBreed = function () { console.log(this.breed); }; var dog = new Dog("Tommy", "Bulldog"); dog.sayName(); // 輸出: Tommy dog.sayBreed(); // 輸出: Bulldog在JS中,面試官常常會(huì)就以上問(wèn)題進(jìn)行提問(wèn),因此通讀這篇文章并深入理解其背后的原理與思想將大有益處。