JavaScript 类型转换
2018-06-21 14:21:34 3 举报
JavaScript类型转换
作者其他创作
大纲/内容
class a{} // 'class a{}'
抛出异常
返回一个可读的(可被JavaScript解析的)日期和时间字符串。
(1).valueOf() // 1 ('1').valueOf() // '1' (true).valueOf() // true (Symbol()).valueOf() // Symbol()
Y
数字?
N
string
let o = {}; o.valueOf = () = 'abc'; Number(o); //NaN
http://www.ecma-international.org/ecma-262/8.0/#sec-tonumber
nullundefined
({}).valueOf() // {} ([]).valueOf() // [] (function(){}).valueOf() // [Function] (/\\d/).valueOf() // /\\d/ (new Set()).valueOf() // Set {} (new Map()).valueOf() // Map {} class a;a.valueOf() // [Function: a]
对象转原始类型ToPrimitive()
\"[object 类型]\"
①调用valueOf()返回原始值x;②如果x是数字,将x返回;如果x不是数字,将x转换为数字后返回(x是Symbol值时报错)。
①调用toString()返回原始值x;②如果x是字符串,将x返回;如果x不是字符串,将x转换为字符串后返回(x是Symbol值时报错)。
日期类型?Date
valueOf()返回原始值?
返回对应的字符串
Symbol?
http://www.ecma-international.org/ecma-262/8.0/#sec-object.prototype.valueof
toString()返回原始值?
有valueOf()方法?(属性无效)
undefined/null?
其他原始类型或相对应的对象?
返回字符串(加上'双引号')[规定要求报错,实测如下]String(Symbol()) // \"Symbol()\"
(new Number(1)).toString() // '1' (new String('1')).toString() // '1' (new Boolean(true)).toString() // 'true' (Object(Symbol())).toString() // 'Symbol()'
返回1970.01.01以来的毫秒数
new Date().valueOf() // 1528802895378
https://tc39.github.io/ecma262/#sec-toprimitive
字符串?
https://tc39.github.io/ecma262/#sec-toboolean
原始类型?
正则表达式?RegExp
valueOf()
undefined/null?
number
Number(\"0\") // 0 Number(\"-0\") // -0 Number(\"NaN\") // NaN Number(\"Infinity\") // Infinity Number(\"-Infinity\") // -Infinity Number(\"1.20\") // 1.2 Number(\" -1.20 \") // -1.2 Number(\"1.20a\") // NaN Number(\"one\") // NaN Number(\"\\u0030\") // 0 Number(\"\\u0039\") // 9 Number(\"\\u0020\") // 0 Number(\" \") // 0 Number(\"\") // 0
let o = {}; o.toString = () = Symbol(); Number(o); // Uncaught TypeError: Cannot convert a Symbol value to a number
true
// 不存在 toString() valueOf() 方法 let o = {}; o.toString = null; o.valueOf = null; Number(o); // Uncaught TypeError: Cannot convert object to primitive value
http://www.ecma-international.org/ecma-262/8.0/#sec-object.prototype.tostring
有toString()方法?(属性无效)
symbol
new Set().toString() // '[object Set]' new Map().toString() // '[object Map]'
undefined/null/0/-0/\"\"/NaN?
let o = {}; o.valueOf = () = 1; Number(o); //1
false
将RegExp对象转换为表示正则表达式直接量的字符串。
http://www.ecma-international.org/ecma-262/8.0/#sec-tostring
原始值
JavaSript 类型转换(Type Conversion)流程图ECMA资料请见:http://www.ecma-international.org/ecma-262/8.0/#sec-type-conversion
object
数组类型?Array
https://tc39.github.io/ecma262/#sec-toobject
toString()
返回自己Number(1.20) // 1.2
Date类型?
Number(true) // 1Number(false) // 0
String(undefined) // \"undefined\"String(null) // \"null\"
String(true) // \"true\"String(false) // \"false\"
转字符串String()
类?class
转布尔值Boolean()
返回对应的数字
返回自己String(\"\\u0020\") // \" \"
let o = {}; o.toString = () = ({}); o.valueOf = () = '1'; String(o); // \"1\"
将每个数组元素转换为一个字符串,并在元素之间添加逗号后合并成结果字符串。
(1).toString() // '1' ('1').toString() // '1' (true).toString() // 'true' (Symbol()).toString() // 'Symbol()'
let o = {}; String(o); //\"[object Object]\"
let o = {}; o.valueOf = () = Symbol(); Number(o); // Uncaught TypeError: Cannot convert a Symbol value to a number
Error
转对象Object()
// toString() valueOf() 方法不返回原始值 let o = {}; o.toString = () = ({}); o.valueOf = () = ({}); String(o); //报错,Cannot convert object to primitive value
boolean
(new Date()).toString() // 'Tue Jun 12 2018 19:59:44 GMT+0800 (中国标准时间)'
let o = {}; o.toString = () = 'abc'; Number(o); // NaN
返回对象本身
// 不存在 toString() valueOf() 方法 let o = {}; o.toString = null; o.valueOf = null; String(o); //报错,Cannot convert object to primitive value
函数类型?Function
布尔值?
转数字Number()
Error. ECMA标准规定 \"[object Undefined] \"[object Null]\"
Number(undefined) // NaNNumber(null) // 0
进行toString()转换
new Date('2000-01-01')==\"Sat Jan 01 2000 08:00:00 GMT+0800 (中国标准时间)\" //truenew Date('2000-01-01')==946684800000 //false附:new Date('2000-01-01').toString() //\"Sat Jan 01 2000 08:00:00 GMT+0800 (中国标准时间)\"附:new Date('2000-01-01').valueOf() //946684800000
let o = {}; o.toString = () = Symbol(); String(o); // Uncaught TypeError: Cannot convert a Symbol value to a string
null.undefined 返回{}[规定报错]其他的返回对应的对象
返回本身
返回这个函数的实际定义的表示方式。实际上,这里实现的方式通常是将用户定义的函数转换成JavaScript源代码字符串。
String(NaN) // \"NaN\" String(0) // \"0\" String(-0) // \"0\" String(Infinity) // \"Infinity\" String(-Infinity) // \"-Infinity\" String(1.20) // \"1.2\" String(-1.20) // \"-1.2\"
// toString() valueOf() 方法不返回原始值 let o = {}; o.valueOf= () = ({}); o.toString = () = ({}); Number(o); // Uncaught TypeError: Cannot convert object to primitive value
①调用valueOf()返回原始值x;②如果x是字符串,将x返回;如果x不是字符串,将x转换为字符串后返回(x是Symbol值时报错)。
(/^(.)*$/).toString() // '/^(.)*$/' new RegExp(\"\\\\d\").toString() // \"/\\d/\"
let o = {}; o.toString = () = ({}); o.valueOf = () = Symbol(); String(o); // Uncaught TypeError: Cannot convert a Symbol value to a string
let o = {}; o.toString = () = 1; Number(o); // \"1\"
(new Number(1)).valueOf() // 1 (new String('1')).valueOf() // '1' (new Boolean(true)).valueOf() // true (Object(Symbol())).valueOf() // Symbol()
\"[object Object]\"
收藏
0 条评论
下一页