八种数据类型

  • string
  • number
  • boolean
  • null
  • undefined
  • symbol
  • object
  • 增加bigInt 用来解决number类型无法表示大于 2^53-1 和 小于 -(2^53-1) 的数

类型判断

typeof

大部分情况当做运算符使用 typeof 1 ,还可以当做函数使用,用的很少,如 typeof(1)
由于JS本身的错误, typeof 判断并不能完全得到上述的7种类型值。

  1. typeof null; // object 得到的并不是null
  2. typeof undefined // undefined

但是本身在书写代码还是提供了很多便利性,比如判断函数就可以 typeof alert

Object.prototype.toString

利用这个原型方法可以得到准确的类型。

  1. Object.prototype.toString.call([]); // [object Array]

类型转换

字符串转换

比如 alert 会将传入的值转为 string 类型。

  1. alert(false) // 弹框打印的是字符串 false

数字转换

在运算和表达式中,会自动进行 number 类型转换。

变成……
undefined NaN
null 0
true 和 false 1 and 0
string 数字字符串如 '123' 转为 123 ,如果前后有空格,忽略。
如果有其他非数字字符串或数字字符串中间有空格,转换失败变为 NaN

当一方有字符串,除了+运算符,会将所有值变为字符串,其他运算符都是转为number

布尔类型转换

除了 0 '' null undefined NaN 转换为 false ,其他都是 true

对象转换(难点)

对象转换只能转换为基本类型,要么是数字,要么是字符串,具体根据调用场景决定是数字还是字符串。

  • alert调用,转换为字符串
  • +obj obj1 + obj2 调用,转换为数字。

规则:

  1. 现代javascript,优先调用对象的 [Symbol.toPrimitive] 方法。
  2. 根据调用场景(ecma说法叫hint,翻译为暗示),如果 hint 是string,调用对象的 toStringvalueOf
  3. 根据场景调用,如果 hint 是number** ,**调用对象的 valueOftoString

验证规则调用顺序的例子

  1. var a = {}
  2. a + 1; // hint暗示number。
  3. // 优先调用valueOf,默认返回对象本身{},无法运算。
  4. // 因此去调toString,默认返回[object Object],字符串。
  5. // 转变为 '[object Object]' + 1
  6. // 优先调用valueOf的验证
  7. var a = {
  8. valueOf: () => 1
  9. }
  10. a + 1; // 2
  11. // 如果有[Symbol.toPrimitive],则优先调用,验证:
  12. var a = {
  13. [Symbol.toPrimitive]: () => 2,
  14. valueOf: () => 1
  15. }
  16. a + 1; // 3

题目

出错的题

  1. " -9 " + 5 // 不是'-95',而是' -9 5'
  2. " \t \n" - 2 // 不是NaN,而是-2。 因为\t\n是实体空字符。

一道有趣的面试题

利用对象的调用,使得每次调用对象的属性值增加1,并返回该值。

  1. // a声明为什么,使得 a == 1 && a == 2 && a == 3 为true
  2. var a = {
  3. value: 1,
  4. // 如果这里用箭头函数了,注意箭头函数绑定的this是window,this.value = undefined 自增变成NaN
  5. [Symbol.toPrimitive]() {return this.value++}
  6. }
  7. a == 1 && a == 2 && a == 3 // true