JavaScript老是給人以驚喜,學習不止,進步不斷,今天繼續補充JS容易搞錯的幾道筆試/面試題,爲了秋招繼續努力,歡迎一塊兒爲秋招努力的小夥伴共勉javascript
--------------------------------------總部傳送門-----------------------------------前端
1.VK的秋招前端奇遇記(一)java
3.VK的秋招前端奇遇記(三)github
var length = 10;
function fn() {
console.log(this.length);
}
var obj = {
length: 5,
method: function(fn) {
fn();
arguments[0]();
}
};
obj.method(fn, 1);
複製代碼
output:數組
10
2
複製代碼
這個我作錯在第二個輸出上,其實對this
瞭解後就知道,第一個輸出10
應該是很顯然的:雖然在程序執行時,使用了obj.method
方法,讓this指向了obj
,可是真正的函數執行在函數體內部,也即當fn()
執行的時候,this
是指向window
的,因此第一次執行結果是10app
那麼這裏第二次執行arguments[0]
爲何結果是2
?函數
分析下在method(fn,1)
執行時,經歷了什麼: 首先兩個參數fn
和1
會被放入arguments
中,在arguments
中第一個參數就是咱們傳入的函數;接下來fn
執行,此時this
沒有綁定所以指向window
,輸出10
。 然而到了arguments[0]()
這一句,至關於把arguments[0]
中的第一個參數拿來執行, 效果以下:
arguments[0]() //執行,等同於下面的
arguments.0() //固然這句話是不合法的,可是這樣咱們能夠更清楚知道,this是指向arguments實例自己
複製代碼
arguments.length
就是它自己的長度(arguments是一個類數組,具備length屬性),所以輸出2
(function () {
try {
throw new Error();
} catch (x) {
var x = 1, y = 2;
console.log(x);
}
console.log(x);
console.log(y);
})();
複製代碼
輸出結果:
1
undefined
2
複製代碼
咱們都知道var
是在預編譯階段會有一個變量提高,這種類型很容易解決,可是當遇到在catch(x)
中與已有變量重名的狀況,必定要區分二者之間的關係。
用變量提高的方法,把程序重寫並分析以下:
(function () {
var x,y; // 外部變量提高
try {
throw new Error();
} catch (x/* 內部的x */) {
x = 1; //內部的x,和上面聲明的x不是一回事!!
y = 2; //內部沒有聲明,做用域鏈向上找,外面的y
console.log(x); //固然是1
}
console.log(x); //只聲明,未賦值,undefined
console.log(y); //就是2了
})();
複製代碼
這樣子就很清晰,以後注意預編譯的過程,把變量和函數定義進行提高後,進行分析,會清楚不少
var x = 21;
var girl = function () {
console.log(x);
var x = 20;
};
girl ();
複製代碼
輸出:
undefined
複製代碼
說實話,這個題目我沒作錯,我沒作錯,我沒作錯!
由於和Q2同樣,並且尚未Q2難,一句話解釋就是: 函數內部變量提高。 至關於
var x = 21;
var girl = function() {
var x;
console.log(x); // undefined
x = 20;
}
}
複製代碼
console.log(1 < 2 < 3);
console.log(3 > 2 > 1);
複製代碼
輸出:
true
flase
複製代碼
第一個輸出結果是好理解的,主要看下第二個爲何是false
核心在於js怎麼去解析<
和>
運算符。 在JS中,這種運算符是從左向右運算的,因此3>2>1
就被轉換成了true>1
,而true
的值是1
,接着比較1>1
就返回false了。
console.log(typeof typeof 1);
複製代碼
答案是string
會輸出string
,這個題目不單單是typeof的考察,也是對js運算的一個考察。 在js中通常有兩種操做
a = b
2>3
之類的,上面的題目提到過,是從左向右的順序有沒有見過這個傢伙?
,好比console.log(a)
typeof a
都屬於這個類型,是從右向左的所以,這個題就被分解爲typeof 1
返回"number"
,注意是一個字符串。 接下來typeof "number"
,返回string
typeof undefined == typeof NULL
輸出結果是什麼首先搞清楚兩點:
typeof undefined
輸出是undefined
typeof null
輸出是object
可是,另外一方面,由於js對大小寫敏感,null
≠ NULL
,因此``typeof NULL返回
undefined`
結果是: true
訪問一個DOM tree,是一個經典的深度優先搜索的算法
function Traverse(DOM,callback) {
callback(DOM);
var list = DOM.children;
Array.prototype.forEach.apply(list,(item)=>{
Traverse(item,callback); //遞歸
})
}
複製代碼