43道JavaScript面試題

1. 下面代碼的輸出是什么?
  function sayHi() {
        console.log(name)
        console.log(age)
        var name = 'Lydia'
        let age = 21
      }
      sayHi()
  • A: Lydiaundefined

  • B: LydiaReferenceError

  • C: ReferenceError21

  • D: undefinedReferenceError

答案: D

在函數(shù)中仰挣,我們首先使用var關鍵字聲明了name變量钩骇。 這意味著變量在創(chuàng)建階段會被提升(JavaScript會在創(chuàng)建變量創(chuàng)建階段為其分配內(nèi)存空間)肠阱,默認值為undefined沃饶,直到我們實際執(zhí)行到使用該變量的行胰锌。 我們還沒有為name變量賦值治泥,所以它仍然保持undefined的值暂幼。

使用let關鍵字(和const)聲明的變量也會存在變量提升,但與var不同移迫,初始化沒有被提升旺嬉。 在我們聲明(初始化)它們之前,它們是不可訪問的厨埋。 這被稱為“暫時死區(qū)”邪媳。 當我們在聲明變量之前嘗試訪問變量時,JavaScript會拋出一個ReferenceError荡陷。

譯者注:

關于let的是否存在變量提升悲酷,我們何以用下面的例子來驗證:

let name = 'ConardLi'{  console.log(name) // Uncaught ReferenceError: name is not defined  let name = 'code秘密花園'}

let變量如果不存在變量提升,console.log(name)就會輸出ConardLi亲善,結果卻拋出了ReferenceError,那么這很好的說明了逗柴,let也存在變量提升蛹头,但是它存在一個“暫時死區(qū)”,在變量未初始化或賦值前不允許訪問戏溺。

變量的賦值可以分為三個階段:

  • 創(chuàng)建變量渣蜗,在內(nèi)存中開辟空間

  • 初始化變量,將變量初始化為undefined

  • 真正賦值

關于let旷祸、varfunction

  • let 的「創(chuàng)建」過程被提升了耕拷,但是初始化沒有提升。

  • var 的「創(chuàng)建」和「初始化」都被提升了托享。

  • function 的「創(chuàng)建」「初始化」和「賦值」都被提升了骚烧。


2. 下面代碼的輸出是什么?
for (var i = 0; i < 3; i++) {  setTimeout(() => console.log(i), 1);}for (let i = 0; i < 3; i++) {  setTimeout(() => console.log(i), 1);}
  • A: 0 1 2 and 0 1 2

  • B: 0 1 2 and 3 3 3

  • C: 3 3 3 and 0 1 2

答案: C

由于JavaScript中的事件執(zhí)行機制,setTimeout函數(shù)真正被執(zhí)行時闰围,循環(huán)已經(jīng)走完赃绊。 由于第一個循環(huán)中的變量i是使用var關鍵字聲明的,因此該值是全局的羡榴。 在循環(huán)期間碧查,我們每次使用一元運算符++都會將i的值增加1。 因此在第一個例子中校仑,當調(diào)用setTimeout函數(shù)時忠售,i已經(jīng)被賦值為3

在第二個循環(huán)中迄沫,使用let關鍵字聲明變量i:使用let(和const)關鍵字聲明的變量是具有塊作用域的(塊是{}之間的任何東西)稻扬。 在每次迭代期間,i將被創(chuàng)建為一個新值邢滑,并且每個值都會存在于循環(huán)內(nèi)的塊級作用域腐螟。


3. 下面代碼的輸出是什么?
const shape = {  radius: 10,  diameter() {    return this.radius * 2;  },  perimeter: () => 2 * Math.PI * this.radius};shape.diameter();shape.perimeter();
  • A: 20 and 62.83185307179586

  • B: 20 and NaN

  • C: 20 and 63

  • D: NaN and 63

答案: B

請注意愿汰,diameter是普通函數(shù),而perimeter是箭頭函數(shù)乐纸。

對于箭頭函數(shù)衬廷,this關鍵字指向是它所在上下文(定義時的位置)的環(huán)境,與普通函數(shù)不同汽绢! 這意味著當我們調(diào)用perimeter時吗跋,它不是指向shape對象,而是指其定義時的環(huán)境(window)宁昭。沒有值radius屬性跌宛,返回undefined


4. 下面代碼的輸出是什么?
+true;!"Lydia";
  • A: 1 and false

  • B: false and NaN

  • C: false and false

答案: A

一元加號會嘗試將boolean類型轉換為數(shù)字類型积仗。 true被轉換為1疆拘,false被轉換為0

字符串'Lydia'是一個真值寂曹。 我們實際上要問的是“這個真值是假的嗎哎迄?”。 這會返回false隆圆。


5. 哪個選項是不正確的?
const bird = {  size: "small"};const mouse = {  name: "Mickey",  small: true};
  • A: mouse.bird.size

  • B: mouse[bird.size]

  • C: mouse[bird["size"]]

  • D: All of them are valid

答案: A

JavaScript中漱挚,所有對象鍵都是字符串(除了Symbol)。盡管有時我們可能不會給定字符串類型渺氧,但它們總是被轉換為字符串旨涝。

JavaScript解釋語句。當我們使用方括號表示法時侣背,它會看到第一個左括號[白华,然后繼續(xù),直到找到右括號]秃踩。只有在那個時候衬鱼,它才會對這個語句求值。

mouse [bird.size]:首先它會對bird.size求值憔杨,得到small鸟赫。 mouse [“small”]返回true

但是消别,使用點表示法抛蚤,這不會發(fā)生。 mouse沒有名為bird的鍵寻狂,這意味著mouse.birdundefined岁经。 然后,我們使用點符號來詢問sizemouse.bird.size蛇券。 由于mouse.birdundefined缀壤,我們實際上是在詢問undefined.size樊拓。 這是無效的,并將拋出Cannot read property "size" of undefined塘慕。



6. 下面代碼的輸出是什么?
let c = { greeting: "Hey!" };
let d;
d = c;
c.greeting = "Hello";
console.log(d.greeting);
  • A: Hello

  • B: undefined

  • C: ReferenceError

  • D: TypeError

答案: A

JavaScript中筋夏,當設置它們彼此相等時,所有對象都通過引用進行交互图呢。

首先条篷,變量c為對象保存一個值。 之后蛤织,我們將d指定為c與對象相同的引用赴叹。

image.gif

更改一個對象時,可以更改所有對象指蚜。


7. 下面代碼的輸出是什么?
 let a = 3
      let b = new Number(3)
      let c = 3
      console.log(a == b)
      console.log(a === b)
      console.log(b === c)
  • A: true false true

  • B: false false true

  • C: true false false

  • D: false true true

答案: C

new Number()是一個內(nèi)置的函數(shù)構造函數(shù)乞巧。 雖然它看起來像一個數(shù)字,但它并不是一個真正的數(shù)字:它有一堆額外的功能摊鸡,是一個對象摊欠。

當我們使用==運算符時,它只檢查它是否具有相同的值柱宦。 他們都有3的值,所以它返回true播瞳。

譯者注:==會引發(fā)隱式類型轉換掸刊,右側的對象類型會自動拆箱為Number類型。

然而赢乓,當我們使用===操作符時忧侧,類型和值都需要相等,new Number()不是一個數(shù)字牌芋,是一個對象類型蚓炬。兩者都返回 false


8. 下面代碼的輸出是什么?
 class Chameleon {
        static colorChange(newColor) {
          this.newColor = newColor
        }
        constructor({ newColor = 'green' } = {}) {
          this.newColor = newColor
        }
      }
      const freddie = new Chameleon({ newColor: 'purple' })
      freddie.colorChange('orange')
  • A: orange

  • B: purple

  • C: green

  • D: TypeError

答案: D

colorChange方法是靜態(tài)的躺屁。 靜態(tài)方法僅在創(chuàng)建它們的構造函數(shù)中存在肯夏,并且不能傳遞給任何子級。 由于freddie是一個子級對象犀暑,函數(shù)不會傳遞驯击,所以在freddie實例上不存在freddie方法:拋出TypeError


9. 下面代碼的輸出是什么?
   let greeting
      greetign = {} // Typo!console.log(greetign);
  • A: {}

  • B: ReferenceError: greetign is not defined

  • C: undefined

答案: A

控制臺會輸出空對象耐亏,因為我們剛剛在全局對象上創(chuàng)建了一個空對象徊都! 當我們錯誤地將greeting輸入為greetign時,JS解釋器實際上在瀏覽器中將其視為global.greetign = {}(或window.greetign = {})广辰。

為了避免這種情況暇矫,我們可以使用“use strict”主之。 這可以確保在將變量賦值之前必須聲明變量。


10. 當我們這樣做時會發(fā)生什么?
function bark() {  console.log("Woof!");}bark.animal = "dog";
  • A: Nothing, this is totally fine!

  • B: SyntaxError. You cannot add properties to a function this way.

  • C: undefined

  • D: ReferenceError

答案: A

這在JavaScript中是可能的李根,因為函數(shù)也是對象2坜取(原始類型之外的所有東西都是對象)

函數(shù)是一種特殊類型的對象。您自己編寫的代碼并不是實際的函數(shù)朱巨。 該函數(shù)是具有屬性的對象史翘,此屬性是可調(diào)用的。


11. 下面代碼的輸出是什么?
  function Person(firstName, lastName) {
        this.firstName = firstName
        this.lastName = lastName
      }
      const member = new Person('Lydia', 'Hallie')
      Person.getFullName = () => this.firstName + this.lastName
      console.log(member.getFullName())
  • A: TypeError

  • B: SyntaxError

  • C: Lydia Hallie

  • D: undefined undefined

答案: A

您不能像使用常規(guī)對象那樣向構造函數(shù)添加屬性冀续。 如果要一次向所有對象添加功能琼讽,則必須使用原型。 所以在這種情況下應該這樣寫:

 Person.prototype.getFullName = function() {
        return `${this.firstName} ${this.lastName}`
      }

這樣會使member.getFullName()是可用的洪唐,為什么樣做是對的钻蹬? 假設我們將此方法添加到構造函數(shù)本身。 也許不是每個Person實例都需要這種方法凭需。這會浪費大量內(nèi)存空間问欠,因為它們?nèi)匀痪哂性搶傩裕@占用了每個實例的內(nèi)存空間粒蜈。 相反顺献,如果我們只將它添加到原型中,我們只需將它放在內(nèi)存中的一個位置枯怖,但它們都可以訪問它注整!


12. 下面代碼的輸出是什么?
 function Person(firstName, lastName) {
        this.firstName = firstName
        this.lastName = lastName
      }
      const lydia = new Person('Lydia', 'Hallie')
      const sarah = Person('Sarah', 'Smith')
      console.log(lydia)
      console.log(sarah)
  • A: Person {firstName: "Lydia", lastName: "Hallie"} and undefined

  • B: Person {firstName: "Lydia", lastName: "Hallie"} and Person {firstName: "Sarah", lastName: "Smith"}

  • C: Person {firstName: "Lydia", lastName: "Hallie"} and {}

  • D:Person {firstName: "Lydia", lastName: "Hallie"} and ReferenceError

答案: A

對于sarah,我們沒有使用new關鍵字度硝。 使用new時肿轨,它指的是我們創(chuàng)建的新空對象。 但是蕊程,如果你不添加new它指的是全局對象椒袍!

我們指定了this.firstName等于'Sarahthis.lastName等于Smith。 我們實際做的是定義global.firstName ='Sarah'global.lastName ='Smith藻茂。 sarah本身的返回值是undefined驹暑。


12. 事件傳播的三個階段是什么??
  • A: 目標 > 捕獲 > 冒泡

  • B: 冒泡 > 目標 > 捕獲

  • C: 目標 > 冒泡 > 捕獲

  • D: 捕獲 > 目標 > 冒泡

答案: D

在捕獲階段辨赐,事件通過父元素向下傳遞到目標元素岗钩。 然后它到達目標元素,冒泡開始肖油。

image.gif

13. 所有對象都有原型.
  • A: 對

  • B: 錯誤

答案: B

基礎對象外兼吓,所有對象都有原型。 基礎對象可以訪問某些方法和屬性森枪,例如.toString视搏。 這就是您可以使用內(nèi)置JavaScript方法的原因审孽! 所有這些方法都可以在原型上找到。 雖然JavaScript無法直接在您的對象上找到它浑娜,但它會沿著原型鏈向下尋找并在那里找到它佑力,這使您可以訪問它。

譯者注:基礎對象指原型鏈終點的對象筋遭〈虿基礎對象的原型是null


14. 下面代碼的輸出是什么?
function sum(a, b) {  return a + b;}sum(1, "2");
  • A: NaN

  • B: TypeError

  • C: "12"

  • D: 3

答案: C

JavaScript是一種動態(tài)類型語言:我們沒有指定某些變量的類型漓滔。 在您不知情的情況下肴焊,值可以自動轉換為另一種類型役首,稱為隱式類型轉換。 強制從一種類型轉換為另一種類型。

在此示例中伤塌,JavaScript將數(shù)字1轉換為字符串屯援,以使函數(shù)有意義并返回值茎杂。 在讓數(shù)字類型(1)和字符串類型('2')相加時惫恼,該數(shù)字被視為字符串。 我們可以連接像“Hello”+“World”這樣的字符串琳骡,所以這里發(fā)生的是“1”+“2”返回“12”锅论。


15. 下面代碼的輸出是什么?
  let number = 0
      console.log(number++)
      console.log(++number)
      console.log(number)
  • A: 1 1 2

  • B: 1 2 2

  • C: 0 2 2

  • D: 0 1 2

答案: C

后綴一元運算符++

  1. 返回值(返回0

  2. 增加值(數(shù)字現(xiàn)在是1

前綴一元運算符++

  1. 增加值(數(shù)字現(xiàn)在是2

  2. 返回值(返回2

所以返回0 2 2


16. 下面代碼的輸出是什么?
 function getPersonInfo(one, two, three) {
        console.log(one)
        console.log(two)
        console.log(three)
      }
      const person = 'Lydia'
      const age = 21
      getPersonInfo`${person} is ${age} years old`
  • A: Lydia 21 ["", "is", "years old"]

  • B: ["", "is", "years old"] Lydia 21

  • C: Lydia ["", "is", "years old"] 21

答案: B

如果使用標記的模板字符串楣号,則第一個參數(shù)的值始終是字符串值的數(shù)組棍厌。 其余參數(shù)獲取傳遞到模板字符串中的表達式的值!


17. 下面代碼的輸出是什么?
  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 })
  • A: You are an adult!

  • B: You are still an adult.

  • C: Hmm.. You don't have an age I guess

答案: C

在比較相等性竖席,原始類型通過它們的值進行比較,而對象通過它們的引用進行比較敬肚。JavaScript檢查對象是否具有對內(nèi)存中相同位置的引用毕荐。

我們作為參數(shù)傳遞的對象和我們用于檢查相等性的對象在內(nèi)存中位于不同位置,所以它們的引用是不同的艳馒。

這就是為什么{ age: 18 } === { age: 18 }{ age: 18 } == { age: 18 } 返回 false的原因憎亚。


18. 下面代碼的輸出是什么?
function getAge(...args) {  console.log(typeof args);}getAge(21);
  • A: "number"

  • B: "array"

  • C: "object"

  • D: "NaN"

答案: C

擴展運算符(... args)返回一個帶參數(shù)的數(shù)組。 數(shù)組是一個對象弄慰,因此typeof args返回object第美。


20. 下面代碼的輸出是什么?
    function getAge() {
        'use strict'
        age = 21
        console.log(age)
      }
      getAge()
  • A: 21

  • B: undefined

  • C: ReferenceError

  • D: TypeError

答案: C

使用“use strict”,可以確保不會意外地聲明全局變量陆爽。 我們從未聲明變量age什往,因為我們使用``use strict',它會引發(fā)一個ReferenceError慌闭。 如果我們不使用“use strict”别威,它就會起作用躯舔,因為屬性age`會被添加到全局對象中。


21. 下面代碼的輸出是什么?
const sum = eval("10*10+5");
  • A: 105

  • B: "105"

  • C: TypeError

  • D: "10*10+5"

答案: A

eval會為字符串傳遞的代碼求值省古。 如果它是一個表達式粥庄,就像在這種情況下一樣,它會計算表達式豺妓。 表達式為10 * 10 + 5計算得到105惜互。


22. cool_secret可以訪問多長時間?
sessionStorage.setItem("cool_secret", 123);
  • A:永遠,數(shù)據(jù)不會丟失琳拭。

  • B:用戶關閉選項卡時训堆。

  • C:當用戶關閉整個瀏覽器時,不僅是選項卡臀栈。

  • D:用戶關閉計算機時蔫慧。

答案: B

關閉選項卡后,將刪除存儲在sessionStorage中的數(shù)據(jù)权薯。

如果使用localStorage姑躲,數(shù)據(jù)將永遠存在,除非例如調(diào)用localStorage.clear()盟蚣。


23. 下面代碼的輸出是什么?
var num = 8;var num = 10;console.log(num);
  • A: 8

  • B: 10

  • C: SyntaxError

  • D: ReferenceError

答案: B

使用var關鍵字黍析,您可以用相同的名稱聲明多個變量。然后變量將保存最新的值屎开。

您不能使用letconst來實現(xiàn)這一點阐枣,因為它們是塊作用域的。


24. 下面代碼的輸出是什么?
  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)
  • A: false true false true

  • B: false true true true

  • C: true true false true

  • D: true true true true

答案: C

所有對象鍵(不包括Symbols)都會被存儲為字符串奄抽,即使你沒有給定字符串類型的鍵蔼两。 這就是為什么obj.hasOwnProperty('1')也返回true

上面的說法不適用于Set逞度。 在我們的Set中沒有“1”set.has('1')返回false额划。 它有數(shù)字類型1set.has(1)返回true档泽。


25. 下面代碼的輸出是什么?
  const obj = { a: 'one', b: 'two', a: 'three' }
      console.log(obj)
  • A: { a: "one", b: "two" }

  • B: { b: "two", a: "three" }

  • C: { a: "three", b: "two" }

  • D: SyntaxError

答案: C

如果對象有兩個具有相同名稱的鍵俊戳,則將替前面的鍵。它仍將處于第一個位置馆匿,但具有最后指定的值抑胎。


26. JavaScript全局執(zhí)行上下文為你創(chuàng)建了兩個東西:全局對象和this關鍵字.
  • A: 對

  • B: 錯誤

  • C: 視情況而定

答案: A

基本執(zhí)行上下文是全局執(zhí)行上下文:它是代碼中隨處可訪問的內(nèi)容。


27. 下面代碼的輸出是什么?
  for (let i = 1; i < 5; i++) {
        if (i === 3) continue
        console.log(i)
      }
  • A: 1 2

  • B: 1 2 3

  • C: 1 2 4

  • D: 1 3 4

答案: C

如果某個條件返回true渐北,則continue語句跳過迭代阿逃。


28. 下面代碼的輸出是什么?
  String.prototype.giveLydiaPizza = () => {
        return 'Just give Lydia pizza already!'
      }
      const name = 'Lydia'
      name.giveLydiaPizza()
  • A: "Just give Lydia pizza already!"

  • B: TypeError: not a function

  • C: SyntaxError

  • D: undefined

答案: A

String是一個內(nèi)置的構造函數(shù),我們可以為它添加屬性。 我剛給它的原型添加了一個方法盆昙。 原始類型的字符串自動轉換為字符串對象羽历,由字符串原型函數(shù)生成。 因此淡喜,所有字符串(字符串對象)都可以訪問該方法秕磷!

譯者注:

當使用基本類型的字符串調(diào)用giveLydiaPizza時,實際上發(fā)生了下面的過程:

  • 創(chuàng)建一個String的包裝類型實例

  • 在實例上調(diào)用substring方法

  • 銷毀實例


29. 下面代碼的輸出是什么?
  const a = {}
      const b = { key: 'b' }
      const c = { key: 'c' }
      a[b] = 123
      a[c] = 456
      console.log(a[b])
  • A: 123

  • B: 456

  • C: undefined

  • D: ReferenceError

答案: B

對象鍵自動轉換為字符串炼团。我們試圖將一個對象設置為對象a的鍵澎嚣,其值為123

但是瘟芝,當對象自動轉換為字符串化時易桃,它變成了[Object object]。 所以我們在這里說的是a["Object object"] = 123锌俱。 然后晤郑,我們可以嘗試再次做同樣的事情。 c對象同樣會發(fā)生隱式類型轉換贸宏。那么造寝,a["Object object"] = 456

然后吭练,我們打印a[b]诫龙,它實際上是a["Object object"]。 我們將其設置為456鲫咽,因此返回456签赃。


30. 下面代碼的輸出是什么?
  const foo = () => console.log('First')
      const bar = () => setTimeout(() => console.log('Second'))
      const baz = () => console.log('Third')
      bar()
      foo()
      baz()
  • A: First Second Third

  • B: First Third Second

  • C: Second First Third

  • D: Second Third First

答案: B

我們有一個setTimeout函數(shù)并首先調(diào)用它。 然而卻最后打印了它分尸。

這是因為在瀏覽器中锦聊,我們不只有運行時引擎,我們還有一個叫做WebAPI的東西箩绍。WebAPI為我們提供了setTimeout函數(shù)孔庭,例如DOM

callback推送到WebAPI后伶选,setTimeout函數(shù)本身(但不是回調(diào)!)從堆棧中彈出尖昏。

image.gif

現(xiàn)在仰税,調(diào)用foo,并打印First抽诉。

image.gif

foo從堆棧彈出陨簇,baz被調(diào)用,并打印Third

image.gif

WebAPI不能只是在準備就緒時將內(nèi)容添加到堆棧中河绽。 相反己单,它將回調(diào)函數(shù)推送到一個稱為任務隊列的東西。

image.gif

這是事件循環(huán)開始工作的地方耙饰。 事件循環(huán)查看堆棧和任務隊列纹笼。 如果堆棧為空,則會占用隊列中的第一個內(nèi)容并將其推送到堆棧中苟跪。

image.gif

bar被調(diào)用廷痘,Second被打印,它從棧中彈出件已。


31. 單擊按鈕時event.target是什么?
 <div onclick="console.log('first div')">
      <div onclick="console.log('second div')">
        <button onclick="console.log('button')">Click!</button>
      </div>
    </div>
  • A: div外部

  • B: div內(nèi)部

  • C: button

  • D: 所有嵌套元素的數(shù)組.

答案: C

導致事件的最深嵌套元素是事件的目標笋额。 你可以通過event.stopPropagation停止冒泡


32. 單擊下面的html片段打印的內(nèi)容是什么?
  <div onclick="console.log('div')">
      <p onclick="console.log('p')">Click here!</p>
    </div>
  • A: p div

  • B: div p

  • C: p

  • D: div

答案: A

如果我們單擊p,我們會看到兩個日志:pdiv篷扩。在事件傳播期間兄猩,有三個階段:捕獲,目標和冒泡鉴未。 默認情況下枢冤,事件處理程序在冒泡階段執(zhí)行(除非您將useCapture設置為true)。 它從最深的嵌套元素向外延伸歼狼。


33. 下面代碼的輸出是什么?
  const person = { name: 'Lydia' }
      function sayHi(age) {
        console.log(`${this.name} is ${age}`)
      }
      sayHi.call(person, 21)
      sayHi.bind(person, 21)
  • A: undefined is 21 Lydia is 21

  • B: function function

  • C: Lydia is 21 Lydia is 21

  • D: Lydia is 21 function

答案: D

使用兩者掏导,我們可以傳遞我們想要this關鍵字引用的對象。 但是羽峰,.call方法會立即執(zhí)行趟咆!

.bind方法會返回函數(shù)的拷貝值,但帶有綁定的上下文梅屉! 它不會立即執(zhí)行值纱。


34. 下面代碼的輸出是什么?
 function sayHi() {
        return (() => 0)()
      }
      typeof sayHi()
  • A: "object"

  • B: "number"

  • C: "function"

  • D: "undefined"

答案: B

sayHi函數(shù)返回立即調(diào)用的函數(shù)(IIFE)的返回值。 該函數(shù)返回0坯汤,類型為數(shù)字虐唠。

僅供參考:只有7種內(nèi)置類型:nullundefined惰聂,boolean疆偿,numberstring搓幌,objectsymbol杆故。 function不是一個類型,因為函數(shù)是對象溉愁,它的類型是object处铛。


35. 下面這些值哪些是假值?
0;new Number(0);("");(" ");new Boolean(false);undefined;
  • A: 0, '', undefined

  • B: 0, new Number(0), '', new Boolean(false), undefined

  • C: 0, '', new Boolean(false), undefined

  • D: 所有都是假值

答案: A

JavaScript中只有6個假值:

  • undefined

  • null

  • NaN

  • 0

  • '' (empty string)

  • false

函數(shù)構造函數(shù),如new Numbernew Boolean都是真值。


36. 下面代碼的輸出是什么?
console.log(typeof typeof 1);
  • A: "number"

  • B: "string"

  • C: "object"

  • D: "undefined"

答案: B

typeof 1 返回 "number".
typeof "number" 返回 "string"


37. 下面代碼的輸出是什么?
   const numbers = [1, 2, 3]
      numbers[10] = 11
      console.log(numbers)
  • A: [1, 2, 3, 7 x null, 11]

  • B: [1, 2, 3, 11]

  • C: [1, 2, 3, 7 x empty, 11]

  • D: SyntaxError

答案: C

When you set a value to an element in an array that exceeds the length of the array, JavaScript creates something called "empty slots". These actually have the value of undefined, but you will see something like:

當你為數(shù)組中的元素設置一個超過數(shù)組長度的值時撤蟆,JavaScript會創(chuàng)建一個名為“空插槽”的東西奕塑。 這些位置的值實際上是undefined,但你會看到類似的東西:

[1, 2, 3, 7 x empty, 11]

這取決于你運行它的位置(每個瀏覽器有可能不同)家肯。


38. 下面代碼的輸出是什么?
  ;(() => {
        let x, y
        try {
          throw new Error()
        } catch (x) {
          ;(x = 1), (y = 2)
          console.log(x)
        }
        console.log(x)
        console.log(y)
      })()
  • A: 1 undefined 2

  • B: undefined undefined undefined

  • C: 1 1 2

  • D: 1 undefined undefined

答案: A

catch塊接收參數(shù)x龄砰。當我們傳遞參數(shù)時,這與變量的x不同息楔。這個變量x是屬于catch作用域的寝贡。

之后,我們將這個塊級作用域的變量設置為1值依,并設置變量y的值圃泡。 現(xiàn)在,我們打印塊級作用域的變量x愿险,它等于1颇蜡。

catch塊之外,x仍然是undefined辆亏,而y2风秤。 當我們想在catch塊之外的console.log(x)時,它返回undefined扮叨,而y返回2缤弦。


39. JavaScript中的所有內(nèi)容都是…
  • A:原始或?qū)ο?/p>

  • B:函數(shù)或?qū)ο?/p>

  • C:技巧問題!只有對象

  • D:數(shù)字或?qū)ο?/p>

答案: A

JavaScript只有原始類型和對象彻磁。

原始類型是boolean碍沐,nullundefined衷蜓,bigint累提,numberstringsymbol磁浇。


40. 下面代碼的輸出是什么?
[[0, 1], [2, 3]].reduce(  (acc, cur) => {    return acc.concat(cur);  },  [1, 2]);
  • A: [0, 1, 2, 3, 1, 2]

  • B: [6, 1, 2]

  • C: [1, 2, 0, 1, 2, 3]

  • D: [1, 2, 6]

答案: C

[1,2]是我們的初始值斋陪。 這是我們開始執(zhí)行reduce函數(shù)的初始值,以及第一個acc的值置吓。 在第一輪中无虚,acc[1,2]cur[0,1]衍锚。 我們將它們連接起來友题,結果是[1,2,0,1]

然后构拳,acc的值為[1,2,0,1]咆爽,cur的值為[2,3]。 我們將它們連接起來置森,得到[1,2,0,1,2,3]斗埂。


41. 下面代碼的輸出是什么?
!!null;!!"";!!1;
  • A: false true false

  • B: false false true

  • C: false true true

  • D: true true false

答案: B

null是假值。 !null返回true凫海。 !true返回false呛凶。

""是假值。 !""返回true行贪。 !true返回false漾稀。

1是真值。 !1返回false建瘫。 !false返回true崭捍。


42. setInterval方法的返回值什么?
setInterval(() => console.log("Hi"), 1000);
  • A:一個唯一的id

  • B:指定的毫秒數(shù)

  • C:傳遞的函數(shù)

  • D:undefined

答案: A

它返回一個唯一的id。 此id可用于使用clearInterval()函數(shù)清除該定時器啰脚。


43. What does this return?
[..."Lydia"];
  • A: ["L", "y", "d", "i", "a"]

  • B: ["Lydia"]

  • C: [[], "Lydia"]

  • D: [["L", "y", "d", "i", "a"]]

答案: A

字符串是可迭代的殷蛇。 擴展運算符將迭代的每個字符映射到一個元素。

最后編輯于
?著作權歸作者所有,轉載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末橄浓,一起剝皮案震驚了整個濱河市粒梦,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌荸实,老刑警劉巖匀们,帶你破解...
    沈念sama閱讀 222,681評論 6 517
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異准给,居然都是意外死亡泄朴,警方通過查閱死者的電腦和手機,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 95,205評論 3 399
  • 文/潘曉璐 我一進店門圆存,熙熙樓的掌柜王于貴愁眉苦臉地迎上來叼旋,“玉大人,你說我怎么就攤上這事沦辙》蛑玻” “怎么了?”我有些...
    開封第一講書人閱讀 169,421評論 0 362
  • 文/不壞的土叔 我叫張陵油讯,是天一觀的道長详民。 經(jīng)常有香客問我,道長陌兑,這世上最難降的妖魔是什么沈跨? 我笑而不...
    開封第一講書人閱讀 60,114評論 1 300
  • 正文 為了忘掉前任,我火速辦了婚禮兔综,結果婚禮上饿凛,老公的妹妹穿的比我還像新娘狞玛。我一直安慰自己,他們只是感情好涧窒,可當我...
    茶點故事閱讀 69,116評論 6 398
  • 文/花漫 我一把揭開白布心肪。 她就那樣靜靜地躺著,像睡著了一般纠吴。 火紅的嫁衣襯著肌膚如雪硬鞍。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 52,713評論 1 312
  • 那天戴已,我揣著相機與錄音固该,去河邊找鬼。 笑死糖儡,一個胖子當著我的面吹牛伐坏,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播握联,決...
    沈念sama閱讀 41,170評論 3 422
  • 文/蒼蘭香墨 我猛地睜開眼著淆,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了拴疤?” 一聲冷哼從身側響起永部,我...
    開封第一講書人閱讀 40,116評論 0 277
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎呐矾,沒想到半個月后苔埋,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 46,651評論 1 320
  • 正文 獨居荒郊野嶺守林人離奇死亡蜒犯,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 38,714評論 3 342
  • 正文 我和宋清朗相戀三年组橄,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片罚随。...
    茶點故事閱讀 40,865評論 1 353
  • 序言:一個原本活蹦亂跳的男人離奇死亡玉工,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出淘菩,到底是詐尸還是另有隱情遵班,我是刑警寧澤,帶...
    沈念sama閱讀 36,527評論 5 351
  • 正文 年R本政府宣布潮改,位于F島的核電站狭郑,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏汇在。R本人自食惡果不足惜翰萨,卻給世界環(huán)境...
    茶點故事閱讀 42,211評論 3 336
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望糕殉。 院中可真熱鬧亩鬼,春花似錦殖告、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,699評論 0 25
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至魄缚,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間焚廊,已是汗流浹背冶匹。 一陣腳步聲響...
    開封第一講書人閱讀 33,814評論 1 274
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留咆瘟,地道東北人嚼隘。 一個月前我還...
    沈念sama閱讀 49,299評論 3 379
  • 正文 我出身青樓,卻偏偏與公主長得像袒餐,于是被迫代替她去往敵國和親飞蛹。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 45,870評論 2 361

推薦閱讀更多精彩內(nèi)容