更新時(shí)間:2018年11月26日13時(shí)43分 來(lái)源:傳智播客 瀏覽次數(shù):
傳智播客整理的web前端JavaScript面試試題(附答案)
1.介紹js的基本數(shù)據(jù)類(lèi)型
Undefined、Null、Boolean、Number、String、ECMAScript 2015 新增:Symbol(創(chuàng)建后獨(dú)一無(wú)二且不可變的數(shù)據(jù)類(lèi)型 )
2.介紹js有哪些內(nèi)置對(duì)象?
Object 是 JavaScript 中所有對(duì)象的父對(duì)象
數(shù)據(jù)封裝類(lèi)對(duì)象:Object、Array、Boolean、Number 和 String
其他對(duì)象:Function、Arguments、Math、Date、RegExp、Error
3.說(shuō)幾條寫(xiě)JavaScript的基本規(guī)范?
(1)不要在同一行聲明多個(gè)變量。
(2)請(qǐng)使用 ===/!==來(lái)比較true/false或者數(shù)值
(3)使用對(duì)象字面量替代new Array這種形式
(4)不要使用全局函數(shù)。
(5)Switch語(yǔ)句必須帶有default分支
(6)函數(shù)不應(yīng)該有時(shí)候有返回值,有時(shí)候沒(méi)有返回值。
(7)For循環(huán)必須使用大括號(hào)
(8)If語(yǔ)句必須使用大括號(hào)
(9)for-in循環(huán)中的變量 應(yīng)該使用var關(guān)鍵字明確限定作用域,從而避免作用域污染。
4.JavaScript原型.原型鏈 ? 有什么特點(diǎn)?
每個(gè)對(duì)象都會(huì)在其內(nèi)部初始化一個(gè)屬性,就是prototype(原型),當(dāng)我們?cè)L問(wèn)一個(gè)對(duì)象的屬性時(shí),
如果這個(gè)對(duì)象內(nèi)部不存在這個(gè)屬性,那么他就會(huì)去prototype里找這個(gè)屬性,這個(gè)prototype又會(huì)有自己的prototype,
于是就這樣一直找下去,也就是我們平時(shí)所說(shuō)的原型鏈的概念。
關(guān)系:instance.constructor.prototype = instance.__proto__
特點(diǎn):
JavaScript對(duì)象是通過(guò)引用來(lái)傳遞的,我們創(chuàng)建的每個(gè)新對(duì)象實(shí)體中并沒(méi)有一份屬于自己的原型副本。當(dāng)我們修改原型時(shí),與之相關(guān)的對(duì)象也會(huì)繼承這一改變。
當(dāng)我們需要一個(gè)屬性的時(shí),Javascript引擎會(huì)先看當(dāng)前對(duì)象中是否有這個(gè)屬性, 如果沒(méi)有的話(huà),
就會(huì)查找他的Prototype對(duì)象是否有這個(gè)屬性,如此遞推下去,一直檢索到 Object 內(nèi)建對(duì)象。
function Func(){}
Func.prototype.name = "Sean";
Func.prototype.getInfo = function() {
return this.name;
}
var person = new Func();//現(xiàn)在可以參考var person = Object.create(oldObject);
console.log(person.getInfo());//它擁有了Func的屬性和方法
//"Sean"
console.log(Func.prototype);
// Func { name="Sean", getInfo=function()}
5.JavaScript有幾種類(lèi)型的值?,你能畫(huà)一下他們的內(nèi)存圖嗎?
棧:原始數(shù)據(jù)類(lèi)型(Undefined,Null,Boolean,Number、String)
堆:引用數(shù)據(jù)類(lèi)型(對(duì)象、數(shù)組和函數(shù))
兩種類(lèi)型的區(qū)別是:存儲(chǔ)位置不同;
原始數(shù)據(jù)類(lèi)型直接存儲(chǔ)在棧(stack)中的簡(jiǎn)單數(shù)據(jù)段,占據(jù)空間小、大小固定,屬于被頻繁使用數(shù)據(jù),所以放入棧中存儲(chǔ);
引用數(shù)據(jù)類(lèi)型存儲(chǔ)在堆(heap)中的對(duì)象,占據(jù)空間大、大小不固定。如果存儲(chǔ)在棧中,將會(huì)影響程序運(yùn)行的性能;引用數(shù)據(jù)類(lèi)型在棧中存儲(chǔ)了指針,該指針指向堆中該實(shí)體的起始地址。當(dāng)解釋器尋找引用值時(shí),會(huì)首先檢索其在棧中的地址,取得地址后從堆中獲得實(shí)體。
如何將字符串轉(zhuǎn)化為數(shù)字,例如'12.3b'?
* parseFloat('12.3b');
* 正則表達(dá)式,'12.3b'.match(/(\d)+(\.)?(\d)+/g)[0] * 1, 但是這個(gè)不太靠譜,提供一種思路而已。
如何將浮點(diǎn)數(shù)點(diǎn)左邊的數(shù)每三位添加一個(gè)逗號(hào),如12000000.11轉(zhuǎn)化為『12,000,000.11』?
function commafy(num){
return num && num
.toString()
.replace(/(\d)(?=(\d{3})+\.)/g, function($1, $2){
return $2 + ',';
});
}
如何實(shí)現(xiàn)數(shù)組的隨機(jī)排序?
方法一:
```javascript var arr = [1,2,3,4,5,6,7,8,9,10];
function randSort1(arr){
for(var i = 0,len = arr.length;i < len; i++ ){
var rand = parseInt(Math.random()*len);
var temp = arr[rand];
arr[rand] = arr[i];
arr[i] = temp;
}
return arr;
}
console.log(randSort1(arr));
```
方法二:
```javascript
var arr = [1,2,3,4,5,6,7,8,9,10];
function randSort2(arr){
var mixedArray = [];
while(arr.length > 0){
var randomIndex = parseInt(Math.random()*arr.length);
mixedArray.push(arr[randomIndex]);
arr.splice(randomIndex, 1);
}
return mixedArray;
}
console.log(randSort2(arr));
```
方法三:
```javascript
var arr = [1,2,3,4,5,6,7,8,9,10];
arr.sort(function(){
return Math.random() - 0.5;
})
console.log(arr);
```
Javascript如何實(shí)現(xiàn)繼承?
1、構(gòu)造繼承
2、原型繼承
3、實(shí)例繼承
4、拷貝繼承
原型prototype機(jī)制或apply和call方法去實(shí)現(xiàn)較簡(jiǎn)單,建議使用構(gòu)造函數(shù)與原型混合方式。
```javascript
function Parent(){
this.name = 'wang';
}
function Child(){
this.age = 28;
}
Child.prototype = new Parent();//繼承了Parent,通過(guò)原型
var demo = new Child();
alert(demo.age);
alert(demo.name);//得到被繼承的屬性
```
上面是傳智播客整理的關(guān)于web前端面試試題部分,希望可以幫到你。北京校區(qū)