值----字符串
1 .使用加号:数字,布尔,数组,函数,预定义对象,对象直接量,字符串连接优先级大于求和运算。以上所有的使用加号都会转为字符串。
2 .加号运算符不仅优先于连接操作,还会考虑顺序,当运算元的类型不一致的时候,加号会尝试把数值运算为字符串,在执行连接请求 1+1+‘1’=21 ,‘1’+1+1
3 .括号运算符能改变一行内表达式的运算符顺序。
4 .toString()方法。number类型是可以有参数添加的,默认转为10进制表示。
5 .数组:空数组转为空字符串"",如果数组中有null,undefined,同样当作空字符串处理[1,2,3,4]相当于调用数组的join方法 将各元素用逗号“,”拼接
[1,null,2,undefined,3] "1,,2,,3"
6 .函数:function a(){}转为字符串是“function a(){}”
7 .一般对象,全都是“[object object]”
8 .1+{a:1} "1[Object Object]" "1"+{a:1} 和全面的一样
9 .{a:1}+1 1 {a:1}+"1" 也是和前面的一样
数字转为字符串有了新的方法toFixed()其他es6语法
值--数字
1 .字符串类型 parseInt,parseFloat()也支持进制输入来实现转化为特定的操作。
2 .乘号运算符。变为数字,有个bug就是可以先乘1变为数字,然后在求和
3 .减法:2-‘1’=1 对字符串来说,如果转换失败,就返回NaN.
值转化为布尔值
1 .在js中,任何数据都可以被自动转为布尔值,在循环判断或参与逻辑运算符时,会自动转换
2 .!!会转换到真实环境下自己的表示的布尔值
3 .还有那6个兄弟
4 .使用Boolean()方法
数据类型的强制转换
1 .Boolean()生成新值,新值存放原始值直接转换的类型。
2 .Number()
3 .String()
引用类型的自动转换
1 .一般情况会允许出现这种情况么?
2 .如果非要拿对象和数组做运算,先调用value of()--toString()
3 .null,undefined没有toString()方法。
4 .
toString方法,返回这个对象的字符串
1 .null,undefined 没有toSring()
2 .字符串按原始值返回
3 .布尔值按原值返回
4 .数值
1.-,+浮点数无效,NaN-NaN , infinity,-infinity-原值
2.整数类型必须在括号里使用这个方法 ().toString().主要是.号会发生干扰
3.toString(2,6,8)会有进制转换
4 .对象会全返回[object object]。但是不会识别自定义类型Object.prototype.toString.call(a)
5.Function --函数源码(自定义函数),内置函数-[native code] !区分内置函数和自定义函数。果然一切皆独象。
valueOf()
1 .null,undefined 不是对象,没有这个方法
2 .布尔--原值值:boolean.valueOf() [native code]和toString()一样
3 .对象Object类型及自定义对象返回原值对象。
toString()返回字符串,valueOf():返回原对象。
隐式转换
字符串转换场景
1 .+ 所有和字符串相加的基础变量都将转为字符串
2 .- 字符串和数字之间使用减号连接,则会都转为数字进行计算
3 .[]+{} [object,object]
4 .{}+[] 0
5 .这俩看来是以后面的为准,复杂数据之间的转换
6 .当一侧为string类型,被识别为字符串拼接,会优先将另一侧的转换为字符串类型
"1"+1,11
1+"1",11
7 .当一侧为number,另一侧为原始类型,则会将原始类型转为number
1 .1+<=
8 .当一侧为Number类型,另一侧为引用类型,将引用类型和Number类型转换成字符串后拼接
[1,2,3]+1 ,1,2,3,+1 = 1,2,31
123+{} = 123[object object]
数字转换场景
1 .自增,自减运算符 ++,--
2 .布尔值转为数字的场景 1+true=2 1-false=1 第一个值是数字,运算符后面的布尔值就会转换为数字计算
3 .+"1" 也会转化为数字1
4 .1*"2"=2 字符串“2”也会转化为数字2
5 .其他的四则运算 *,%,/,或者关系运算符,>,<,>=,<=,==,!=,===,!=== ,如果比较运算符两边都是数字类型,直接比大小,如果是非数值进行比较的时候,会将他们转为数字然后比较。如果两边都是字符串的时候,会比较字符串中字符的unicode编码
6 .我们在对各种非Number类型运用数学运算符(- * /)时,会先将非Number类型转换为Number类型
1 .1-true =0
2 .1-null =1
3 .1*undefined NaN ,undefined 会转化为NaN
4 .2*["5"] 10
5 .
如果是ts的话,肯定是不会出现这种情况的
布尔值转换场景
1 .for 中第二个 x<10
2 .while
3 .if
4 .三元计算符
5 .||,&&,左边的操作数
6 . !变量
- undefined==null true undefined===null false
8 .NaN不等于任何值,包括他自己
9 .引用值不能进行==比较,因为栈中存在的仅仅是引用地址
10 .对象和基础类型比较,会优先将字符串转为基础类型在进行基础类型的比较
1 .[]==[] false
2 .{}=={} false
3 .[]==false true
4 .[]==![] true
5 .[1,2,3]=="1,2,3" true 所有数组隐式转换为字符串时,只需将[]替换为""
6 .{a:1}=="a:1" false 所有对象隐式转换为字符串时,其值均为’[object Object]’
7 .引用变量.valueOf().toString()
8 .[]==[].valueOf().toString() true
9 .[]===[].valueOf().toString() false
特殊符号的转换
1 .所有的符号都不能被转为数字
2 .所有的符号都能被转为布尔值 true
3 .可以被转换成字符串symbol
比较场景下的数值转换
1 .==,宽松相等,两边可以进行类型转换
2 .=== ,严格相等,两边不能进行类型转换
3 .字符串与数字-字符串转为数字进行比较
4 .其他类型与布尔类型-先把布尔值转为数字,进行比较
5 .对象与非对象,执行对象的toPrimiitive 然后继续比较
6 .假值列表 undefined,null,NaN,false,+0,-0," "。注意,{},[],都不是假值
7 .null ==undefined是true,别的都是false
8 . !0==0 false !0转换为布尔值是true,0转换为布尔值是false
9 . !0==1
10 .特殊 new Date(xxx) - new Date()是数值 相加是字符串
toString和valueOf
1 .都是对象的方法
2 .toString返回的是字符串,valueof返回的是原对象
3 .undefined和null没有toString,valueOf方法
4 .包装对象的valueOf方法返回该包装对象对应的原始值
5 .使用toString可以区分内置函数和自定义函数