都2020了,還不懂js運算符優先級?

題記

若是你能快速準確的回答如下問題,那麼能夠直接跳過git

先上個記憶祕訣: 括點油調一成作衣 叫等位裸跳服展昭es6

解釋

括: 括號github

點: 成員訪問ide

油:new函數

調:函數調用ui

一:一元運算符this

成:乘除加減spa

作衣: 按位左右移指針

叫:比較運算符(大於 小於)code

等:等於

位:按位與或

裸:邏輯與或

跳:條件運算符

服:賦值

展:展開運算符

昭:逗號

1. r等於什麼

function F() {
  this.a = 1
  this.f = function() {
    this.a = 3
  }
}

F.f = function() {
  this.a = 2
}

var r = new F.f()

複製代碼
  • A. {a: 2}
  • B. {a: 1, f: ƒ}
  • C. {a: 3}
答案

答案: A

先執行F.f, 再執行new ...()

2. str等於什麼

var str = "Hello" + true ? "World" : "JS";
複製代碼
  • A. "World"
  • B. "Hello World"
  • C. "Hello JS"
答案

答案: A

+的優先級高於 ...?...:...

3. a等於什麼

function myFunc () {
    var x = 0;
    var y = 1
    return (x,y);
}

var a = myFunc ()
複製代碼
  • A. (0,1)
  • B. 0
  • C. 1
  • D. [0, 1]
答案

答案: C

逗號操做符 對它的每一個操做數求值(從左到右),並返回最後一個操做數的值。

4. 打印什麼

var obj = {
    a: {
        f: function(){
            return function(config){
				console.log(this)
            };
        }
    }
};
var type = "a";
var config = {};
new obj[type].f()(config);

複製代碼
  • A. obj
  • B. a
  • C. f
  • D. Window
答案

答案: D

js引擎將把代碼解析成(new provider[type].get())(config); 由於(new provider[type].get())返回的是匿名函數,且在Window環境中執行,因此this指向Window

5.輸出什麼

var x = 1
console.log(x)
console.log(x++)
console.log(++x)
複製代碼
  • A. 1 2 3
  • B. 1 1 3
  • C. 1 1 1
  • D. 1 2 2
答案

答案: B

x++是先使用x再加1,++x是先加1再用x

6. 輸出什麼

var x = 1
console.log(x+++1)
console.log(++x+1)
複製代碼
  • A. 2 4
  • B. 3 4
  • C. 1 2
答案

答案: A

x++是先使用x再加1,++x是先加1再用x

7. 輸出什麼

var x = 1
console.log(!x++)

var x = 1
console.log(!++x)
複製代碼
  • A. false false
  • B. false true
  • C. true false
  • D. true true
答案

答案: A

第一個console, x++的優先級高於!, 因此至關於!1 等於false

第二個console, !和++x屬於同一級,從右往左計算,至關於!2 等於false

8. z等於幾

var x = 1
var y = 10
var z = y+++x
複製代碼
  • A. 11
  • B. 12
  • C. 10
  • D. 1
答案

答案: A

至關於(y++)+x

9. 輸出什麼

console.log(void 1 + 1)
複製代碼
  • A. NaN
  • B. undefined
  • C. null
  • D. 2
答案

答案: A

void的優先級高於+,因此至關於(void 1) + 1, 而void 1等於undefined,因此結果是NaN

10. 輸出什麼

var x = 2
console.log(x*2**3)
複製代碼
  • A. 16
  • B. 64
  • C. NaN
  • D. TypeError
答案

答案: A

** 優先級高於 * 至關於x * (2 ** 3)

11. 輸出什麼

var x = 8
console.log(x>>2+1)
複製代碼
  • A. 3
  • B. 1
  • C. 33
  • D. NaN
答案

答案: B

  • 優先級高於>> 至關於x >>3

12. 輸出什麼

var x = 8
console.log(x+=x>>2)
複製代碼
  • A. 4
  • B. 10
  • C. 8
  • D. 16
答案

答案: B

>優先級高於+= 至關於x += 2

13. 執行步驟是怎樣

0||!0&&1

複製代碼
  • A. 0||(!(0&&1))
  • B. 0||((!0)&&1)
  • C. (0||(!0))&&1
答案

答案: B

! 優先級最高,先求!0

&&優先級比||高

14. 輸出什麼

var o ={
	ab: 1
}
console.log('a' + 'b' in o)
複製代碼
  • A. true
  • B. 'afalse'
  • C. 'atrue'
  • D. false
答案

答案: A

先算'a' + 'b'

15. 輸出什麼

function * f() {
  var x = 1
  var y = yield x + 1
  console.log(y)
  var z = yield y + 1 
  console.log(z)
}

var g = f()
console.log(g.next(10).value)
console.log(g.next(100).value)
console.log(g.next(1000).value)
複製代碼
  • A. 2 100 101 1000 undefined
  • B. 2 2 3 3 undefined
  • C. 2 10 11 100 1000
  • D. 2 10 11 100 undefined
答案

答案: A

Generator 函數的調用方法與普通函數同樣,也是在函數名後面加上一對圓括號。不一樣的是,調用 Generator 函數後,該函數並不執行,返回的也不是函數運行結果,而是一個指向內部狀態的指針對象,也就是上一章介紹的遍歷器對象(Iterator Object)。

下一步,必須調用遍歷器對象的next方法,使得指針移向下一個狀態。也就是說,每次調用next方法,內部指針就從函數頭部或上一次停下來的地方開始執行,直到遇到下一個yield表達式(或return語句)爲止。

next方法能夠帶一個參數,該參數就會被看成上一個yield表達式的返回值

因此console.log(g.next(10).value)的10並無用

16. 輸出什麼

function f() {
    let x = y = 1
}
f()
console.log(x, y)
複製代碼
  • A. 1 1
  • B. undefined 1
  • C. undefined undefined
  • D. 1 undefined
答案

答案: B

賦值運算符順序是從右到左,因此先執行y=1,因爲沒有定義y,因此這裏y是全局變量

再把y賦值給x,但x是局部變量,在函數外訪問不到

故答案是undefined 1

17. 輸出什麼

const colorConfig = {
  red: true,
  blue: false,
  green: true,
  black: true,
  yellow: false,
}

const colors = ["pink", "red", "blue"]

console.log(colorConfig.colors[1])

複製代碼
  • A. true
  • B. false
  • C. undefined
  • D. TypeError
答案

答案: D

從左往右

優先級彙總表

先上個記憶祕訣: 括點油調一成作衣 叫等位裸跳服展昭

解釋

括: 括號

點: 成員訪問

油:new

調:函數調用

一:一元運算符

成:乘除加減

作衣: 按位左右移

叫:比較運算符(大於 小於)

等:等於

位:按位與或

裸:邏輯與或

跳:條件運算符

服:賦值

展:展開運算符

昭:逗號

參考

我的博客

github.com/abc-club/fr…

相關文章
相關標籤/搜索