我的github博客 github.com/zhuanyongxi…
数据类型的转换
在JS中,引用数据类型转换为原始数据类型转换只有三种情况:
- 转换为布尔值;
- 转换为数字;
- 转换为字符串。
换一种方式来表达,在JS中,所有的数据都可以去转(注意这里的用词,是“转”,不是“转成”)布尔值、数字和字符串(并不一定能成功)。
转成布尔值
非常简单,除了undefined、null、“”、NaN、0、-0、false之外,全都是true。
转成字符串
也非常的简单,需要注意的有四个:数组、对象、函数、symbol。
其实重要的就是数组和对象。
function fn() {
console.log("Hello World");
}
console.log(String([1, 2])); // "1,2"
console.log(String({})); // "[object Object]"
console.log(String(fn));
// "function a() {window.runnerWindow.proxyConsole.log(\"Hello World\");}"
console.log(String(Symbol('foo'))); // "Symbol(foo)"
转成数字
在JS中,转数字比较复杂。常用的转换数字的方法有:Number、parseInt和parseFloat。其中Number在转字符串的时候如果遇到有非数字的东西,会返回NaN,所以也被称为强制转换。另外两个是从左到右一位一位的转换,所以也被成为非强制转换。
Number方法
与一元操作符+的效果相同。即Number("1")与+"1"相同。
- Boolean,true和false分别是1和0;
- 数字返回数字;
- null返回0;
- undefined返回NaN;
- Symbol会抛错;
- 如果是字符串:
- 空字符串转为0;
- 只包含数字的情况,Number会消除前导的0,比如“001”,转换之后就是1。浮点格式与整数相同。
- 如果字符串包含除数字以外的其他字符(字符串开头可以有正负号),都会转为NaN。
- 如果是对象,先转成字符串,再把字符串转成数字。
如果是四则运算,字符串的优先级最高,数字第二。意思就是如果相加的遇到了字符串,则不是字符串的转化为字符串,如果没有字符串,有一个数字,则不是数字的转化为数字。
数据类型的比较(隐式转换)
- NaN与任何值都不相等,包括它自己。
- 对象与对象比较,比较的是不是指向同一个内存地址
- 对象与字符串比较,对象先转化为字符串,然后做比较
- 对象与布尔类型值比较,两边都要先转为数字(false是0,true是1)。对象类型的值先隐式调用toString方法,在隐式调用Number方法
- 对象与数字比较,对象转化为数字再比较(先隐式调用toString方法,再隐式调用Number方法将对象转化为数字)
- 数字与布尔类型值比较,就是进行数字的比较
- 数字与字符串的比较,把字符串转化为数字,再比较
- 布尔与布尔,两边都转化为数字再比较
- null与undefined比较,true
- null、undefined与其他类型比较,结果都是false,因为他们俩没有toString方法
简化版:
- 只要有数字和布尔值的,都转换成数字进行比较;
- 对象与对象比较,比较的是不是指向同一个内存地址;
- 对象与字符串比较,对象先转化为字符串,然后做比较;
- null、undefined、NaN与其他类型比较,null和undefined除了自己之外,相互比较也是相等的,此外与其他类型比较,结果都是false,因为他们俩没有toString方法。其中NaN与任何比较都是false(包括自己)。
// 1,
1 == "1"; // true
1 == true; // true
// 2,
var obj1 = {}
var obj2 = {}
var obj3 = obj1
obj1 == obj2 // false
obj1 == obj3 // true
// 3,
{} == "{}" // false,对象{}转化为字符串是"[object Object]"
// 4,
null == null // true
undefined == undefined // true
null == undefined // true
"" == null // false
NaN == NaN // false