(02)② 运算符、运算符优先级 | JavaScript 初识

155 阅读7分钟
转载请注明出处,未经同意,不可修改文章内容。

🔥🔥🔥“前端一万小时”两大明星专栏——“从零基础到轻松就业”、“前端面试刷题”,已于本月大改版,合二为一,干货满满,欢迎点击公众号菜单栏各模块了解。

涉及面试题:
 1. NaN 是什么?有什么特别之处?
 2. == 与 === 有什么区别?
 3. console.log(1+"2") 和 console.log(1-"2") 的打印结果?
 4. 为什么 console.log(0.2+0.1==0.3) 输出 false5. 请用三元运算符(问号冒号表达式)改写以下代码:
    if(a > 10) {
      b = a
    }else {
      b = a - 2
    }

 6. 以下代码输出的结果是?
    var a = 1;  
    a+++a;  
    typeof a+2;

 7. 以下代码输出什么?
    var d = a = 3, b = 4
    console.log(d)

 8. 以下代码输出什么?
    var d = (a = 3, b = 4)
    console.log(d)

 9. 以下代码输出结果是?为什么?
    var a = 1, b = 2, c = 3;
    var val = typeof a + b || c >0
    console.log(val)
    var d = 5;
    var data = d ==5 && console.log('bb')
    console.log(data)
    var data2 = d = 0 || console.log('haha')
    console.log(data2)
    var x = !!"Hello" + (!"world", !!"from here!!");
    console.log(x)

10. 以下代码输出结果是?为什么?
    var a = 1;
    var b = 3;
    console.log( a+++b );

11. 以下代码输出的结果是?为什么?
    console.log(1+1);
    console.log("2"+"4");
    console.log(2+"4");
    console.log(+"4");

12. var a = b = 3; 相当于?
  ❌ var a; var b; a = b; b = 3;
  ✅ var a; b = 3; a = b;
  ✅ var a = (b = 3)
  ❌ var (a = b) = 3

13. 以下说法正确的是?
  ✅ a++ 是一个表达式,表达式的值就是 a 原始的值, 之后 a 本身再自增 1。
  ✅ b = a++ 相当于 b = a; a++
  ❌ b = a++ 相当于 a = a + 1; b = a;
  ✅ b = ++a 相当于 b = (a = a + 1)


编号:[js_02]

前言: 上篇文章我们提到了“表达式”,而运算符的作用主要就是用于连接简单表达式,以组成一个复杂表达式。与运算符相关的知识点不算多,结合一些常识,细读本篇,我们会打好这个小基础。

  • 调试(针对 Chrome 浏览器)
    鼠标操作:右键 --> 检查 --> Console

  • 快捷键操作:
    Windows 系统:F12
    macOS 系统:command + option + i

1 常用运算符

  • 算术运算符
  • 赋值运算符
  • 比较运算符
  • 布尔运算符
  • 三目运算符
  • 其他

1.1 算术运算符

算术运算符可以细分为:

+   // 加法运算符
-   // 减法运算符
*   // 乘法运算符
/   // 除法运算符
%   // 余数运算符
++  // 自增运算符
--  // 自减运算符

1.1.1 加法运算符

把两个简单表达式(操作数)用“加号运算符”连接时:

  • 如果两个操作数都是“数字”的时候,做加法运算。
console.log(1 + 2)
// 3

  • 如果两个操作数都是“字符串”或其中有一个是“字符串”的时候,都转化为字符串,做字符串的拼接处理。
console.log("1" + "2")
// "12"

console.log("1" + 2)
// "12"  ❗️注意结果的读法:不是连读的数字 12,而是 1 和 2 分开读。

console.log(1 + "Oli")
// "1Oli"

console.log("Oli" + "cool")
// "Olicool"

  • 如果只有 一个“字符串” 操作数的时候,会尝试将这个“字符串”转换为 “数字”
console.log(+ "1")
// 1
  • 如果只有 一个“字符串” 操作数的时候,会尝试将这个“字符串”转换为 “数字”,但如果“字符串”无法转换为数字,则显示结果为:NaN

(💡NaN ——not a number :表示为“不是数字的数字”。所以可以理解为:它也是一个数字类型,不过它不是一个有效的数,表示为错误数字!)

(❗️ 注意:NaN 和 NaN 是不相等的,即 NaN 与自己不相等。)

console.log(+ "Oli")
// NaN

  • 如果操作数其中一个或两个是 “对象”,则调用对象的 .valueOf 或 .toString 方法(❗️ 两者同时使用时,注意优先级, valueOf 的优先级高于 toString )。

(💡暂时先了解,混个眼熟,后边的文章会详解~)

var obj = {
  toString: function() {
    return "hello"
  },
  valueOf: function() {
    return 1
  }
}

console.log(obj + "Oli")
// "1Oli"

🆚

var obj = {
  toString: function() {
    return "hello"
  }
}

console.log(obj + "Oli")
// "helloOli"

1.1.2 “减、乘、除”运算符

会尽可能地将“字符串”转换为“数字”,如果转换不了“数字”,则得出结果为:NaN 。

1.1.3 余数运算符

(💡这个运算符主要用于“循环语句”!)

console.log(100 % 3)
// 1

1.1.4 自增运算符

(着重讲自增运算符,自减运算符同理!)

x++
++x
  • x++ 作为 “表达式” 的结果是 x 本身的值;
  • x++ 作为同一作用域中的下一个“变量”,则是 x 内部又自增了 1,即 x = x + 1 ;
  • ++x 表示:自增后下一个变量 x 的值。
var a = 1;
var b = a++;

console.log(a)
// 2

console.log(b)
// 1


var c = ++a;

console.log(a)
// 3

console.log(b)
// 1

console.log(c)
// 3

1.2 赋值运算符

x += y   // 等同于 x = x + y
x -= y   // 等同于 x = x - y
x *= y   // 等同于 x = x * y
x /= y   // 等同于 x = x / y
x %= y   // 等同于 x = x % y
x &= y   // 等同于 x = x & y
x |= y   // 等同于 x = x | y

1.3 布尔运算符

布尔运算符用于结果为 true 或 false 的布尔表达式中。

有两种布尔运算符:“比较运算符”和“逻辑运算符”。 

  • 比较运算符: 比较运算符比较两个值,然后返回一个布尔值(true 或 false),表示是否满足比较条件。

JS 提供了 9 种比较运算符:

1.3.1 = 赋值

=  为“赋值运算符”,表示把 = 后边的表达式的值赋值给 = 前边的表达式。

var a;
var b = "Oli";
var c = a = b;

console.log(c)
// "Oli"

1.3.2 == 相等

这里的“相等”是 “近似相等”,后台得到的值是 true 或 false 。

如“数字”和“字符”串的比较,后台会将字符串做一个类型转换:

var aa = "3";
var bb = 3;

console.log(aa == bb)
// true

1.3.3 === 绝对相等

这里的相等是“绝对相等”,即类型都必须相等。

1.3.4 != 不相等

1.3.5 !== 严格不相等

1.3.6 < 小于

1.3.7 <= 小于等于

1.3.8 > 大于

1.3.9 >= 大于等于

  • 逻辑运算符:
    逻辑运算符将两个布尔表达式合二为一,得到一个布尔结果(true 或 false)。
运算符描述
||表示“或”,只要至少有一个表达式为 true,结果就为 true。
&&表示“与”,仅当两个表达式都为 true 时,结果才为 true。
!表示“非”,仅当表达式为 false 时,结果才为 true 。

1.4 三目运算符

三目运算符的语法规则为:

Condition ? true case : false case

  • 这里有一个 “条件判断”,如果“条件判断”为真,则整个表达式的结果就是 true case 执行的结果;
  • 如果“条件判断”为假,则整个表达式的结果就是 false case 执行的结果。

例如,将下面的代码用“三目运算符”改写:

if(a > 10) {
  b = a;
}else {
  b = a - 2;
}

用“三目运算符”简写为:

b = a>10 ? a : a-2

1.5 其他运算符

1.5.1 小括号

()

在 JS 中,小括号是一种运算符,它有两种用法:

  • 如果把表达式放在小括号中,作用是“求值”;
  • 如果跟在“函数”的后面,作用是“调用函数”。

1.5.2 void 

void 运算符的作用是:执行一个表达式,然后返回 undefined。

(💡具体用途,后边综合使用时再介绍,这里先混混眼熟!)

void 1;
// undefined

void 2;
// undefined

1.5.3 逗号运算符

“逗号运算符”用于对两个表达式求值,并返回后一个表达式的值

例如:

var a = 1;
var b = 2;
var c = (a, b);
console.log(c)
// 2

1.5.4 typeof 运算符

typeof 运算符常用于判断数据的类型(💡下篇文章会着重讲解 typeof 的用法)。

2 运算符的“优先级”和“结合性”

优先级: 运算符的“优先级”决定了表达式中运算执行的先后顺序,优先级高的运算符最先被执行。

结合性:“结合性”决定了拥有相同优先级的运算符的执行顺序。

  • 有的运算符是 “左”结合,即运算从左到右执行:
x = a + b + c;
x = (a + b) + c;
  • 有的运算符是**“右”结合**,即运算从右到左执行:
x = a = b = c;
x = (a = (b = c));

🏆 以下表格取自《JavaScript 权威指南》,从上到下表示运算符的“优先级”。R/L 代表相同优先级运算符的“结合性”是“右结合”还是“左结合”:


后记: 与“运算符”相关的知识点,我们很多都可以通过数学常识去掌握。对于生疏的,我们要勤于在开发工具上去调试、去试错。动起手来,一步一个脚印走踏实!

祝好,qdywxs ♥ you!