操作符
算数运算符
进行数据运算时,除’+外,其他运算符可以自动将字符串数字隐形转成数字
一元运算符
+:数据相加,取正数,字符串拼接,可以将数字字符串或布尔类型等隐式转换成number类型
-:可以将字符串数字隐式转换成数字
!:!null undefined ‘’(空字符串)为true
配合条件创建语句生成一个条件
++放在前面,并进行赋值:先累加,后赋值
++放在后面,并进行赋值:先赋值,后累加
delete:删除数组或对象中特定索引的值 [1,2,< l empty item>,4,5 ] undifined未定义
JavaScript隐式转换是如何进行的?(面试)
JavaScript中有两类数据类型:原始类型、对象类型:原始类型(基础类型):
Undefined、Null、String、Number、Boolean、Symbol(es6新推出的,暂不考虑)
对象类型
object
基本数据类型的转换
加减乘除:
1.字符串加数字,数字就会转成字符串。数字加数字或字符串加字符串不需要转换。首先把等号左右两边进行了求原值ToPrimitive()操作,然后如果有两个或多个原始值只要有一个是String类型,就把两个或多个原始值都进行转化字符串toString()操作,进行字符串拼接;否则把两个或多个原始值都进行转化数字toNumber()操作,进行数字相加。
2.数字减字符串,字符串转成数字。如果字符串不是纯数字就会转成NaN。字符串减数字也一样。两个字符串相减也先转成数字。
3.乘,除,大于,小于跟减的转换也是一样。
(面试)有关==的隐式转换
1.undefined等于nul!
2.字符串和数字比较时,字符串转数字
3.数字和布尔比较时,布尔转数字
4.字符串和布尔比较时,两者转数字
undefined == null;//true
'0'== 0;//true,字符串转数字
0 == false;//true,布尔转数字
0'== false;//true,两者转数字
(面试)引用类型的转换
PreferredType转换策略
一如果PreferredType被标记为Number,
1、如果输入的值已经是一个原始值,则直接返回它
2、否则,如果输入的值是一个对象,则调用该对象的valueOf()方法,如果valueOf()方法的返回值是一个原始值,则返回这个原始值。
3、否则,调用这个对象的toString()方法,如果toString()方法返回的是一个原始值,则返回这个原始值。
4、否则,抛出TypeError异常:
二。如果PreferredType被标记为String
PreferredType的值会按照这样的规则来自动设置:
1、该对象为Date类型,则PreferredType被设置为String
2、否则,PreferredType被设置为Number
例如
[ ]+[ ] " "
进行ToPrimitive,两个都是Array对象,不是Date对象,所以以Number为转换标准,所以先调用valueOf(),结果还是[1,不是原始值,所以继续调用toString(),结果是“”(空字符串)原始值,将“”返回。第二个[]过程是相同的,返回“”。加号两边结果都是String类型,所以进行字符串拼接,结果是" "
[ ]+{ }//"[object object]'
进行ToPrimitive,依然是以Number为转换标准。
[]的结果是“”。
{}先调用valueOf(),结果是{},不是原始值,所以继续调用toString(),结果是“[object Object]”,是原始值,将“[object Object]”返回。加号两边结果都是String类型,所以进行字符串拼接,结果是“[objectObject]”
{ }+[ ]// 0
这道题按照上一题的步骤,讲道理的话,结果应该还是“[object Object]”但结果却出人意料--显示的答案是0!这是什么原因呢?原来{}+[]被解析成了{},+],前面是一个空代码块被略过,剩下+[]就成了一元运算。[]的原值是””,将””转化成Number结果是
{}+{}//"[object object][object object]
在金丝雀版本的chrome浏览器和node中,结果符合预期。结果是”object Object”
在普通版本的chrome浏览器中结果是NaN。这是为什么呢?原因是在node中会将以“{”开始,“”结束的语句外面包裹层(),就变成了({}+{}),结果就符合预期。而普通版本的chrome依然会解析成心;+,结果就变成了NaN
赋值运算符
比较运算符
双等和三等的区别
双等表示只要值相等即可为真,而三等则要求不仅值相等,而且也要求类型相同。
建议:尽量使用严格运算符 三等。因为"=="不严谨,可能会带来一些违反直觉的后果。
注意
1、对于string,number等基础类型,双等和三等是有区别的
1)不同类型间比较,双等之比较“转化成同一类型后的值”看“值”是否相等,===如果类型不同,其结果就是不等
2)同类型比较,直接进行“值”比较,两者结果一样
2、对于Array,Object等高级类型,双等和三等是没有区别的
进行“指针地址”比较
3、基础类型与高级类型,双等和三等是有区别的1)对于==,将高级转化为基础类型,进行“值”比较2)因为类型不同,===结果为false
!=和 ==用法类似 比较若类型不同,先偿试转换类型,再作值比较,最后返回值比较结果
!== 和 === 用法类似 只有在相同类型下,才会比较其值。
逻辑运算符
可应用于任意数值。如果有一个操作数不是布尔类型,逻辑与就不一定返回boolean类型
如果第一个操作数是null,NaN,undefined,false,0,""可被转换为false的值的时候返回该值
三目运算符
var age = 19;
var result=age >16 ?"成年人":"未成年人";
当age大于16岁时,条件为真,执行senten,其次反之