JavaScript 类型转换

JavaScript 能够自动转换变量的数据类型,这种转换是一种隐式行为。但我们也需要掌握显示的转换方式的方法,主要包括Number() 转换数值,String() 转换字符串 和 Boolean() 转换布尔值。


JavaScript 数据类型

JavaScript 中有五种可包含值的数据类型:

  • 字符串(string)
  • 数字(number)
  • 布尔(boolean)
  • 对象(object)
  • 函数(function)

有三种对象类型:

  • 对象(Object)
  • 日期(Date)
  • 数组(Array)

同时有两种不能包含值的数据类型:

  • null
  • undefined

typeof 运算符

您可以使用 typeof 运算符来确定 JavaScript 变量的数据类型。

  1. <!DOCTYPE html>
  2. <html>
  3. <body>
  4. <h2>JavaScript typeof 运算符</h2>
  5. <p>typeof 运算符返回变量、对象、函数或表达式的类型。</p>
  6. <p id="demo">
  7. <script>
  8. document.getElementById("demo").innerHTML =
  9. typeof "john" + "<br>" +
  10. typeof 3.14 + "<br>" +
  11. typeof NaN + "<br>" +
  12. typeof false + "<br>" +
  13. typeof [1,2,3,4] + "<br>" +
  14. typeof {name:'john', age:34} + "<br>" +
  15. typeof new Date() + "<br>" +
  16. typeof function () {} + "<br>" +
  17. typeof myCar + "<br>" +
  18. typeof null;
  19. </script>
  20. </body>
  21. </html>

请注意:

  • NaN 的数据类型是数值
  • 数组的数据类型是对象
  • 日期的数据类型是对象
  • null 的数据类型是对象
  • 未定义变量的数据类型是 undefined
  • 尚未赋值的变量的数据类型也是 undefined

您无法使用 typeof 去判断 JavaScript 对象是否是数组(或日期)。


typeof 的数据类型

typeof 运算符不是变量。它属于运算符。运算符(比如 + - * /)没有数据类型。

但是,typeof 始终会返回字符串(包含运算数的类型)。


constructor 属性

constructor 属性返回所有 JavaScript 变量的构造器函数。

  1. <!DOCTYPE html>
  2. <html>
  3. <body>
  4. <h2>JavaScript constructor 属性</h2>
  5. <p>constructor 属性返回变量或对象的构造器函数。</p>
  6. <p id="demo">
  7. <script>
  8. document.getElementById("demo").innerHTML =
  9. "john".constructor + "<br>" +
  10. (3.14).constructor + "<br>" +
  11. false.constructor + "<br>" +
  12. [1,2,3,4].constructor + "<br>" +
  13. {name:'john', age:34}.constructor + "<br>" +
  14. new Date().constructor + "<br>" +
  15. function () {}.constructor;
  16. </script>
  17. </body>
  18. </html>

您可以通过检查 constructor 属性来确定某个对象是否为数组(包含单词 "Array"):

  1. <!DOCTYPE html>
  2. <html>
  3. <body>
  4. <h2>JavaScript 数组</h2>
  5. <p>这个“自制的” isArray() 函数在数组上使用时返回 true:</p>
  6. <p id="demo">
  7. <script>
  8. var fruits = ["香蕉", "橘子", "苹果", "芒果"];
  9. document.getElementById("demo").innerHTML = isArray(fruits);
  10. function isArray(myArray) {
  11. return myArray.constructor.toString().indexOf("Array") > -1;
  12. }
  13. </script>
  14. </body>
  15. </html>

或者更简单,您可以检查对象是否是数组函数:

  1. <!DOCTYPE html>
  2. <html>
  3. <body>
  4. <h2>JavaScript 数组对象</h2>
  5. <p>这个“自制的” isArray() 函数在数组上使用时返回 true:</p>
  6. <p id="demo">
  7. <script>
  8. var fruits = ["奔驰", "宝马", "奥迪", "雷克萨斯"];
  9. document.getElementById("demo").innerHTML = isArray(fruits);
  10. function isArray(myArray) {
  11. return myArray.constructor === Array;
  12. }
  13. </script>
  14. </body>
  15. </html>

您可以通过检查 constructor 属性来确定某个对象是否为日期(包含单词 "Date"):

  1. <!DOCTYPE html>
  2. <html>
  3. <body>
  4. <h2>JavaScript 日期对象</h2>
  5. <p>这个“自制的” isDate() 函数在日期上使用时返回 true:</p>
  6. <p id="demo">
  7. <script>
  8. var myDate = new Date();
  9. document.getElementById("demo").innerHTML = isDate(myDate);
  10. function isDate(myDate) {
  11. return myDate.constructor.toString().indexOf("Date") > -1;
  12. }
  13. </script>
  14. </body>
  15. </html>

或者更简单,您可以检查对象是否是日期函数:

  1. <!DOCTYPE html>
  2. <html>
  3. <body>
  4. <h2>JavaScript 日期对象</h2>
  5. <p>这个“自制的” isDate() 函数在日期上使用时返回 true:</p>
  6. <p id="demo">
  7. <script>
  8. var myDate = new Date();
  9. document.getElementById("demo").innerHTML = isDate(myDate);
  10. function isDate(myDate) {
  11. return myDate.constructor === Date;
  12. }
  13. </script>
  14. </body>
  15. </html>

JavaScript 类型转换

JavaScript 变量能够被转换为新变量以及另一种数据类型:

  • 通过使用 JavaScript 函数
  • 通过 JavaScript 本身自动转换

把数值转换为字符串

全局方法 String() 能够把数字转换为字符串。

它可用于任意类型的数字、文字、变量或表达式:

  1. <!DOCTYPE html>
  2. <html>
  3. <body>
  4. <h2>JavaScript String() 方法</h2>
  5. <p>String() 方法把数字转换为字符串。</p>
  6. <p id="demo">
  7. <script>
  8. var x = 123;
  9. document.getElementById("demo").innerHTML =
  10. String(x) + "<br>" +
  11. String(123) + "<br>" +
  12. String(100 + 23);
  13. </script>
  14. </body>
  15. </html>

数字方法 toString() 同理。

  1. <!DOCTYPE html>
  2. <html>
  3. <body>
  4. <h2>JavaScript 数字方法</h2>
  5. <p>toString() 方法把数字转换为字符串。</p>
  6. <p id="demo">
  7. <script>
  8. var x = 123;
  9. document.getElementById("demo").innerHTML =
  10. x.toString() + "<br>" +
  11. (123).toString() + "<br>" +
  12. (100 + 23).toString();
  13. </script>
  14. </body>
  15. </html>

数字方法 这一章,您将学到更多可用于将数值转换为字符串的方法:

方法描述
toExponential()返回字符串,对数字进行舍入,并使用指数计数法来写。
toFixed()返回字符串,对数字进行舍入,并使用指定位数的小数来写。
toPrecision()返回字符串,把数字写为指定的长度。

把布尔转换为字符串

全局方法 String() 能够将布尔转换为字符串。

  1. String(false) // 返回 "false"
  2. String(true) // 返回 "true"

布尔方法 toString() 同理。

  1. false.toString() // 返回 "false"
  2. true.toString() // 返回 "true"

把日期转换为字符串

全局方法 String() 可将日期转换为字符串。

  1. String(Date())

document.getElementById(“demo1”).innerHTML = “// 返回 “ + “\”” + String(Date()) + “\””;

日期方法 toString() 同理。

  1. Date().toString()

document.getElementById(“demo2”).innerHTML = “// 返回 “ + “\”” + Date().toString() + “\””;

日期方法 这一章,您能够找到更多可用于把日期转换为字符串的方法:

方法描述
getDate()获得以数值计(1-31)的日
getDay()或者以数值计(0-6)的周
getFullYear()获得四位的年(yyyy)
getHours()获得时(0-23)
getMilliseconds()获得毫秒(0-999)
getMinutes()获得分钟(0-59)
getMonth()获得月(0-11)
getSeconds()获得秒(0-59)
getTime()获得时间(1970 年 1 月 1 日以来的毫秒)

把字符串转换为数值

全局方法 Number() 可把字符串转换为数字。

包含数字的字符串(比如 "3.14")转换为数字(比如 3.14)。

空的字符串转换为 0。

其他字符串将转换为 NaN(Not a number,不是数字)。

  1. Number("3.14") // 返回 3.14
  2. Number(" ") // 返回 0
  3. Number("") // 返回 0
  4. Number("99 88") // 返回 NaN

在数字方法这一章中,您将找到更多可用于把字符串转换为数字的方法:

方法描述
parseFloat()解析字符串并返回浮点数。
parseInt()解析字符串并返回整数。

一元 + 运算符

一元的 + 运算符可用于把变量转换为数字:

  1. var y = "5"; // y 是字符串
  2. var x = + y; // x 是数字

如果无法转换变量,则仍会成为数字,但是值为 NaN(Not a number):

  1. var y = "Bill"; // y 是字符串
  2. var x = + y; // x 是数字 (NaN)

把布尔转换数值

全局方法 Number() 也可把布尔转换为数字。

  1. Number(false) // 返回 0
  2. Number(true) // 返回 1

把日期转换为数字

全局方法 Number() 可用于把日期转换为数字。

  1. d = new Date();
  2. Number(d)

d = new Date();document.getElementById(“demo3”).innerHTML = “// 返回 “ + Number(d);

日期方法 getTime() 同理。

  1. d = new Date();
  2. d.getTime()

d = new Date();document.getElementById(“demo4”).innerHTML = “// 返回 “ + d.getTime();


自动类型转换

如果 JavaScript 尝试操作一种“错误”的数据类型,它会试图将该值转换为“正确”的类型。

结果并不总是你所期望的:

  1. <!DOCTYPE html>
  2. <html>
  3. <body>
  4. <p id="demo">
  5. <script>
  6. var x = [];
  7. document.getElementById("demo").innerHTML =
  8. (5 + null) + "<br>" +
  9. ("5" + null) + "<br>" +
  10. ("5" + 2) + "<br>" +
  11. ("5" - 2) + "<br>" +
  12. ("5" * "2") + "<br>" +
  13. ("5" / "2") + "<br>"
  14. </script>
  15. </body>
  16. </html>

自动字符串转换

JavaScript 自动调用变量的 toString() 函数,当您试图“输出”对象或变量时:

  1. document.getElementById("demo").innerHTML = myVar;
  2. // 如果 myVar = {name:"Fjohn"} // toString 转换为 "[object Object]"
  3. // 如果 myVar = [1,2,3,4] // toString 转换为 "1,2,3,4"
  4. // 如果 myVar = new Date() // toString 转换为 ""

myVar = new Date();document.getElementById(“demo5”).innerHTML = myVar;

数字和布尔也会被转换,但并不明显:

  1. // 如果 myVar = 123 // toString 转换为 "123"
  2. // 如果 myVar = true // toString 转换为 "true"
  3. // 如果 myVar = false // toString 转换为 "false"

JavaScript 类型转换表

下表中列出了将不同 JavaScript 值转换为数字、字符串和布尔的结果:

原始值转换为数字转换为字符串转换为逻辑
false0"false"false
true1"true"true
00"0"false
11"1"true
"0"0"0"true
"000"0"000"true
"1"1"1"true
NaNNaN"NaN"false
InfinityInfinity"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
null0"null"false
undefinedNaN"undefined"false

引号中的值指示字符串值。

红色的值 指示了(某些)程序员也许不希望的值。