前端面試那些坑之JavaScript(一)

JavaScript

1、介紹js的基本數(shù)據(jù)類型。

Undefined渣蜗、Null屠尊、Boolean、Number耕拷、String讼昆、

ECMAScript 2015新增:Symbol(創(chuàng)建后獨一無二且不可變的數(shù)據(jù)類型)

2、介紹js有哪些內(nèi)置對象骚烧?

Object是JavaScript中所有對象的父對象

數(shù)據(jù)封裝類對象:Object浸赫、Array、Boolean赃绊、Number和String

其他對象:Function既峡、Arguments、Math碧查、Date运敢、RegExp、Error

3忠售、說幾條寫JavaScript的基本規(guī)范传惠?

(1)不要在同一行聲明多個變量。

(2)請使用===/!==來比較true/false或者數(shù)值

(3)使用對象字面量替代new Array這種形式

(4)不要使用全局函數(shù)稻扬。

(5)Switch語句必須帶有default分支

(6)函數(shù)不應(yīng)該有時候有返回值卦方,有時候沒有返回值。

(7)For循環(huán)必須使用大括號

(8)If語句必須使用大括號

(9)for-in循環(huán)中的變量應(yīng)該使用var關(guān)鍵字明確限定作用域泰佳,從而避免作用域污染盼砍。

4、JavaScript原型乐纸,原型鏈?有什么特點衬廷?

每個對象都會在其內(nèi)部初始化一個屬性,就是prototype(原型)汽绢,當(dāng)我們訪問一個對象的屬性時吗跋,

如果這個對象內(nèi)部不存在這個屬性,那么他就會去prototype里找這個屬性宁昭,這個prototype又會有自己的prototype跌宛,

于是就這樣一直找下去,也就是我們平時所說的原型鏈的概念积仗。

關(guān)系:instance.constructor.prototype = instance.__proto__

特點:

JavaScript對象是通過引用來傳遞的疆拘,我們創(chuàng)建的每個新對象實體中并沒有一份屬于自己的原型副本。當(dāng)我們修改原型時寂曹,與之相關(guān)的對象也會繼承這一改變哎迄。

當(dāng)我們需要一個屬性的時回右,Javascript引擎會先看當(dāng)前對象中是否有這個屬性,如果沒有的話漱挚,

就會查找他的Prototype對象是否有這個屬性翔烁,如此遞推下去,一直檢索到Object內(nèi)建對象旨涝。

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有幾種類型的值?白华,你能畫一下他們的內(nèi)存圖嗎慨默?

棧:原始數(shù)據(jù)類型(Undefined,Null弧腥,Boolean厦取,Number、String)

堆:引用數(shù)據(jù)類型(對象鸟赫、數(shù)組和函數(shù))

兩種類型的區(qū)別是:存儲位置不同蒜胖;

原始數(shù)據(jù)類型直接存儲在棧(stack)中的簡單數(shù)據(jù)段,占據(jù)空間小抛蚤、大小固定,屬于被頻繁使用數(shù)據(jù)寻狂,所以放入棧中存儲岁经;

引用數(shù)據(jù)類型存儲在堆(heap)中的對象,占據(jù)空間大、大小不固定蛇券。如果存儲在棧中缀壤,將會影響程序運行的性能;引用數(shù)據(jù)類型在棧中存儲了指針纠亚,該指針指向堆中該實體的起始地址塘慕。當(dāng)解釋器尋找引用值時,會首先檢索其在棧中的地址蒂胞,取得地址后從堆中獲得實體


JavaScript有幾種類型的值

6图呢、如何將字符串轉(zhuǎn)化為數(shù)字,例如'12.3b'?

* parseFloat('12.3b');

*正則表達式骗随,'12.3b'.match(/(\d)+(\.)?(\d)+/g)[0]* 1,但是這個不太靠譜蛤织,提供一種思路而已。

7鸿染、如何將浮點數(shù)點左邊的數(shù)每三位添加一個逗號指蚜,如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 + ',';

});

}

8、如何實現(xiàn)數(shù)組的隨機排序涨椒?

方法一:```javascriptvar 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);

```

9摊鸡、Javascript如何實現(xiàn)繼承绽媒?

(1)構(gòu)造繼承

(2)原型繼承

(3)實例繼承

(4)拷貝繼承

原型prototype機制或apply和call方法去實現(xiàn)較簡單,建議使用構(gòu)造函數(shù)與原型混合方式免猾。

```javascript

function Parent(){

this.name = 'wang';

}

function Child(){

this.age = 28;

}

Child.prototype = new Parent();//繼承了Parent些椒,通過原型

var demo = new Child();

alert(demo.age);

alert(demo.name);//得到被繼承的屬性

```

10、javascript創(chuàng)建對象的幾種方式掸刊?

javascript創(chuàng)建對象簡單的說,無非就是使用內(nèi)置對象或各種自定義對象免糕,當(dāng)然還可以用JSON;但寫法有很多種忧侧,也能混合使用石窑。

(1)對象字面量的方式

person={firstname:"Mark",lastname:"Yun",age:25,eyecolor:"black"};

(2)用function來模擬無參的構(gòu)造函數(shù)

function Person(){}

var person=new Person();//定義一個function,如果使用new"實例化",該function可以看作是一個Class

person.name="Mark";

person.age="25";

person.work=function(){

alert(person.name+" hello...");

}

person.work();

(3)用function來模擬參構(gòu)造函數(shù)來實現(xiàn)(用this關(guān)鍵字定義構(gòu)造的上下文屬性)

function Pet(name,age,hobby){

this.name=name;//this作用域:當(dāng)前對象

this.age=age;

this.hobby=hobby;

this.eat=function(){

alert("我叫"+this.name+",我喜歡"+this.hobby+",是個程序員");

}

}

var maidou =new Pet("麥兜",25,"coding");//實例化蚓炬、創(chuàng)建對象

maidou.eat();//調(diào)用eat方法

(4)用工廠方式來創(chuàng)建(內(nèi)置對象)

var wcDog =new Object();

wcDog.name="旺財";

wcDog.age=3;

wcDog.work=function(){

alert("我是"+wcDog.name+",汪汪汪......");

}

wcDog.work();

(5)用原型方式來創(chuàng)建

function Dog(){

}

Dog.prototype.name="旺財";

Dog.prototype.eat=function(){

alert(this.name+"是個吃貨");

}

var wangcai =new Dog();

wangcai.eat();

(6)用混合方式來創(chuàng)建

function Car(name,price){

this.name=name;

this.price=price;

}

Car.prototype.sell=function(){

alert("我是"+this.name+"松逊,我現(xiàn)在賣"+this.price+"萬元");

}

var camry =new Car("凱美瑞",27);

camry.sell();

11、Javascript作用鏈域?

全局函數(shù)無法查看局部函數(shù)的內(nèi)部細節(jié)肯夏,但局部函數(shù)可以查看其上層的函數(shù)細節(jié)经宏,直至全局細節(jié)。

當(dāng)需要從局部函數(shù)查找某一屬性或方法時驯击,如果當(dāng)前作用域沒有找到烁兰,就會上溯到上層作用域查找,

直至全局函數(shù)徊都,這種組織形式就是作用域鏈沪斟。

12、談?wù)凾his對象的理解暇矫。

this總是指向函數(shù)的直接調(diào)用者(而非間接調(diào)用者)主之;

如果有new關(guān)鍵字,this指向new出來的那個對象李根;

在事件中槽奕,this指向觸發(fā)這個事件的對象,特殊的是房轿,IE中的attachEvent中的this總是指向全局對象Window粤攒;

13、eval是做什么的冀续?

它的功能是把對應(yīng)的字符串解析成JS代碼并運行琼讽;

應(yīng)該避免使用eval,不安全洪唐,非常耗性能(2次钻蹬,一次解析成js語句,一次執(zhí)行)凭需。

由JSON字符串轉(zhuǎn)換為JSON對象的時候可以用eval问欠,var obj =eval('('+ str +')');

14肝匆、什么是window對象?什么是document對象?

window對象是指瀏覽器打開的窗口。

document對象是Documentd對象(HTML文檔對象)的一個只讀引用顺献,window對象的一個屬性旗国。

15、null注整,undefined的區(qū)別能曾?

null表示一個對象是“沒有值”的值,也就是值為“空”肿轨;

undefined表示一個變量聲明了沒有初始化(賦值)寿冕;

undefined不是一個有效的JSON,而null是椒袍;

undefined的類型(typeof)是undefined驼唱;

null的類型(typeof)是object;

Javascript將未賦值的變量默認值設(shè)為undefined驹暑;

Javascript從來不會將變量設(shè)為null玫恳。它是用來讓程序員表明某個用var聲明的變量時沒有值的。

typeof undefined

//"undefined"

undefined :是一個表示"無"的原始值或者說表示"缺少值"优俘,就是此處應(yīng)該有一個值京办,但是還沒有定義兼吓。當(dāng)嘗試讀取時會返回undefined臂港;

例如變量被聲明了,但沒有賦值時视搏,就等于undefined

typeof null

//"object"

null :是一個對象(空對象,沒有任何屬性和方法);

例如作為函數(shù)的參數(shù)县袱,表示該函數(shù)的參數(shù)不是對象浑娜;

注意:

在驗證null時,一定要使用===式散,因為==無法分別null和undefined

null == undefined // true

null=== undefined // false

再來一個例子:

null

Q:有張三這個人么筋遭?

A:有!

Q:張三有房子么暴拄?

A:沒有漓滔!

undefined

Q:有張三這個人么?

A:有乖篷!

Q:張三有多少歲响驴?

A:不知道(沒有被告訴)

16、寫一個通用的事件偵聽器函數(shù)撕蔼。

// event(事件)工具集豁鲤,來源:github.com/markyun

markyun.Event = {

//頁面加載完成后

readyEvent : function(fn) {

if (fn==null) {

fn=document;

}

var oldonload = window.onload;

if (typeof window.onload != 'function') {

window.onload = fn;

} else {

window.onload = function() {

oldonload();

fn();

};

}

},

//視能力分別使用dom0||dom2||IE方式來綁定事件

//參數(shù):操作的元素,事件名稱,事件處理程序

addEvent : function(element, type, handler) {

if (element.addEventListener) {

//事件類型秽誊、需要執(zhí)行的函數(shù)、是否捕捉

element.addEventListener(type,handler, false);

} else if (element.attachEvent) {

element.attachEvent('on' +type, function() {

handler.call(element);

});

} else {

element['on' + type] = handler;

}

},

//移除事件

removeEvent : function(element, type, handler) {

if (element.removeEventListener) {

element.removeEventListener(type, handler, false);

} else if (element.datachEvent) {

element.detachEvent('on' +type, handler);

} else {

element['on' + type] = null;

}

},

//阻止事件(主要是事件冒泡琳骡,因為IE不支持事件捕獲)

stopPropagation : function(ev) {

if (ev.stopPropagation) {

ev.stopPropagation();

} else {

ev.cancelBubble = true;

}

},

//取消事件的默認行為

preventDefault : function(event) {

if (event.preventDefault) {

event.preventDefault();

} else {

event.returnValue = false;

}

},

//獲取事件目標

getTarget : function(event) {

return event.target || event.srcElement;

},

//獲取event對象的引用锅论,取到事件的所有信息,確保隨時能使用event楣号;

getEvent : function(e) {

var ev = e || window.event;

if (!ev) {

var c = this.getEvent.caller;

while (c) {

ev = c.arguments[0];

if (ev && Event ==ev.constructor) {

break;

}

c = c.caller;

}

}

return ev;

}

};

17最易、["1","2", "3"].map(parseInt)答案是多少?

parseInt()函數(shù)能解析一個字符串炫狱,并返回一個整數(shù)藻懒,需要兩個參數(shù)(val, radix),

其中radix表示要解析的數(shù)字的基數(shù)毕荐∈觯【該值介于2 ~ 36之間,并且字符串中的數(shù)字不能大于radix才能正確返回數(shù)字結(jié)果值】;

但此處map傳了3個(element, index, array),我們重寫parseInt函數(shù)測試一下是否符合上面的規(guī)則憎亚。

function parseInt(str, radix) {

return str+'-'+radix;

};

var a=["1", "2","3"];

a.map(parseInt);? // ["1-0", "2-1","3-2"]不能大于radix

因為二進制里面员寇,沒有數(shù)字3,導(dǎo)致出現(xiàn)超范圍的radix賦值和不合法的進制解析,才會返回NaN

所以["1", "2", "3"].map(parseInt)答案也就是:[1,NaN, NaN]

18第美、事件是蝶锋?IE與火狐的事件機制有什么區(qū)別?如何阻止冒泡什往?

(1)我們在網(wǎng)頁中的某個操作(有的操作對應(yīng)多個事件)扳缕。例如:當(dāng)我們點擊一個按鈕就會產(chǎn)生一個事件。是可以被JavaScript偵測到的行為别威。

(2)事件處理機制:IE是事件冒泡躯舔、Firefox同時支持兩種事件模型,也就是:捕獲型事件和冒泡型事件省古;

(3)ev.stopPropagation();(舊ie的方法ev.cancelBubble = true;)

19粥庄、什么是閉包(closure),為什么要用它豺妓?

閉包是指有權(quán)訪問另一個函數(shù)作用域中變量的函數(shù)惜互,創(chuàng)建閉包的最常見的方式就是在一個函數(shù)內(nèi)創(chuàng)建另一個函數(shù),通過另一個函數(shù)訪問這個函數(shù)的局部變量,利用閉包可以突破作用鏈域琳拭,將函數(shù)內(nèi)部的變量和方法傳遞到外部训堆。

閉包的特性:

(1)函數(shù)內(nèi)再嵌套函數(shù)

(2)內(nèi)部函數(shù)可以引用外層的參數(shù)和變量

(3)參數(shù)和變量不會被垃圾回收機制回收

//li節(jié)點的onclick事件都能正確的彈出當(dāng)前被點擊的li索引

    index = 0

    index = 1

    index = 2

    index = 3

    var nodes = document.getElementsByTagName("li");

    for(i = 0;i

    nodes[i].onclick = (function(i){

    return function() {

    console.log(i);

    } //不用閉包的話,值每次都是4

    })(i);

    }

    執(zhí)行say667()后,say667()閉包內(nèi)部變量會存在,而閉包內(nèi)部函數(shù)的內(nèi)部變量不會存在

    使得Javascript的垃圾回收機制GC不會收回say667()所占用的資源

    因為say667()的內(nèi)部函數(shù)的執(zhí)行需要依賴say667()中的變量

    這是對閉包作用的非常直白的描述

    function say667() {

    // Local variable that ends up within closure

    var num = 666;

    var sayAlert = function() {

    alert(num);

    }

    num++;

    return sayAlert;

    }

    varsayAlert = say667();

    sayAlert()//執(zhí)行結(jié)果應(yīng)該彈出的667

    20白嘁、javascript代碼中的"usestrict";是什么意思?使用它區(qū)別是什么坑鱼?

    use strict是一種ECMAscript 5添加的(嚴格)運行模式,這種模式使得Javascript在更嚴格的條件下運行,

    使JS編碼更加規(guī)范化的模式,消除Javascript語法的一些不合理、不嚴謹之處权薯,減少一些怪異行為姑躲。

    默認支持的糟糕特性都會被禁用睡扬,比如不能用with,也不能在意外的情況下給全局變量賦值;

    全局變量的顯示聲明,函數(shù)必須聲明在頂層黍析,不允許在非函數(shù)代碼塊內(nèi)聲明函數(shù),arguments.callee也不允許使用卖怜;

    消除代碼運行的一些不安全之處,保證代碼運行的安全,限制函數(shù)中的arguments修改阐枣,嚴格模式下的eval函數(shù)的行為和非嚴格模式的也不相同;

    提高編譯器效率马靠,增加運行速度;

    為未來新版本的Javascript標準化做鋪墊蔼两。


    京程一燈甩鳄,夢起的地方,我們始終相信通過努力额划,可以改變自己的命運妙啃。

    我們始終相信,通過堅持不懈俊戳,可以為大家解決更多的前端技術(shù)問題揖赴。

    我們始終相信,時間可以證明抑胎,我們可以為廣大IT從業(yè)者解決前端學(xué)習(xí)路線燥滑。

    HTML5,CSS3阿逃,Web前端铭拧,jquery,javascript恃锉,前端學(xué)習(xí)路線搀菩,各類問題,我們都可以為你解決破托。

    更多技術(shù)好文秕磷,前端問題,面試技巧炼团,請關(guān)注京程一燈(原一燈學(xué)堂)

    最后編輯于
    ?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
    • 序言:七十年代末,一起剝皮案震驚了整個濱河市疏尿,隨后出現(xiàn)的幾起案子瘟芝,更是在濱河造成了極大的恐慌,老刑警劉巖褥琐,帶你破解...
      沈念sama閱讀 216,470評論 6 501
    • 序言:濱河連續(xù)發(fā)生了三起死亡事件锌俱,死亡現(xiàn)場離奇詭異,居然都是意外死亡敌呈,警方通過查閱死者的電腦和手機贸宏,發(fā)現(xiàn)死者居然都...
      沈念sama閱讀 92,393評論 3 392
    • 文/潘曉璐 我一進店門造寝,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人吭练,你說我怎么就攤上這事诫龙。” “怎么了鲫咽?”我有些...
      開封第一講書人閱讀 162,577評論 0 353
    • 文/不壞的土叔 我叫張陵签赃,是天一觀的道長。 經(jīng)常有香客問我分尸,道長锦聊,這世上最難降的妖魔是什么? 我笑而不...
      開封第一講書人閱讀 58,176評論 1 292
    • 正文 為了忘掉前任箩绍,我火速辦了婚禮孔庭,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘材蛛。我一直安慰自己圆到,他們只是感情好,可當(dāng)我...
      茶點故事閱讀 67,189評論 6 388
    • 文/花漫 我一把揭開白布仰税。 她就那樣靜靜地躺著构资,像睡著了一般。 火紅的嫁衣襯著肌膚如雪陨簇。 梳的紋絲不亂的頭發(fā)上吐绵,一...
      開封第一講書人閱讀 51,155評論 1 299
    • 那天,我揣著相機與錄音河绽,去河邊找鬼己单。 笑死,一個胖子當(dāng)著我的面吹牛耙饰,可吹牛的內(nèi)容都是我干的纹笼。 我是一名探鬼主播,決...
      沈念sama閱讀 40,041評論 3 418
    • 文/蒼蘭香墨 我猛地睜開眼苟跪,長吁一口氣:“原來是場噩夢啊……” “哼廷痘!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起件已,我...
      開封第一講書人閱讀 38,903評論 0 274
    • 序言:老撾萬榮一對情侶失蹤笋额,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后篷扩,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體兄猩,經(jīng)...
      沈念sama閱讀 45,319評論 1 310
    • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
      茶點故事閱讀 37,539評論 2 332
    • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了枢冤。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片鸠姨。...
      茶點故事閱讀 39,703評論 1 348
    • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖淹真,靈堂內(nèi)的尸體忽然破棺而出讶迁,到底是詐尸還是另有隱情,我是刑警寧澤趟咆,帶...
      沈念sama閱讀 35,417評論 5 343
    • 正文 年R本政府宣布添瓷,位于F島的核電站,受9級特大地震影響值纱,放射性物質(zhì)發(fā)生泄漏鳞贷。R本人自食惡果不足惜,卻給世界環(huán)境...
      茶點故事閱讀 41,013評論 3 325
    • 文/蒙蒙 一虐唠、第九天 我趴在偏房一處隱蔽的房頂上張望搀愧。 院中可真熱鬧,春花似錦疆偿、人聲如沸咱筛。這莊子的主人今日做“春日...
      開封第一講書人閱讀 31,664評論 0 22
    • 文/蒼蘭香墨 我抬頭看了看天上的太陽迅箩。三九已至,卻和暖如春处铛,著一層夾襖步出監(jiān)牢的瞬間饲趋,已是汗流浹背。 一陣腳步聲響...
      開封第一講書人閱讀 32,818評論 1 269
    • 我被黑心中介騙來泰國打工撤蟆, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留奕塑,地道東北人。 一個月前我還...
      沈念sama閱讀 47,711評論 2 368
    • 正文 我出身青樓家肯,卻偏偏與公主長得像龄砰,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子讨衣,可洞房花燭夜當(dāng)晚...
      茶點故事閱讀 44,601評論 2 353

    推薦閱讀更多精彩內(nèi)容