// == 表示值之间进行比较 === 不仅值进行比较,也做数据类型比较
var str1 = null;
var str2 = undefined;
console.log(str1 == str2);
console.log(str1 === str2);
//定义对象
//var obj; 这样子的定义方法是不对的
var obj = null; //这样才对
加法运算符的一些注意事项
非Number型 加法运算时 先转为number型在运算
var a = null;
console.log(a + 10);//null在 number型中 为 0
任何值与NaN运算 结果为NaN
var b = NaN;
console.log(b + 10); NaN
任何值和 字符串做 加法运算时,都先转为字符串,然后和字符串做拼串
var result = 10 + "abc";
console.log(result);
result = 1 + "true";
console.log(result);
// 减号与 加号 不同,仍然转为数值运算
console.log(10 - "123");
//字符串 作 乘法 也转为 NaN
var s1 = "123";
var s2 = "abc";
console.log(s1 * s2);//NaN
//分母为0 输出无穷大 Infinit
console.log(100 / 0);
//取余运算符 % m % n 相当于 m / n 获取余数
//n = 0 时 返回 NaN
//m = 0 时 返回 0
//n < m 时 正常取余 8 % 3 = 2
//n > m 时 返回 m 2 % 4 = 2
//一元运算符 无非就是 加号 和 减号
// 加号 不对数值产生 任何影响 对非number型 有了 加号 先转为number 然后在运算
var bool1 = true;
var res = +bool1;
console.log(res);
var str3 = "23";
var res1 = +str3;
console.log(res1);
var str4 = "as23";
var res2 = +str4;
console.log(res2);
// 负号 转为number型 同时也可 取反
console.log(1-"2"+3);
//赋值运算符 = 遵循右结合性
//a+=1 等价于 a = a + 1
//a*=1+2 遵循右结合性
var q = 5
console.log(q*=2+3);//25
//后缀表达式 i++ 先用后增
var j = 10,k = 20;
console.log(j++ + k++,j,k); // 30 11 21
//前缀表达式 ++i 先增后用
var u = 10,i = 20;
console.log(++u + ++i,u,i);//32 11 21
//逻辑运算符
//与运算符 条件A && 条件B 一假则假
//先判断A A不成立则直接输出false
result1 = true && true;
result2 = true && false;
console.log(result1,result2);
//短路测试
true && alert("I am coming!");
false && alert("I am not coming!");
//使用注意事项
//对于非Boolean型,逻辑与会自动转换为Boolean类型来判断
//条件A如果不成立 则返回条件A的数值本身
//如果A成立, 不管B成不成立,都返回条件B数值本身
var q1 = "123" && "abc"; //返回的是什么? true吗? 不是。 abc
console.log(q1);
q1 = "123" && 0;
console.log(q1);
q1 = null && 0;
console.log(q1); //null
//逻辑或
// 条件A || 条件B 一真则真 全为false才返回false
//只要A成立,不去看B直接返回true
//A不成立才判断B B成立 返回true B也不成立时返回false
//短路测试
true || alert("I am coming!"); //不执行了
false || alert("I am not coming!"); //能够执行
//使用注意事项
//对于非Boolean型,逻辑或会自动转换为Boolean类型来判断
//条件A 如果不成立 不管B成不成立,都返回条件B数值本身
//如果A成立, 则返回条件A的数值本身
var q2 = null || 0;
console.log(q2); // 返回0
q2 = "123" || "abc";
console.log(q2); //123
q2 = "123" || "0";
console.log(q2); //123
//逻辑非
//!条件A 对条件取反
var bool2 = true;
var w2 = !bool2;
console.log(w2);
//注意事项
//对一个值两次取反,它不会变化
bool2 = true;
w2 = !!bool2;
console.log(w2); //true
//对非布尔型,会先转为布尔型 然后取反
var q3 = "123";
var w3 = !q3;
console.log(w3);
//所以除了Boolean()转布尔型还可以 !!数值 这样子来转布尔型
// 关系运算符
/**
* > < >= <= == != === !== 且均遵循左结合性
* == 判断值 是否相等
* !=判断值 是否不相等
* === 判断值和类型 是否相等
* !==判断值和类型 是否不相等
*/
//注意事项
//对于非数值进行比较 会将其转为数值然后在比较
var e1 = "123";
console.log(e1 < 120); //false
console.log(1 > false); //true
//如果符号两侧 均为 字符串 那么会比较的是 字符串中字符的 Unicode编码
console.log('a' > 'b');//false
console.log('abc' > 'abd');//比较方法 先比a 再比b 最后比c和d 所以结果为 false
//null undefined NaN 之间的比较
console.log(null == 0); //false
console.log(undefined == 0); //false
console.log(NaN == 0); //false
console.log(NaN == NaN);//false
//Why?
//判断这个数是否为NaN isNaN()
var num = NaN;
console.log(isNaN(num));
console.log(null == undefined);//true
console.log(null === undefined);//false
console.log("123" == 123);//true
console.log("123" === 123);//false
//注意事项
//比较两个字符串型数字可能会得到不可预测的结果 所以比较前一定要转型呐
//逗号运算符 将多个表达式连接起来组成一个表达式
//a = 1 + 1,b = 3 * 4,c = 10 / 2;
//运算过程 先算a 再算b 最后算c
//整个逗号表达式的值是 最后一个表达式的值
var x,y,z,v; //这个不是逗号表达式呐
v = (x = 1 + 1,y = 3 * 4,z = 10 / 2);
console.log(x); //2
console.log(y); //12
console.log(z); //5
console.log(v); //5
//三目运算符
//条件表达式?语句1:语句2; 一定有结果 真则执行语句1 假则执行语句2
//条件运算符 ?和: 是一对运算符 不能单独使用
//如果条件表达式的求值结果是一个非布尔值 那么会先转为布尔值 在运算
"abc"?alert("hello"):alert("bye"); //hello