1. 程式人生 > >[java學習6]你有必要知道的25個JavaScript面試題

[java學習6]你有必要知道的25個JavaScript面試題

/**轉:你有必要知道的25個JavaScript面試題
 *原文:http://www.jb51.net/article/77140.htm
 *看到這個文章,覺得js還有很多東西要弄明白。我把目前能接受的執行一下,這裡做個記錄吧。
 **/
/**型別判斷
 * 看來Object.prototype.toString.call這個比typeof更精準了,得記住。
 * */
function fun() {
}
var obj = {};
var arr = [];
console.log(typeof(obj));//object
console.log(typeof(arr));//object
console
.log(typeof(fun));//function console.log(typeof(obj) === typeof(arr));//true console.log(Object.prototype.toString.call(obj));//[object Object] console.log(Object.prototype.toString.call(arr));//[object Array] console.log(Object.prototype.toString.call(fun));//[object Function] console.log(Object.prototype.toString
.call(obj) === Object.prototype.toString.call(arr));//false /**this作用域 * 自動執行的函式它的呼叫這居然是window,這也就不奇怪了自執行函式的this.foo是為定義的。 * */ var myObject = { foo: "bar", func: function () { var self = this; console.log(this.foo);//bar console.log(self.foo);//bar (function () { console.log(Object.prototype
.toString.call(this));//[object Window] console.log(this.foo);//undefine console.log(self.foo);//bar })(); } }; myObject.func(); /*------------------------------------------------------------*/ function test(){ alert(this); } var obj=function(){}; obj.objTest=test;//宣告+定義直接幹了,這樣寫看的很不習慣啊。 test();//[object Window] obj.objTest();//function(){} /**IIFE(Immediately-Invoked Function Expression)立即執行函式表示式 *注意:1,for迴圈是不帶作用域的,使用的全是全域性變數。 * 2,setTimeout表示xxx毫秒後執行。 * */ for (var i = 0; i < 5; i++) { setTimeout(function () { console.log(i); }, 1000);//輸出5個"5" } /*------------------------------------------------------------*/ for (var i = 0; i < 5; i++) { var b = 2; } setTimeout(function () { console.log(Object.prototype.toString.call(this));//[object Window] console.log(this.i);//5 console.log(this.b);//2 }, 1000); /*------------------------------------------------------------*/ for (var i = 0; i < 5; i++) { (function (i) { setTimeout(function () { console.log(i); }, 1000); })(i);//輸出0,1,2,3,4 } /**一個小坑 *對於 return 、break、continue 等語句,如果後面緊跟換行,解析器一定會自動在後面填充分號(;), * */ function foo1() { return { bar: "hello" }; } function foo2() { return //關鍵看這裡。 { bar: "hello" }; } console.log(foo1());//Object {bar: "hello"} console.log(foo2());//undefine /**浮點數處理 *浮點的運算一直是bug來源,先寫在這裡吧,這個思路以後肯定能用到。 * */ function add(num1, num2) { var r1, r2, m; //先轉換字串,然後通過.分割,然後去小數部分,然後求長度。 r1 = ('' + num1).split('.')[1].length; r2 = ('' + num2).split('.')[1].length; m = Math.pow(10, Math.max(r1, r2)); return (num1 * m + num2 * m) / m; } console.log(0.1 + 0.2); //0.30000000000000004 console.log(add(0.1 + 0.2));//0.3 /**陣列的賦值、push、slice * slice()生成新的陣列;reverse返回本身引用 * slice() 方法可從已有的陣列中返回選定的元素。 * arrayObject.slice(start,end) * 引數 描述 start 必需。規定從何處開始選取。如果是負數,那麼它規定從陣列尾部開始算起的位置。 也就是說,-1 指最後一個元素,-2 指倒數第二個元素,以此類推。 end 可選。規定從何處結束選取。該引數是陣列片斷結束處的陣列下標。 如果沒有指定該引數,那麼切分的陣列包含從 start 到陣列結束的所有元素。 如果這個引數是負數,那麼它規定的是從陣列尾部開始算起的元素。 * */ var arr1 = "john".split(''); var arr2 = arr1.reverse();//這裡是關鍵點,這倆貨居然是同地址,所謂淺複製,但我不知道怎麼看。 console.log(arr1); console.log(arr2); var arr3 = "jones".split(''); arr2.push(arr3);//此時arr1和arr2都是5個元素了,最後一個就是arr3的引用。 console.log(Object.prototype.toString.call(arr1[4]));//[object Array] arr3.push("Q"); console.log(arr2[4]);//["j", "o", "n", "e", "s", "Q"] console.log(arr3);//["j", "o", "n", "e", "s", "Q"] console.log(arr1.length + ";" + arr1.slice(-1));//5;j,o,n,e,s,Q console.log(arr2.length + ";" + arr2.slice(-1));//5;j,o,n,e,s,Q /*------------------------------------------------------------*/ var arrSlice1 = "john".split(''); var arrSlice2 = arrSlice1.slice(0,2); console.log(arrSlice2);//["j", "o"] arrSlice2.push("Q"); arrSlice2[0] = "A"; console.log(arrSlice2);//["A", "o", "Q"] console.log(arrSlice1);//["j", "o", "h", "n"]