js的内置类型和类型转换

1、内置类型:

两大类型:基本类型(nullundefinedbooleannumberstringsymbol)和引用类型([ ]、{ })

注意点:NaN 也属于 number 类型,并且 NaN 不等于自身。对象(Object)是引用类型,在使用过程中会遇到浅拷贝和深拷贝的问题。

2、Typeof:

typeof 对于基本类型,除了 null 都可以显示正确的类型。

typeof 对于对象,除了函数都会显示 object。

typeof 1 // 'number'
typeof '1' // 'string'
typeof undefined // 'undefined'
typeof true // 'boolean'
typeof Symbol() // 'symbol'
typeof NaN //number
typeof b // b 没有声明,但是还会显示 undefined
typeof null //object  在 JS 的最初版本中,使用的是 32 位系统,为了性能考虑使用低位存储了变量的类型信息,000 开头代表是对象,然而 null 表示为全零,所以将它错误的判断为 object 。虽然现在的内部类型判断代码已经改变了,但是对于这个 Bug 却是一直流传下来。

typeof [] // 'object'
typeof {} // 'object'
typeof console.log // 'function'

如果我们想获得一个变量的正确类型,可以通过 Object.prototype.toString.call(xx)。这样我们就可以获得类似 [Object Type] 的字符串。

Object.prototype.toString.call(null);//"[object Null]"
Object.prototype.toString.call("hhh");//"[object String]"

3、类型转换

转Boolean:除了 undefined, null, false, NaN, '', 0, -0,其他所有值都转为 true,包括所有对象。

Boolean(undefined);//false
Boolean(null);//false
Boolean({});//true
Boolean([]);//true

对象转基本类型

//对象在转换基本类型时,首先会调用 valueOf 然后调用 toString。Symbol.toPrimitive ,该方法在转基本类型时调用优先级最高。
let a = {
  valueOf() {
    return 0;
  },
  toString() {
    return '1';
  },
  [Symbol.toPrimitive]() {
    return 2;
  }
}
1 + a // => 3
'1' + a // => '12'

四则运算符:+:一方是字符串类型,就会把另一个也转为字符串类型,其他运算:一方是数字,就会把另一方转为数字

1 + '1' = '11'
1 + undefined = NaN
[1, 2] + [2, 1] = '1,22,1'
 '1,2' + '2,1' = '1,22,1'
2 * '2' = 4
[1, 2].toString() = '1,2'

'a' + + 'b' ="aNaN"
+ 'b' = NaN
+ '1' = 1

==操作符:

[] == false;//true
[] == 0;//true
"" ==0 ;//true

比较运算符:如果是对象,就通过 toPrimitive 转换对象,如果是字符串,就通过 unicode 字符索引来比较

猜你喜欢

转载自blog.csdn.net/han_calligrapher/article/details/81220530