面试必考知识点算术运算符(附面试题)

217 阅读4分钟

算术运算符

我们上一篇对运算符一些必备的理论知识概念进行了介绍,没有看的同志们可以看一下 据说不了解这些运算符概念会直接影响开发。本篇主要针对面试中常出的一些面试题,来展开讨论。

为了节省大家的时间,我们直接上几道面试题,大家先来自己做一下。

        // 说出下面的输出结果
        console.log(1 + 2 * 3); 
        console.log(1 + 3 % 2); 
        console.log("" + 3 % 2);
        console.log(+"" + 3 % 2); 
        console.log(+{} + ""); 
        console.log(100 % 4 / 0); 
        console.log(null / null); 
        var a;
        console.log(a + {} + 123); 
        console.log(1 + "" + 2 + 3); 
        console.log({} * null); 
        console.log(+"" + 100);

公布答案 :

        // 说出下面的输出结果
        console.log(1 + 2 * 3);  // 7
        console.log(1 + 3 % 2);  // 2
        console.log("" + 3 % 2); // "1"
        console.log(+"" + 3 % 2);  // 1
        console.log(+{} + "");  // "NaN"
        console.log(100 % 4 / 0); // NaN
        console.log(null / null); // NaN
        var a;
        console.log(a + {} + 123); // "undefined[object Object]123"
        console.log(1 + "" + 2 + 3); //"123"
        console.log({} * null); // NaN
        console.log(+"" + 100);// 100

不知道大家是否都做对了以上题目,如果全部做正确,那么恭喜你,你的基础还是不错的。如果有错题,那么建议看一下我后面整理的内容。看完在来接这些题简直小KISS。

数学运算符有哪些?

  1. + - * /
  2. + - (正负) 优先级比 * / % 高
  3. ++ -- 下一篇文章着重来整理,大家期待一下
  4. %
  5. ** 幂运算
        var b = true;
        b = +b;
        console.log(b, typeof b); // 1 number

这些运算符的计算其实没什么,关键是其中要注重的细节比较多,我们来着重说一些哪些细节需要注意

细节

数字运算是不精确的

在js语言中数字运算是不精确的,特别是小数直接的运算。

除数为0时会方式什么事情

  • 如果被除数是正数,得到结果 Infinity (正无穷) (infinity是数字类型)
  • 如果被除数是负数,得到结果 -Infinity (负无穷)
  • 如果被除数是0,得到结果 NaN (Not a Number,非数字) (NaN是数字类型)

typeof函数 书写方式 :

  1. typeof xxx;
  2. typeof(xxx); typeof返回的类型是stringtypeof 123; 返回 "number" 字符窜类型的number

isNaN函数,该函数用于判断一个数据是否是NaN,返回boolean

isFinite函数,该函数用于判断一个数据是否是有限的,返回boolean

isFintiy(NaN) 返回是也是false 因为非数,系统也认为他是无限的

求余/求模

返回的是余数。 如果商为0的话,余数为1

其他类型使用算术运算

除加号之外的算术运算符

将原始类型转换为数字类型(自动完成转换),然后进行运算。

  • boolean: true -> 1, false -> 0
  • string: 如果字符串内部是一个正确的数字,直接变为数字,如果是一个非数字,则得到NaN(能识别Infinity,不能把字符串内部的东西当作表达式),如果字符串是一个空字符串(没有任何内容),转换为0. 字符串转换时,会忽略前后空格。
+”1/2NaN  //字符串内部转化不能识别表达式

NaN虽然是数字,但它和任何数字作任何运算,得到的结果都是NaN

  • null:null -> 0 (+null –》0 -null—》 -0 历史遗留问题 -null + null = 0)
  • undefined: undefined -> NaN

将对象类型先转换为字符串类型,然后再将该字符串转换为数字类型

对象类型 -> "[object Object]" -> NaN

如果直接是对象字面量去计算的话会报错,因为程序理解{}为代码块,如果想让其不报错,那么就需要将{}存放到变量中,var a = {}; a * 5 = NaN. 再者是变为表达式({} * 5)这样系统会把其当做一个表达式去看。

加号运算符

  • 加号一边有字符串,含义变为字符串拼接

将另一边的其他类型,转换为字符串

数字 -> 数字字符串 boolean -> boolean字符串 null -> "null" undefined -> "undefined" 对象 -> "[object Object]"

  • 加号两边都没有字符串,但一边有对象,将对象转换为字符串,然后按照上面的规则进行

  • 其他情况和上面的数学运算一致

本文使用 mdnice 排版