1.下面代碼的輸出是什麼?數組
for (var i = 0; i < 3; i++) { setTimeout(() => console.log(i), 1); } for (let i = 0; i < 3; i++) { setTimeout(() => console.log(i), 1); }
答案:
因爲JavaScript中的事件執行機制,setTimeout函數真正被執行時,循環已經走完。
因爲第一個循環中的變量i是使用var關鍵字聲明的,所以該值是全局的。 在循環期間,咱們每次使用一元運算符++都會將i的值增長1。
所以在第一個例子中,當調用setTimeout函數時,i已經被賦值爲3。
在第二個循環中,使用let關鍵字聲明變量i:使用let(和const)關鍵字聲明的變量是具備塊做用域的(塊是{}之間的任何東西)。
在每次迭代期間,i將被建立爲一個新值,而且每一個值都會存在於循環內的塊級做用域。
2.下面代碼的輸出是什麼?函數
const shape = { radius: 10, diameter() { return this.radius * 2 }, perimeter: () => 2 * Math.PI * this.radius }; shape.diameter(); shape.perimeter();
請注意,diameter是普通函數,而perimeter是箭頭函數。
對於箭頭函數,this關鍵字指向是它所在上下文(定義時的位置)的環境,與普通函數不一樣!
這意味着當咱們調用perimeter時,它不是指向shape對象,而是指其定義時的環境(window)。沒有值radius屬性,返回undefined。
3.下面代碼的輸出是什麼?this
+true; !"Lydia";
一元加號會嘗試將boolean類型轉換爲數字類型。 true被轉換爲1,false被轉換爲0。字符串'Lydia'是一個真值。 咱們實際上要問的是「這個真值是假的嗎?」。 這會返回false。日誌
4.下面代碼的輸出是什麼?code
function checkAge(data) { if (data === { age: 18 }) { console.log("You are an adult!"); } else if (data == { age: 18 }) { console.log("You are still an adult."); } else { console.log(`Hmm.. You don't have an age I guess`); } } checkAge({ age: 18 });
在比較相等性,原始類型經過它們的值進行比較,而對象經過它們的引用進行比較。JavaScript檢查對象是否具備對內存中相同位置的引用。
咱們做爲參數傳遞的對象和咱們用於檢查相等性的對象在內存中位於不一樣位置,因此它們的引用是不一樣的。 這就是爲何{ age: 18 } ===
{ age: 18 }和 { age: 18 } == { age: 18 } 返回 false的緣由。
5.下面代碼的輸出是什麼?對象
function getAge(...args) { console.log(typeof args); } getAge(21);
擴展運算符(... args)返回一個帶參數的數組。 數組是一個對象,所以typeof args返回object
6.下面代碼的輸出是什麼?事件
const obj = { 1: "a", 2: "b", 3: "c" }; const set = new Set([1, 2, 3, 4, 5]); obj.hasOwnProperty("1"); obj.hasOwnProperty(1); set.has("1"); set.has(1);
全部對象鍵(不包括Symbols)都會被存儲爲字符串,即便你沒有給定字符串類型的鍵。
這就是爲何obj.hasOwnProperty('1')也返回true。 上面的說法不適用於Set。
在咱們的Set中沒有「1」:set.has('1')返回false。 它有數字類型1,set.has(1)返回true。
7.下面代碼的輸出是什麼?ip
for (let i = 1; i < 5; i++) { if (i === 3) continue; console.log(i); }
若是某個條件返回true,則continue語句跳過迭代。
8.下面代碼的輸出是什麼?內存
const a = {}; const b = { key: "b" }; const c = { key: "c" }; a[b] = 123; a[c] = 456; console.log(a[b]);
對象鍵自動轉換爲字符串。咱們試圖將一個對象設置爲對象a的鍵,其值爲123。 可是,當對象自動轉換爲字符串化時,它變成了[Object
object]。 因此咱們在這裏說的是a["Object object"] = 123。 而後,咱們能夠嘗試再次作一樣的事情。
c對象一樣會發生隱式類型轉換。那麼,a["Object object"] = 456。 而後,咱們打印a[b],它其實是a["Object
object"]。 咱們將其設置爲456,所以返回456。
9.下面代碼的輸出是什麼?作用域
<div onclick="console.log('div')"> <p onclick="console.log('p')"> Click here! </p> </div>
若是咱們單擊p,咱們會看到兩個日誌:p和div。在事件傳播期間,有三個階段:捕獲,目標和冒泡。
默認狀況下,事件處理程序在冒泡階段執行(除非您將useCapture設置爲true)。 它從最深的嵌套元素向外延伸。
10.下面這些值哪些是假值?
0; new Number(0); (""); (" "); new Boolean(false); undefined;
JavaScript中只有6個假值:undefined null NaN 0 '' (empty string) false
函數構造函數,如new Number和new
Boolean都是真值。
11.下面代碼的輸出是什麼?
(() => { let x, y; try { throw new Error(); } catch (x) { (x = 1), (y = 2); console.log(x); } console.log(x); console.log(y); })();
catch塊接收參數x。當咱們傳遞參數時,這與變量的x不一樣。這個變量x是屬於catch做用域的。
以後,咱們將這個塊級做用域的變量設置爲1,並設置變量y的值。 如今,咱們打印塊級做用域的變量x,它等於1。
在catch塊以外,x仍然是undefined,而y是2。
當咱們想在catch塊以外的console.log(x)時,它返回undefined,而y返回2。
12.setInterval方法的返回值什麼?
setInterval(() => console.log("Hi"), 1000);
它返回一個惟一的id。 此id可用於使用clearInterval()函數清除該定時器
13.下面代碼的輸出是什麼?
[..."Lydia"];
字符串是可迭代的。 擴展運算符將迭代的每一個字符映射到一個元素。 ["L", "y", "d", "i", "a"]