js隐式转换
2021-04-28 09:48:17 4 举报
AI智能生成
js类型转换
作者其他创作
大纲/内容
布尔值到数字
!!
逻辑运算符 || (或)和 && (与)
&& 和 || 运算符的返回值并不一定是布尔类型,而是两个操作数其中一个的值
&& 遇到假值就返回;
|| 遇到真值就返回;
|| 遇到真值就返回;
a=1;b=0;c=false;
a&&b&&c;//0
a&&b&&c;//0
a || b;相当于:a?a:b
a && b;相当于: a?b:a
a && b;相当于: a?b:a
ToString
非字符串到字符串的强制类型转换
JSON 字符串化有用到ToString
ToBoolean
假值:
undefined
NAN,+0,-0
null
false
""
undefined
NAN,+0,-0
null
false
""
对象与非对象
var a = 42;
var b = [ 42 ];
a==b;//true
var b = [ 42 ];
a==b;//true
[42]首先调用ToPromitive抽象操作,返回“42”,变成“42”==42;“42”调用Number方法变成42==42
字符串和数字 “+”运算符是加法还是拼接
结论:
1.如果操作数是字符串,则拼接;
2.如果操作数是数组,但是能够通过ToPrimitive转换为字符串,则执行拼接;
1.如果操作数是字符串,则拼接;
2.如果操作数是数组,但是能够通过ToPrimitive转换为字符串,则执行拼接;
var a = [1,2]; var b = [3,4];
a + b; // "1,23,4"
a + b; // "1,23,4"
[1,2].valueOf().toString();//"1,2"
[3,4].valueOf().toString();//"3,4"
"1,2"+"3,4";//"1,23,4"
[3,4].valueOf().toString();//"3,4"
"1,2"+"3,4";//"1,23,4"
var a = "42"; var b = "0";
var c = 42; var d = 0;
a + b; // "420" c + d; // 42
var c = 42; var d = 0;
a + b; // "420" c + d; // 42
坑:[]+{} //"[object Object]"
{}+[] //0
{}+[] //0
a+"" (隐式)=>先调用valueOf,再调用toString()
String(a) (显式)=>直接调用toString()
String(a) (显式)=>直接调用toString()
日期显式转换为数字:
var d = new Date( "Mon, 18 Aug 2014 08:53:06 CDT" ); +d; // 1408369986000
获取当前时间戳:var timestamp = +new Date();
奇特的 ~ 运算符
位运算符只适用于 32 位整数,通过抽象操作符ToInt32实现的
ToInt32 首先执行 ToNumber 强制类型转换,比如 "123" 会先被转换为 123 ,然后再执行 ToInt32
它首先将值强制类型转换为 32 位数字,然后执行字位操作“非”(对每一个字位进行反转)
~x 大致等同于 -(x+1)
字位截除 ~~
隐式强制类型转换为布尔值ToBoolean()
(非布尔值会被隐式强制类型转换为布尔值)
(非布尔值会被隐式强制类型转换为布尔值)
if (..)语句中的条件判断表达式
for ( .. ; .. ; .. )语句中的条件判断表达式(第二个)
while (..)和do..while(..)循环中的条件判断表达式
? :中的条件判断表达式
逻辑运算符 || (逻辑或)和 && (逻辑与)左边的操作数(作为条件判断表达式)
符号的强制类型转换
1.允许从符号到字符串显式 强制类型转
2.隐式 强制类型转换会产生错;
3.符号不能够被强制类型转换为数字(显式和隐式都会产生错误),但可以被强制类型转换为布尔值(显式和隐式结果都是 true )。
2.隐式 强制类型转换会产生错;
3.符号不能够被强制类型转换为数字(显式和隐式都会产生错误),但可以被强制类型转换为布尔值(显式和隐式结果都是 true )。
var s1 = Symbol( "cool" );
String( s1 ); // "Symbol(cool)"
var s2 = Symbol( "not cool" ); s2 + ""; // TypeError
String( s1 ); // "Symbol(cool)"
var s2 = Symbol( "not cool" ); s2 + ""; // TypeError
ToNumber
将非数字转换为数字
true 转换为 1;
false转换为0;
undefined 转换为 NaN;
null 转换为 0
false转换为0;
undefined 转换为 NaN;
null 转换为 0
宽松相等==和严格相等===
双等和三等的区别?
都会检查操作数的类型
如果两个值类型相同,则执行相同的算法。
如何类型不同,需要考虑有没有强制类型转换的必要,如果有则用==,如果没有则用===。JS引擎实现上会有微秒级(百万分之一秒)的差别
==在比较两个不同类型的值时会发生yin式类型转换,会将其中之一或两者都转换为相同的类型后再 进行比较。
如何类型不同,需要考虑有没有强制类型转换的必要,如果有则用==,如果没有则用===。JS引擎实现上会有微秒级(百万分之一秒)的差别
==在比较两个不同类型的值时会发生yin式类型转换,会将其中之一或两者都转换为相同的类型后再 进行比较。
结论:== 允许在相等比较中进行强制类型转换,而 === 不允许。
抽象关系比较
var a = [ "42" ]; var b = [ "043" ];
a<b; //false
a<b; //false
var a = [ 4, 2 ]; var b = [ 0, 4, 3 ];
a<b; //false
a<b; //false
var a = { b: 42 }; var b = { b: 43 };
a<b;//false
a<b;//false
var a = { b: 42 }; var b = { b: 43 };
a<b; //false a == b; // false a>b; //false
a <= b; // true a >= b; // true
a<b; //false a == b; // false a>b; //false
a <= b; // true a >= b; // true
实际上JavaScript中<=是“不大于”的意思
var a = [ 42 ]; var b = "043";
a < b; // false -- 字符串比较! Number( a ) < Number( b ); // true -- 数字比较!
a < b; // false -- 字符串比较! Number( a ) < Number( b ); // true -- 数字比较!
0 条评论
下一页