都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…

相关文章
相关标签/搜索