標籤:小數 輸出 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面試題總結