JavaScript类型转换:数值、对象、字符串

JavaScript中有五种可包含值的数据类型:字符串(string)、数字(number)、布尔(boolean)、对象(object)、函数(function)。
有三种对象类型:对象(Object)、日期(Date)、数组(Array)。
同时有两种不能包含值的数据类型:null、undefined。
 
1.typeof的数据类型
typeof运算符不是变量。它属于运算符。运算符(比如 + - * /)没有数据类型。但是,typeof 始终会返回字符串(包含运算数的类型)。
 
2.constructor属性
constructor属性返回所有JavaScript变量的构造器函数。
实例
"Bill".constructor                 // 返回 "function String()  { [native code] }"
(3.14).constructor                 // 返回 "function Number()  { [native code] }"
false.constructor                  // 返回 "function Boolean() { [native code] }"
[1,2,3,4].constructor              // 返回 "function Array()   { [native code] }"
{name:'Bill', age:62}.constructor  // 返回" function Object()  { [native code] }"
new Date().constructor             // 返回 "function Date()    { [native code] }"
function () {}.constructor         // 返回 "function Function(){ [native code] }"
(1)通过检查 constructor属性来确定某个对象是否为数组(包含单词 "Array"):
function isArray(myArray) {
    return myArray.constructor.toString().indexOf("Array") > -1;
}
或者更简单,可以检查对象是否是数组函数:
function isArray(myArray) {
    return myArray.constructor === Array;
}
(2)通过检查constructor属性来确定某个对象是否为日期(包含单词 "Date"):
function isDate(myDate) {
    return myDate.constructor.toString().indexOf("Date") > -1;
}
或者更简单,检查对象是否是日期函数:
function isDate(myDate) {
    return myDate.constructor === Date;
}
 
3.JavaScript 类型转换
JavaScript变量能够被转换为新变量以及另一种数据类型:通过使用JavaScript函数、通过JavaScript本身自动转换。
(1)把数值转换为字符串
全局方法String()能够把数字转换为字符串。它可用于任意类型的数字、文字、变量或表达式:
String(x)         // 从数值变量 x 返回字符串
String(123)       // 从数值文本 123 返回字符串
String(100 + 23)  // 从表达式中的数值返回字符串
数字方法 toString() 同理。
x.toString()
(123).toString()
(100 + 23).toString()
(2)把布尔转换为字符串
全局方法String()能够将布尔转换为字符串。
String(false)        // 返回 "false"
String(true)         // 返回 "true" 
布尔方法toString()同理。
false.toString()     // 返回 "false"
true.toString()      // 返回 "true"
(3)把日期转换为字符串
全局方法String()可将日期转换为字符串。
String(Date())      // 返回 "Fri May 22 2020 16:57:43 GMT+0800 (中国标准时间)"
日期方法 toString()同理。
Date().toString()   // 返回 "Fri May 22 2020 16:57:43 GMT+0800 (中国标准时间)"
(4)把字符串转换为数值
全局方法Number()可把字符串转换为数字。
包含数字的字符串(比如 "3.14")转换为数字(比如 3.14)。
空的字符串转换为 0。
其他字符串将转换为 NaN(Not a number,不是数字)。
Number("3.14")    // 返回 3.14
Number(" ")       // 返回 0
Number("")        // 返回 0
Number("99 88")   // 返回 NaN
(5)一元 + 运算符
一元的 + 运算符可用于把变量转换为数字:
var y = "5";      // y 是字符串
var x = + y;      // x 是数字
如果无法转换变量,则仍会成为数字,但是值为 NaN(Not a number):
var y = "Bill";   // y 是字符串
var x = + y;      // x 是数字 (NaN)
(6)把布尔转换数值
全局方法Number()也可把布尔转换为数字。
Number(false)     // 返回 0
Number(true)      // 返回 1
(7)把日期转换为数字
全局方法Number()可用于把日期转换为数字。
d = new Date();
Number(d)          // 返回 1590137863873
日期方法 getTime() 同理。
d = new Date();
d.getTime()        // 返回 1590137863873
(8)自动类型转换
如果JavaScript尝试操作一种“错误”的数据类型,它会试图将该值转换为“正确”的类型。
结果并不总是你所期望的:
5 + null    // 返回 5         因为 null 被转换为 0
"5" + null  // 返回 "5null"   因为 null 被转换为  "null"
"5" + 2     // 返回 52        因为 2 被转换为 "2"
"5" - 2     // 返回 3         因为 "5" 被转换为 5
"5" * "2"   // 返回 10        因为 "5" 和 "2" 被转换为 5 和 2
(9)自动字符串转换
JavaScript自动调用变量的toString()函数,当您试图“输出”对象或变量时:
document.getElementById("demo").innerHTML = myVar;
// 如果 myVar = {name:"Fjohn"}  // toString 转换为 "[object Object]"
// 如果 myVar = [1,2,3,4]       // toString 转换为 "1,2,3,4"
// 如果 myVar = new Date()      // toString 转换为 "Fri May 22 2020 16:57:43 GMT+0800 (中国标准时间)"
数字和布尔也会被转换,但并不明显:
// 如果 myVar = 123             // toString 转换为 "123"
// 如果 myVar = true            // toString 转换为 "true"
// 如果 myVar = false           // toString 转换为 "false"
(10)JavaScript 类型转换表
下表中列出了将不同JavaScript值转换为数字、字符串和布尔的结果:
原始值 转换为数字 转换为字符串 转换为逻辑  
false 0 "false" false 试一试
true 1 "true" true 试一试
0 0 "0" false  
1 1 "1" true  
"0" 0 "0" true  
"000" 0 "000" true  
"1" 1 "1" true  
NaN NaN "NaN" false  
Infinity Infinity "Infinity" true  
-Infinity -Infinity "-Infinity" true  
"" 0 "" false  
"20" 20 "20" true  
"twenty" NaN "twenty" true  
[ ] 0 "" true  
[20] 20 "20" true  
[10,20] NaN "10,20" true  
["twenty"] NaN "twenty" true  
["ten","twenty"] NaN "ten,twenty" true  
function(){} NaN "function(){}" true  
{ } NaN "[object Object]" true  
null 0 "null" false  
undefined NaN "undefined" false