显示类型转换
Number()
var num = Number(true); console.log(typeof(num) + num)
—结果:number: 1var num = Number(false); console.log(typeof(num) + num)
—结果:number: 0var num = Number(null); console.log(typeof(num) + num)
—结果:number: 0var num = Number(undefined); console.log(typeof(num) + num)
—结果:number: NaNvar num = Number(“-123”); console.log(typeof(num) + num)
—结果:number: -123var num = Number(“123abc”); console.log(typeof(num) + num)
—结果:number: NaN
parseInt()
- 将数字转化为整形,也可以将字符串转化为数字。
var demo = 10; console.log( parseInt(demo,16));
—将10当16进制转化为10进制 number:17var demo = "123.12abc"; console.log( parseInt(demo,16));
— number:123 以非数字位为断点转化
parseFloat()
var demo = "123.12abc"; console.log( parseInt(demo,16));
— number:123.12 以非数字位为断点转化**(除了小数点)**
String()
- 这里写什么东西都会变成相对应的字符串
toString()
“12".toString();
"123".toString(8);以8进制将123转化成字符串
- undefined null不能使用此函数
隐式类型转换
var num = 1+'1' ; console.log( typeof num)
—结果:stringvar num = 1*'1' ; console.log( typeof num)
—结果:numbervar num = 1-'1' ; console.log( typeof num)
—结果:numbervar num = '2'+'1' ; console.log( typeof num)
—结果:stringvar num = '2'-'1' ; console.log( typeof num)
—结果:numbervar num = '2'*'1' ; console.log( typeof num)
—结果:number
isNaN()
- 隐式转化Number(demo)—>再与NaN比较是NaN输出true,否则输出false
++ –
- 隐式转化Number(demo)—>再++ –
- + * / =
- 隐式转化Number(demo)—>再进行- * / =
- +号两侧有一个string类型就都转化为string
< >
- 100>10>0 false 100>10>0 true 挨个计算(100>10)为true就转化为1了,再和后面的数值比较。
undefined>0 false; undefined<0 false; undefined ==0 false;
null>0 false; null<0 false; null ==0 false;
null ==undefined; true
NaN == NaN ; false
typeof(typeof(undefined)) string
typeof NaN `===` 'number' ; true
0==null; false
0==undefined; false
- Symbol
这个类型转换为字符串必须是显示的,隐式转换会出错
var s = Symbol('aabb');
String(s); //"Symbol(aabb)"
s + ""; //TypeError: Cannot convert a Symbol value to a string
25.try catch 语句
try 中的 return 和 throw 会在有 finally 语句是中的 return 或 throw 覆盖(这里的确是覆盖,而不是前一个 return 未执行,
(() => { var i = 0;try { return ++i;} finally { return ++i;}})(); // 2
var a = {pro: 29};
var b = {pro: 43};
a < b; //false
a == b; //false
a > b; //false
a <= b; //true
a >= b; //true
对于大于(等于)和小于(等于)号,两个对象 a 和 b 都被转换成了字符串 “[object Object]”,所以他们应该是相等的,所以 a < b 和 a > b 都是 false,而 a <= b 和 a > = b 都是 true。但是 a == b 为 false。有了上面的知识,就很好理解这个问题,a, b都是对象,所以不发生类型转换,而两个对象引用不同,结果为 false。
27.数组中的 null 和 undefined
数组中的 null 和 undefined 会在转换为字符串时被看做空,也就是可以直接忽略。== 会按前面的类型进行转换
"" == [null]; //true
"1,,3" == [1,undefined,3] //true
27.toLocaleString 和 toString
toLocaleString 和 toString 方法同时存在,它定义了个性化的字符串转换功能,对于对象而言 toLocaleString 和 toString 是一样的。不过Array, Number, Date 和TypedArray(ES6中的类型,这里不讨论)都重写了 toLocaleString。比如说数值类型:
console.log((1234).toLocaleString()); //1,234
console.log((1234567).toLocaleString('zh-Hans-CN-u-nu-hanidec', {useGrouping: false})); //一二三四五六七
console.log((1234567).toLocaleString('zh-Hans-CN-u-nu-hanidec', {useGrouping: true})); //一,二三四,五六七
日期类型:
得到一些地域性的时间表示
var date = new Date();
console.log(date.toString()); //Tue Apr 15 2014 11:50:51 GMT+0800 (中国标准时间)
console.log(date.toLocaleString()); //2014-4-15 11:50:51
console.log(date.toLocaleDateString()); //2014-4-15
console.log(date.toLocaleTimeString()); //上午11:50:51
数组类型的 toLocaleString 就是将数组中的数值类型和日期类型分别按 toLocaleString 转换为字符串,再形成整体字符串。
关于 toLocaleString 的定义官方也是故意没给出具体的实现细节【坑19】,这一点完全不能理解,所以这个方法用的场合也比较有限,这里不再赘述了
28.-0和+0是一致的
console.log(+0 === -0); //true
console.log(+0 == -0); //true
parseInt() 和 Number() 都会忽略字符串首尾的空格,但parseInt() 不会忽略格式化字符,而Number() 会将格式化字符与空格一起忽略
Number(" 34\n\t "); //34
Number(" \t34 "); //34
Number(" 3\t\n4 "); //NaN, 不和开头结尾的空格一起的格式化字符不会被忽略
parseInt(" \t34 "); //NaN
他们对空字符串的处理也不一样
Number(" "); //0, 空格被忽略了,所以 " " 等价于 ""
parseInt(" "); //NaN, 空格被忽略了,所以 " " 等价于 ""