前言
经常被坑, 但是我人又傻, 记不住 唉.
还是花点时间整理一下吧.
最后总结部分我总结了两句话, 懒得看例子的话你可以直接去看那两句总结;
规划方案
考虑到某些时候表达式中两值互换位置会发生结果不同的情况, 所以轮流使用单一类型与不同类型进行运算, 确保能覆盖到两值相同, 位置不同的情况.
复杂数据类型我觉得应该分为空和非空来进行测试, 比如空对象和非空对象这样.
字符串类型应该分为数字类型字符串(比如"3")和字符类型字符串(比如"text");
然后函数字符串布尔字符串之类的测试过了都是直接拼接, 我觉得没必要了.
使用该函数进行结果输出;
function comput(par1, par2) {
console.log(par1 + "和" + par2 + "的运算:")
console.log("加: " + (par1 + par2));
console.log("减: " + (par1 - par2));
console.log("乘: " + (par1 * par2));
console.log("余: " + (par1 % par2));
console.log("双等: " + (par1 == par2));
console.log("_______________________________")
}
String
字符串和其他类型进行运算;
可能是最容易出现的吧, 我个人经常遇到字符串和各种奇葩的东西放在一起运算的情况.
Number
字符串和数字
我们先不看加法, JS中加法运算符具有特殊性, 因为JS里拼接字符串使用"+"进行, 可以看到的是, 不论数字加字符串还是字符串加数字(即便是"4"那种字符串型数字), 结果都会是按照字符串来处理, 以字符串拼接处理的优先级太高.
就其他运算符来看, 不论如何运算, 表达式里的String都会尝试向Number类型转换, 然后再完成运算, 即便String不能转换为Number, 它也不能再以原本姿态参与运算, 而是以转换Number失败的形态——NaN来参与运算.
comput("string", 3);
而对于能够转换为Number的字符串, 就可以成功转为Number参与运算得到Number.
comput("6", 3);
Boolean
可以看出Boolean类型也会优先转换自身为Number类型再参与运算, 但是加法依然会优先执行字符串拼接操作, 将两者都转为字符串然后拼接.
对于其他运算方法, 在String不能转换为Number的情况下, Boolean又必能转为数字, 所以将会得到NaN.
comput("string", true);
而对于其他运算方法, 在String可以转换为Number的情况下, 由于true会转换为1, false会转换为0, 所以会得到Number.
comput("6", true);
undefined
加法依旧是特殊的, 在其他运算符情况下, undefined也会先尝试将自己转换为Number, 但是很遗憾它自己被Number()完之后就是个NaN.
所以碰谁谁NaN.
comput("string", undefined);
对于可以转为Number的String, 也会优先进行类型的转换, 但是由于undefined会稳定的转为NaN, 所以依旧是无济于事的NaN了.
comput("6", undefined);
null
String和null
String当然还是分为可转换为Number和不可转换Number的类型, 并且也会向Number类型转换可预计的分为Number和NaN, 但是null, 现在不知道会怎么转换, 或许是String类型的"null", 或许是Number类型的0.
comput("string", null);
comput("6", null);
Array
String和Array,
空Array会被转换为空字符串, 而非空数组会被去掉括号转换成字符串, 这样实际进行的其实是两个String的运算.
comput("string", []);
这种情况下String可以转换为Number, 根据乘法和减法的区别来看, 空字符串在运算时转换为了Number类型值0;
comput("6", []);
排除加法, 这种情况下String无法成功转为Number, 结果会是NaN和String的运算.
comput("string", [1, 2, 3]);
对于可转为Number类型的String,
comput("6", [1