JS运算符优先级整理

723 阅读2分钟

typeof 2+4 的输出是什么?

之前了解的一些JS的运算符优先级大概仅涉及逻辑与或非、加减乘除、数值比较这类基础的运算符,而且也能满足开发中中的使用场景。最近遇到一道 JS基础测试题,因为对运算符优先级没有详细去整理过,果然一秒翻车

先看看原题

console.log(typeof 3+4)

 

输出是什么?

// 3 + 4 = 7
// typeof 7 => "number"

 

一秒解答,展示了对自己心算速度及熟练JS类型判断的的自信

实际上

 
console.log(typeof 3+4)
// "number4"

不够机灵(既然是题,肯定不是这种正常逻辑得出的答案,但投机取巧不可取)是一部分,但归根结底因为还是没有去完整的看过运算符优先级相关的文档(或者,看过,忘记了?)。话不多说,赶紧去MDN找找对应的文档。

顺手挑几个开发注意的比较少的,搞几个例子

  • new 操作符(有参数、无参数)

new的用法就不说了,这里有一个区别就是无参数和有参数优先级不同

    function Jonas(cat,dog){
        console.log('cat:',cat)
        this.cat = cat
        this.getDog = function (){
            return 'dog: not found'
        }
    }
console.log(new Jonas)
// output: cat: undefined
// output: Jonas { cat: undefined, getDog: f }
console.log( new Jonas().getDog() )
// output: cat: tauntuan
// output: dog: not found
console.log( new Jonas.getDog() )
// output:Jonas.getDog is not a constructor

 

  • 可选操作符(怎么之前没听过?)

可选链操作符 ?. 可以按照操作符之前的属性是否有效,链式读取对象的属性或者使整个对象链返回 undefined?. 运算符的作用与 . 运算符类似,不同之处在于,如果对象链上的引用是 nullish (null 或者 undefined),. 操作符会抛出一个错误,而 ?. 操作符则会按照短路计算的方式进行处理,返回 undefined可选链操作符也可用于函数调用,如果操作符前的函数不存在,也将会返回 undefined

使用场景:当尝试访问可能不存在的对象属性时,可选链操作符将会使表达式更短、更简明。在探索一个对象的内容时,如果不能确定哪些属性必定存在,可选链操作符也是很有帮助的。

测试一下

    const jonas = {
        name: 'Jonas',
        cat: {
            name: 'tuantuan'
        }
    }
    const dog = jonas.dog
    console.log(dog);
    // output: undefined
    const dogName1 = jonas.dog?.name
    console.log(dogName1)
    // output: undefined
    const dogName = jonas.dog.name
    console.log(dogName);
    // output: Cannot read property 'name' of undefined

(兼容性可能并没有那么好,移动端火狐和欧朋不支持该运算符)

  • 从右到左的关联性

幂运算 **

console.log( 2 ** 3 ** 2 )

// output: 512

typeof

typeof typeof 2+4

//output: "string4"