概念
Javascript是一门动态
、弱类型
语言。
何为动态?
既定义了一种类型的数据,仍然可以赋值为其他类型的数据。
例如:
var x = 1;
x = 'string'
何为弱类型?
既兼容不同类型之间的数据进行比较。
例如:
var x = true;
var y = 1;
console.log(x == y) // true
类型转换
在JavaScript中,类型转换可以分为两类:显式类型转换
和隐式类型转换
显式类型转换
定义
显式转换既通过函数进行手动的类型转换。
下面通过Number()、String()、Boolean()这三个基本类型函数进行举例,主要从基本数据类型和对象两方面进行阐述。
Number()
对于基本数据类型,其转换规则如下:
console.log(Number(null)); // 0
console.log(Number(undefined)); // NaN
console.log(Number(1)); // 1
console.log(Number('1')); // 1
console.log(Number(true)); // 1
console.log(Number(false)); // 0
console.log(Number('')); // 0
console.log(Number('a')); // NaN
总结:
-
对于null和undefined两类比较特殊的值,分别返回null和NaN
(个人理解:因为null是一个对象,只是当前值为null,所以返回0;undefined的意思是并未进行定义,因此返回NaN)
对于true和false,则和日常理解一致,分别返回 1 和 0
-
对于字符串:
若为空,则返回0
若为纯数字字符串,则返回对应数字
其余字符串则返回NaN
对于对象,其转换规则如下:
简单来说,大部分对象都会得出NaN
的结果。(对于对象没有进行深究...以后仔细看了再进行补充)
String()
对于基本数据类型,其转换规则如下:
console.log(String(null)); // 'null'
console.log(String(undefined)); // 'undefined'
console.log(String(1)); // '1'
console.log(String('1')); // '1'
console.log(String(true)); // 'true'
console.log(String(false)); // 'false'
console.log(String('')); // ''
console.log(String('a')); // 'a'
总结:
根据具体内容转换为对应的字符串
对于对象,其转换规则如下:
var x = ['1', '2', '3'];
console.log(String(x)); // 1,2,3
var y = {
value: 'demo'
}
console.log(String(y)); // [object Object]
总结:
对于数组,会转换为该数组对应的字符串
对于对象,会转换为类型字符串
Boolean()
除了空字符串、数字0、fasle、null、undefined、NaN这几类数值外,其余数值均转化为true
// 以下表达式均返回false
console.log(Boolean(''));
console.log(Boolean(0));
console.log(Boolean(false));
console.log(Boolean(null));
console.log(Boolean(undefined));
console.log(Boolean(NaN));
隐式类型转换
定义
隐式类型转换既在进行某些操作(例如:+、==,这两种运算符使用频率最高)时,如果两边数据的类型不一致,数据会自动进行类型转换再进行运算。
当进行隐式类型转换时,主要是涉及以下三种转换:
ToPrimitive
ToNumber
ToString
至对应不同的运算符也会有各种各样的情况发生,这里不做详细介绍。日后若做了系统学习再进行补充...(详情可看参考文章的第4篇)
参考文章
-
数据类型的转换
https://wangdoc.com/javascript/features/conversion.html#number
-
What exactly is Type Coercion in Javascript?
https://stackoverflow.com/questions/19915688/what-exactly-is-type-coercion-in-javascript
-
有趣的JavaScript隐式类型转换
-
你所忽略的js隐式转换
https://juejin.im/post/5a7172d9f265da3e3245cbca#heading-8
(这篇文章对隐式转换有较为详细的介绍)
-
ECMAScript规范
https://ecma262.docschina.org/#sec-toprimitive
(关于类型转换,规范里面也会有详细的解读,而且看规范文档是最为官方的)