本文共 5695 字,大约阅读时间需要 18 分钟。
隐式转换—在使用运算符进行运算或判断时,基本都涉及它。
在多种数据类型不同时,进行运算需要将这些数据转换为相同的。
一、算术运算符 “+”
-
与字符相加:与字符相加后都是字符串,(隐式转换);后台打印都是黑色的啊;
所以,转化字符串最快捷的方式是:变量+="";var str = “abc”;//测试的加数
var char = “”;//空字符串 var a = 11; // 11abc 11 var a = true; //truabc true var a; //undefinedabc undefined var a = null; //nullabc null var a = {b:10};//[object Object]abc [object Object] 也是–>字符串相加 var a = [1,2]; //数组-全部打印 1,2abc 1,2 也是–>字符串相加 var a = NaN;//NaNabc NaN console.log(a+str); //字符串相加,首位相连 console.log(a+char); -
与数值相加:(隐式转换)
var num = 4;
var a = 0;//4 数值+数值=数值 var a =true; //5 true转化为数值为1 var a = false; //4 false转化为数值为0 var a;//NaN undefined转换为数值本来就是NaN var a = null;//4 null转换为数值为0 var a = [1,2,3];//1,2,34 也是–>字符串相加 var a = {b:3};//[object Object]4 也是–>字符串相加 var a = NaN;//NaN (任何数值加NaN都是NaN) console.log(a+num); -
与布尔值相加:除字符、对象外,该布尔值转化为数值计算
var bool = true;
var a;//NaN undefined转化为数值为NaN var a = null;//1 a和bool都转化伪数值,相当于0+1 var a = {b:1};//[object Object]true 也是–>字符串相加 var a =[1,4,6];//1,4,6true 也是–>字符串相加 var a= NaN;//NaN bool转成数值,数值+NaN=NaN var a = false;//1 false转成数值为0 console.log(a+bool); -
与Object对象相加:都会转换成字符串相加
数组是对象var obj={b:77};
var a;//undefined[object Object] var a = null;//null[object Object] var a = {c:33};// [object Object][object Object] var a = [5,7];//5,7[object Object] var a = [];// [object Object] 空数组为空,没有元素 console.log([]+[]);//数组是对象 var a = NaN; //NaN[object Object] console.log(a+obj); -
特殊内容总结-------
- 与NaN相加: 数值+NaN=NaN(包括隐式转换成数值的) 字符+NaN=字符串(任何内容+字符=字符串)
- 与对象相加: 内容+对象=字符串
- 与数组相加: 数组是对象,so :内容+数组=字符串 (数组转换为字符串时是将数组的元素转换为字符串相连)
- undefined与null: console.log(undefined+null); //NaN console.log(undefined == null); //true 都为空 console.log(undefined===null); //false 类型不一样
减法 乘法 除法 取模% 转换为数值运算
与NaN做运算都为NaN(包括隐式转换成NaN的);
eg:console.log({a:1}-0); //NaN
赋值运算、一元运算
-
赋值运算符:= += -= *= /= %= (常用)
var a = 5; a +=""; //a快速转换成字符串
var b = 3; var sum = b+=2; console.log(sum,b);//5 5 -
一元运算符: - - ++
var a = 1;
console.log(++a,a++,a,); //2 2 3 a自增为2,++a的值为2;a++的值为2,然后a自增为3;输出a的值为3 面试题1: var x = 1; var y = x++ + x + x++ + x++ + ++x; //从后往前划分容易 console.log(x,y); //5 13 x:2 2 3 4 5 x=5 y:1+2+2+3+5=13
关系运算符: > < >= <= == === != !==
此 > < >= <= 判断结果是 boolean 值(能判断就判断大小,否则判断为false)
-
判断字符串大小:字符的ASCII 或者 Unicode码值,依次比较
var a = c = “aa5a”;
var b = “a9b”; var d = “afc”; var x = “aA”; console.log( c );//aa5a 可以连等,最好别这么写 console.log(a>b);//true 数字<字母(大写、小写) console.log(a>d);//false ASCII 字母靠后越大 console.log(a>x);//true ASCII 小写字母>大写字母 -
字符串与数值比较时,字符串转换为数值再比较
console.log(“2a”>1);//false
console.log(“2”>1);//true -
判断boolean大小,隐式转换为数值
console.log(true>false);//true
console.log(true>"");//true console.log(true>0);//true console.log(true>null);//true console.log(true>undefined);//false undefined转化为数值是NaN console.log(true>NaN);//false -
判断undefined与null
console.log(undefined>null);//false
console.log(undefined<null);//false console.log(undefined==null);//true 判读空的结果相同 -
判断比较结果类型
console.log(typeof({a:1}<{b:2})); //boolean
= 赋值;==比较;===精确比较,比较值和类型
console.log(“1”==1);//true
转化为数值,再进行比较
console.log("" == 0); //true
console.log(0 == false); //true console.log("" == false); //ture 说明: 0 == “” == false 但是,console.log("" === false); //false ,一定要注意,类型不等
特殊情况:
console.log(undefined == null); //true ; undefined == null 判读空的结果相同 var a; if(a == null){ // undefined 与 null console.log(“aa”);//aa 被打印了 } if(a == 0){ console.log(“a == 0”); // a是 0 false “” }
console.log(null == “”);//false
console.log(null == 0);//false console.log(null == false);//false null在设计上,在此处不尝试转型
NaN永远不和任何内容相等,包括NaN
var a = “a”; if(a!=NaN) console.log(“dff1”); //dff1 最好使用最下面的方法来判断a与NaN if(a == NaN) console.log(“dff2”);//未打印 if(NaN == NaN) console.log(“dff3”);//未打印 下面这种方法常使用: if(isNaN(a)){ console.log(“非数值”); // 判断a是否是NaN //isNaN()里面的内容会 自动隐式转换为数值 }
对象的 " == " 判断
var obj = {a:1}; var obj1 = {a:1}; console.log(obj == obj1);//false 引用地址不同 console.log([]==[]);//false 数组也是对象,很明显,这是两个空数组
=== 、 != 的判断
console.log(“1” == 1);//true console.log("1 "=== 1);//false 比较值和类型 console.log(0!=null);//true console.log(0==null);//false null在设计上,在此处不尝试转型 console.log([]!=[]);//true
逻辑运算符: ! 、&& 、 || 有且仅有一个返回值
var a = 1;
console.log(0<a<10);//true 但最好别这么写 console.log(a>0 && a<10);//true 这么写比较好
true && true =true;
true && false =false; false && true =false; false && false =false; true || true =true; true || false =true; false || true =true; false || false =false;
- && 先运行左侧,再运行右侧
a="" && 1; //"" &&运算的两端,谁转换的布尔值先是false,就返回该值;
a= 1 && “dshig”; //dshig 两端转换为布尔值都是true,就返回&&运算符右侧的值; console.log(a); 面试题2 var a=1; a=a-- && ++a; //1&&1 a=1 s=–a && ++a; //0&& a=0 s=0 c=++a && a–; //1&&1 a=0 c=1 console.log(s,a,c); //0 0 1
- || 先左后右
var a=1,b=1;
a=–a || a++; // 0||0 return 0 都错,返回右侧 b=b-- || b++; // 1|| return 1 上来就1了,直接返回 c=NaN || 0; // return 0 都错啊 d=0 || NaN; // return NaN console.log(a,b,c,d); // 如果||的左侧的结果是ture,就直接返回左侧,不运算右侧;称这种现象为:熔断。 -------对象中:----- var obj; console.log(Boolean(obj)); //false console.log(Boolean({}));//true console.log(obj || {}); //return {} var obj1={a:1}; console.log(obj1 || {}); //return {a: 1}
- ! (特殊) 取反值 先将内容转换为布尔值,再取反值,且 !得到的结果都是布尔值
var obj={},obj1={};
console.log(!10);//false console.log(!"");//true console.log(!obj1);//false console.log(obj1);//{} console.log(obj==!obj1);//false console.log(obj == obj1);//false 引用地址不同 面试题3 console.log(![] == []);//true false=="" console.log([] == []);//false console.log([] != []);//true ------- ! 延伸--------- var obj3; // 如果obj3是 “” 0 false undefined null NaN 这6种写法就可以进入条件,如: if(!obj){} if(obj3 == null){} if(obj3===null){ obj3={c:3}; }
三目运算符—条件运算符
格式:条件 ? 条件是true返回的结果 : 条件是false时返回的结果
面试题4—比较大小
var a=0,b=9,c=3; // var max=a>b ? (a>c ? a : (c>b ? c : b)) : b>c ? b : (c>a ? c : a); var max=a>b ? (a>c ? a:c):(b>c ? b:c); console.log(max);//9 var s=3>5 ? false : true; console.log(s);//true
转载地址:https://blog.csdn.net/weixin_43297321/article/details/103756725 如侵犯您的版权,请留言回复原文章的地址,我们会给您删除此文章,给您带来不便请您谅解!