js面試題總結

來源:互聯網
上載者:User

標籤:小數   輸出   js面試   var   erro   false   計算   語言   數值   

1.typeof和Object.prototype.toString

typeof是js裡面判斷變數類型的一種方法,但這種方法沒有Object.prototype.toString準確,前者有5種判斷結果,分別是function,string,number,object,undefined,後者有7中判斷結果,分別是[object Function],[object Number],[object String],[object Object],[object Array],[object Null],[object Undefined]。typeof對於數字類型,null類型以及數群組類型的判斷不如Object.prototype.toString準確。

下面是我的測試代碼和運行結果:

        function func(){        }        var str="str";        var num=1;        var dou=3.14;        var num_obj=new Number(1);        function Person(name){            this.name=name;        }        var person=new Person("hexiang");        var nul=null;        var undef=undefined;        var arry=[];        var obj={};        console.log("-----typeof-----");        console.log("func:"+typeof func);        console.log("str:"+typeof str);        console.log("num:"+typeof num);        console.log("num_obj:"+typeof num_obj);        console.log("dou:"+typeof dou);        console.log("person:"+typeof person);        console.log("nul:"+typeof nul);        console.log("undef:"+typeof undef);        console.log("arry:"+typeof arry);        console.log("obj:"+typeof obj);        console.log("null:"+typeof null);
console.log("unknown variable:"+typeof unknownvar) console.log("-----toString-----"); console.log("func:"+Object.prototype.toString.call(func)); console.log("str:"+Object.prototype.toString.call(str)); console.log("num:"+Object.prototype.toString.call(num)); console.log("num_obj:"+Object.prototype.toString.call(num_obj)); console.log("dou:"+Object.prototype.toString.call(dou)); console.log("person:"+Object.prototype.toString.call(person)); console.log("nul:"+Object.prototype.toString.call(nul)); console.log("undef:"+Object.prototype.toString.call(undef)); console.log("arry:"+Object.prototype.toString.call(arry)); console.log("obj:"+Object.prototype.toString.call(obj)); console.log("null:"+Object.prototype.toString.call(null));

結果如下:

-----typeof-----
 func:function
 str:string
 num:number
 num_obj:object
 dou:number
 person:object
 nul:object
 undef:undefined
 arry:object
 obj:object
 null:object

unknown variable:undefined

 -----toString-----
 func:[object Function]
 str:[object String]
 num:[object Number]
 num_obj:[object Number]
 dou:[object Number]
 person:[object Object]
 nul:[object Null]
 undef:[object Undefined]
 arry:[object Array]
 obj:[object Object]
 null:[object Null]

2.false和==,===

==號向來是不嚴謹的,比如‘1‘==1是true的,而‘1‘===1則是false的,特別是當[],0,“”,"0"和false進行比較時,用==都會返回true, ===都會返回false。不過注意null和undefined和false進行比較時,不管是用==還是===都是false的。

3.局部變數和全域變數,連續賦值

以下代碼

var a=b=3;

是連續賦值,相當於先執行b=3;再執行var a=b;所以這個時候a,b都是全域變數,這個時候列印a,b肯定都是3,沒毛病。

但是下面代碼:

(function(){    var a=b=3    })();

雖然也是先執行b=3,再執行var a=b;但由於代碼是包含在閉包中的,所以有var聲明的a就是局部變數,沒有var聲明的b就是全域變數,此時從全域角度來看b是3,a是undefined。

4.this

var myObject={        foo:"bar",        func:function(){            var self=this;            console.log("outer func:this.foo="+this.foo);            console.log("outer func:self.foo="+self.foo);            (function(){                console.log("inner func:this.foo="+this.foo);                console.log("inner func:self.foo="+self.foo);            })();        }    };    myObject.func();

輸出:

outer func:this.foo=bar
outer func:self.foo=bar
inner func:this.foo=undefined
inner func:self.foo=bar

注意this在javascript裡面根據函數域的不同而不同,(function(){})()是myObject.func()裡的一個閉包,形成了一個獨立的函數域,因此this在myObject.func裡指的是myObject這個對象,在閉包裡指的是window對象。

5.strict 模式 use strict 的使用及作用

"use strict"; 放在指令碼第一行,則下面的所有代碼都執行strict 模式,放在函數的第一行,則函數裡的所有代碼都執行strict 模式。那麼strict 模式與正常模式有什麼區別呢?

(1)strict 模式下不允許不聲明就賦值。正常模式下a=2是不會有錯的,strict 模式下會報"Uncaught ReferenceError: a is not defined",包括var a=b=2這樣的賦值在strict 模式下也是不允許的,3裡面提到過。

(2)禁止使用with,eval有自己的範圍了(相當於閉包了)

(3)禁止函數中的this指向全域對象,例如下面代碼

function hello(){    console.log(this);}hello();

會輸出window對象,但是如果hello函數第一行加上“use strict”;會輸出undefined

(4)禁止使用caller,arguments.callee等

(5)禁止函數形參重名

(6)禁止使用八位元字,如012,正常模式下相當於數字10,但是在strict 模式下會報錯

(7)public,protected,private,implements,interface,package,let,yield,static等關鍵詞不允許使用

(8)還有其他的一些用的比較生辟的,這裡就不再贅述了。

 6.奇怪的分號

下面兩個函數的傳回值分別時2和undefined

function a(){        return {            a:2        };    }    function b(){        return         {            a:2        };    }

因為js中分號並不像c++,java那樣是必須的,很多時候js代碼只要獨立成行的寫,解析器會根據能否正常編譯來自動判斷是否應該有分號。return,break,continue這樣的關鍵詞後面緊跟換行的話,解析器一定會在後面自動添加分號,於是b函數相當於

    function b(){        return;         {            a:22        };    }

7.NaN是啥?

NaN是not a number的縮寫,是一種特殊的Number類型的數值(這他媽太奇怪了),toString.call(NaN)的結果你會發現是[object Number],isNaN可以判斷一個變數(字串,數字)能否轉化為數字,返回true時表示不行,返回false是表示可以。

8.js浮點型計算

和java等多數語言一樣,js裡0.1+0.02並不等於0.12,而是後面有一長串的小數,我們可以自己實現方法進行準確的計算,比較好的一個方法就是先升冪後降冪的方法。非常簡短,如下:

function add(n1,n2){       var d1=((n1+"").split(".")[1]).length;       var d2=((n2+"").split(".")[1]).length;       var r=Math.pow(10,Math.max(d1,d2));       return (n1*r+n2*r)/r;}

9.使用定時器解決堆疊溢位的問題

下面代碼在隊列巨大的時候會導致堆疊溢位,

function bar(){        var n=list.pop();        //do something        if(n!=null){            bar();        } }

解決堆疊溢位的一個很好的方法是使用定時器,當然這會帶來非同步問題,請注意。

function bar(){        var n=list.pop();        //do something        if(n!=null){            setTimeout(bar,0);        }    }

10.&& 和||執行順序

舉個簡單的例子吧,0&&1||2返回2,0||1&&2返回2

 

js面試題總結

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.