zhuanyongxigua / blog

blog
77 stars 9 forks source link

JavaScript数据类型转换总结 #29

Open zhuanyongxigua opened 5 years ago

zhuanyongxigua commented 5 years ago

我的github博客 https://github.com/zhuanyongxigua/blog

数据类型的转换

在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"相同。

如果是四则运算,字符串的优先级最高,数字第二。意思就是如果相加的遇到了字符串,则不是字符串的转化为字符串,如果没有字符串,有一个数字,则不是数字的转化为数字。

数据类型的比较(隐式转换)

  1. NaN与任何值都不相等,包括它自己。
  2. 对象与对象比较,比较的是不是指向同一个内存地址
  3. 对象与字符串比较,对象先转化为字符串,然后做比较
  4. 对象与布尔类型值比较,两边都要先转为数字(false是0,true是1)。对象类型的值先隐式调用toString方法,在隐式调用Number方法
  5. 对象与数字比较,对象转化为数字再比较(先隐式调用toString方法,再隐式调用Number方法将对象转化为数字)
  6. 数字与布尔类型值比较,就是进行数字的比较
  7. 数字与字符串的比较,把字符串转化为数字,再比较
  8. 布尔与布尔,两边都转化为数字再比较
  9. null与undefined比较,true
  10. null、undefined与其他类型比较,结果都是false,因为他们俩没有toString方法

简化版

  1. 只要有数字和布尔值的,都转换成数字进行比较;
  2. 对象与对象比较,比较的是不是指向同一个内存地址;
  3. 对象与字符串比较,对象先转化为字符串,然后做比较;
  4. 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