算术运算符
我们上一篇对运算符一些必备的理论知识概念进行了介绍,没有看的同志们可以看一下 据说不了解这些运算符概念会直接影响开发。本篇主要针对面试中常出的一些面试题,来展开讨论。
❝为了节省大家的时间,我们直接上几道面试题,大家先来自己做一下。
❞
// 说出下面的输出结果
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。
❞
数学运算符有哪些?
+ - * /+ -(正负) 优先级比 * / % 高++ --下一篇文章着重来整理,大家期待一下%**幂运算
var b = true;
b = +b;
console.log(b, typeof b); // 1 number
这些运算符的计算其实没什么,关键是其中要注重的细节比较多,我们来着重说一些哪些细节需要注意
细节
数字运算是不精确的
在js语言中数字运算是不精确的,特别是小数直接的运算。
除数为0时会方式什么事情
- 如果被除数是正数,得到结果 Infinity (正无穷) (infinity是数字类型)
- 如果被除数是负数,得到结果 -Infinity (负无穷)
- 如果被除数是0,得到结果 NaN (Not a Number,非数字) (NaN是数字类型)
typeof函数 书写方式 :
typeof xxx;typeof(xxx);typeof返回的类型是string如typeof 123;返回"number"字符窜类型的number
isNaN函数,该函数用于判断一个数据是否是NaN,返回boolean
isFinite函数,该函数用于判断一个数据是否是有限的,返回boolean
isFintiy(NaN) 返回是也是false 因为非数,系统也认为他是无限的
求余/求模
返回的是余数。 如果商为0的话,余数为1
其他类型使用算术运算
除加号之外的算术运算符
将原始类型转换为数字类型(自动完成转换),然后进行运算。
- boolean: true -> 1, false -> 0
- string: 如果字符串内部是一个正确的数字,直接变为数字,如果是一个非数字,则得到NaN(能识别Infinity,不能把字符串内部的东西当作表达式),如果字符串是一个空字符串(没有任何内容),转换为0. 字符串转换时,会忽略前后空格。
+”1/2” NaN //字符串内部转化不能识别表达式
「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 排版