js数据类型转化

数据范例转化表

起首上数据范例转化表,便于遇到问题直接检察

字符串数字布尔值对象
undefined
null
“undefined”
“null”
NaNfalse
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()要领,不细说

隐式转换

隐式转换分为三种:

  1. 将值转换为原始值,ToPrimitive(input, PreferredType)
  2. 将值转化为数字,ToNumber()
  3. 将值转化为字符串,ToString()

原始范例数据转化相对比较简朴,下面值看对象到原始范例的转换体式格局

对象的toString()和valueOf()要领

  1. 一切对象继承了两个转换要领: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 (中国标准时间)”
  2. 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。

总结起来有以下几点值得注意

  1. NaN !== NaN
  2. x,y 为null、undefined二者中一个 // 返回true
  3. x、y为Number和String范例时,则转换为Number范例比较
  4. 有Boolean范例时,Boolean转化为Number范例比较
  5. 一个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

同理适用于><!=+运算符的隐式转换(但要撤除日期对象)

    原文作者:wuwhs
    原文地址: https://segmentfault.com/a/1190000013242613
    本文转自网络文章,转载此文章仅为分享知识,如有侵权,请联系博主进行删除。
点赞