数据范例转化表
起首上数据范例转化表,便于遇到问题直接检察
值 | 字符串 | 数字 | 布尔值 | 对象 |
---|---|---|---|---|
undefined null | “undefined” “null” | NaN | false false | throws TypeError throws TypeError |
true false | “true” “false” | 1 0 | new Boolean(true) new Boolean(false) | |
“”(空字符串) “1.2”(非空,数字) “one”(非空,非数字) | 0 1.2 NaN | false true true | new String(“”) new String(“1.2”) new String(“one”) | |
0 -0 NaN Infinity -Infinity 1(非零) | “0” “0” “NaN” “Infinity” “-Infinity” “1” | new Number(0) new Number(-0) new Number(NaN) new Number(Infinity) new Number(-Infinity) new Number(1) | ||
{}(恣意对象) [] [9] [“a”] | {}.toString() -> {}.valueOf() “” “9” 运用join() | {}.valueOf() -> {}.toString() 0 9 NaN NaN | true true true true |
显式转换
显现转换最简朴的是运用Boolean()、Number()、String()或Object()组织函数
Number("3"); // 3
String(false); // "false"
Boolean([]); // true
Object(3); // new Number(3)
ps:值得注意的是,试图把undefined或null转换为对象,会抛出一个范例毛病,而Object()显现转换不会,而是返回一个新创建的空对象
显现转换另有toString()
、toFixed()
、toExponential()
、toPrecision()
、parseInt()
、parseFloat()
要领,不细说
隐式转换
隐式转换分为三种:
- 将值转换为原始值,ToPrimitive(input, PreferredType)
- 将值转化为数字,ToNumber()
- 将值转化为字符串,ToString()
原始范例数据转化相对比较简朴,下面值看对象到原始范例的转换体式格局
对象的toString()和valueOf()要领
一切对象继承了两个转换要领:
toString()
- 平常对象转化成[object object]
{x: 1, y: 2}.toString(); // "[object object]"
- 数组转化成元素间加逗号
[1, 2, 3].toString(); // "1,2,3"
- 函数转化成定义
(function(x){}).toString(); // "function(x) {}"
- 正则转化为直接量字符串
/\d+/g.toString(); // "/\d+/g"
- 日期转化为日期字符串
new Date(2000, 1, 1).toString();
// “Tue Feb 01 2000 00:00:00 GMT+0800 (中国标准时间)”
- 平常对象转化成[object object]
valueOf()
要领- 大多数对象没法真正示意为一个原始值,
valueOf()
简朴返回对象自身 - 日期对象是一个惯例,返回毫秒数
new Date(2010, 0, 1).valueOf(); // 12623328000
- 大多数对象没法真正示意为一个原始值,
对象到字符串的转换
- 假如对象具有toString()要领,则挪用这个要领,假如它返回一个原始值,将这个值转化为字符串,并返回这个字符串效果
- 假如对象没有toString()要领,或许个这个要领不返回一个原始值,那末就会挪用valueOf()要领。假如存在这个要领,则挪用它,假如返回值是一个原始值,将这个值转化为只恪守,并返回这个字符串效果
- 不然,就会抛出一个范例毛病非常
对象到数字的转换
- 假如对象具有valueOf()要领,后者返回个亿原始值,则将这个原始值转化为数字,并返回这个数字
- 不然,假如对象有toString()要领,后者返回一个原始值,并转化成数字返回
- 不然,抛出一个范例毛病非常
举个栗子:
({} + {}) = ?
两个对象的值举行+运算符,要先举行隐式转换成原始范例才盘算
1. ToPrimitive转换,由于没有指定PreferredType范例,默以为Number
2. 实行`valueOf()`要领,`{}.valueOf()`返回的照样{}对象
3. 继承实行`toString()`要领,`({}).toString()`返回`[Object Object]`,是原始值
所以末了效果:[Object Object][Object Object]
ps:在Firefox中返回效果为NaN
,由于第一个{}被看成一个代码块,没有剖析转换,变成了+{}
,也就是+[Object Object]
,终究变成NaN
==元算符隐式转换
==运算符运用和考核点许多,直接上ES5范例文档
比较运算 x==y, 个中 x 和 y 是值,返回 true 或许 false。如许的比较按以下体式格局举行:
1、若 Type(x) 与 Type(y) 雷同, 则
1* 若 Type(x) 为 Undefined, 返回 true。
2* 若 Type(x) 为 Null, 返回 true。
3* 若 Type(x) 为 Number, 则
(1)、若 x 为 NaN, 返回 false。
(2)、若 y 为 NaN, 返回 false。
(3)、若 x 与 y 为相称数值, 返回 true。
(4)、若 x 为 +0 且 y 为 −0, 返回 true。
(5)、若 x 为 −0 且 y 为 +0, 返回 true。
(6)、返回 false。
4* 若 Type(x) 为 String, 则当 x 和 y 为完全雷同的字符序列(长度相称且雷同字符在雷同位置)时返回 true。 不然, 返回 false。
5* 若 Type(x) 为 Boolean, 当 x 和 y 为同为 true 或许同为 false 时返回 true。 不然, 返回 false。
6* 当 x 和 y 为援用统一对象时返回 true。不然,返回 false。
2、若 x 为 null 且 y 为 undefined, 返回 true。
3、若 x 为 undefined 且 y 为 null, 返回 true。
4、若 Type(x) 为 Number 且 Type(y) 为 String,返回比较 x == ToNumber(y) 的效果。
5、若 Type(x) 为 String 且 Type(y) 为 Number,返回比较 ToNumber(x) == y 的效果。
6、若 Type(x) 为 Boolean, 返回比较 ToNumber(x) == y 的效果。
7、若 Type(y) 为 Boolean, 返回比较 x == ToNumber(y) 的效果。
8、若 Type(x) 为 String 或 Number,且 Type(y) 为 Object,返回比较 x == ToPrimitive(y) 的效果。
9、若 Type(x) 为 Object 且 Type(y) 为 String 或 Number, 返回比较 ToPrimitive(x) == y 的效果。
10、返回 false。
总结起来有以下几点值得注意
NaN !== NaN
- x,y 为null、undefined二者中一个 // 返回true
- x、y为Number和String范例时,则转换为Number范例比较
- 有Boolean范例时,Boolean转化为Number范例比较
- 一个Object范例,一个String或Number范例,将Object范例举行原始转换后,按上面流程举行原始值比较
举一个栗子:
var a = {
valueOf: function () {
return1;
},
toString: function () {
return'123'
}
}
console.log(rue == a) // true;
1. 起首,x与y范例差别,x为boolean范例,则举行ToNumber转换为1,为number范例
2. x为number,y为object范例,对y举行原始转换,ToPrimitive(a, ?),没有指定转换范例,默许number范例
3. ToPrimitive(a, Number)起首挪用valueOf要领,返回1,获得原始范例1。
4. 1 == 1, 返回true
同理适用于>
、<
、!=
、+
运算符的隐式转换(但要撤除日期对象)