1.JavaScript有哪些类型(红宝书P30)

  • 对象转原始类型
    • String
    • Number
    • Undefined
    • Boolean
    • Null
    • Symbol
    • BigInt
  • 对象转原始类型

    • Object
    • Array
    • Function
    • Error


    对象转原始类型

  • 原始类型存储的都是值 没有方法 引用类型有

  • 原始类型存在在栈中 可直接读取 引用类型存在在堆中 将地址放在变量的栈中

2.typeof instanceof 区别 (红宝书P30)

  1. typeof 1 //'number'
  2. typeof '1' //'string'
  3. typeof {} //'object'
  4. typeof [] //'object'
  5. typeof undefined // 'undefined'
  6. typeof null // 'object'
  7. typeof NaN // 'number'
  8. typeof Symbol() // 'symbol'
  9. typeof console.log // 'function'
  10. // 除了null 原始类型都可以正确返回
  1. const Person = function() {}
  2. const p1 = new Person()
  3. p1 instanceof Person // true
  4. var str = 'hello world'
  5. str instanceof String // false
  6. var str1 = new String('hello world')
  7. str1 instanceof String // true
  8. // 可以判断引用类型 无法判断原始类型
  1. // 全能的类型判断
  2. function _typeof(value) {
  3. return Object.prototype.toString.call(value).toLowerCase().slice(8,-1)
  4. }

3.类型转换

  • 布尔类型
  1. // JavaScript falsy值
  2. '' false 0 +0 -0 NaN undefined null
  • 对象与原始类型
  1. // Number()
  2. // 布尔值
  3. Number(true) // 1
  4. Number(1) // 1
  5. Number(false) // 0
  6. // 数字
  7. Number(11) // 11
  8. // null
  9. Number(null) // 0
  10. // undefined
  11. Number(undefined) // 0
  12. // 字符串
  13. // 1.整数包含数字
  14. Number('111') // 111
  15. Number('0011') // 11 忽略开头0
  16. Number('-0011') // -11 忽略开头0 保留-号
  17. // 2.浮点数
  18. Number('1.1') // 1.1
  19. Number('-00.11') // -0.11
  20. Number('-00.11') // -0.11
  21. // 3.十六进制 转为对应十进制
  22. Number('0xf') // 15
  23. // 4.空 空格
  24. Number("") // 0
  25. Number(" ") // 0
  26. // 5. 其他情况的字符串
  27. Number("a1") // NaN
  28. // 对象
  29. // 先调用valueOf方法,并按上述规则转换 如果值为NaN 则调用toString方法
  30. Number({}) // NaN
  31. let obj = {
  32. valueOf(){
  33. return 1
  34. }
  35. }
  36. Number(obj) // 1
  37. let obj2 = {
  38. toString(){
  39. return 2
  40. }
  41. }
  42. // obj2的valueOf默认行为是返回对象本身,而不是字符串,所以才会采用toString
  43. Number(obj2) // 2
  44. // String()
  45. // 原始值 没有toString方法 直接返回字面量
  46. String(true) // "true"
  47. String(1) // "1"
  48. String(undefined) // "undefined"
  49. String(NaN) // "NaN"
  50. String(null) // "null"
  51. // 对象
  52. // 调用toString方法
  53. String({}) // "[object Object]"
  54. String([]) // "[object Array]"

4.运算符 (红宝书P56)

  • 一元操作符(只操作一个值的操作符)

    var num1 = 2;
    var num2 = 20;
    console.log(--num1 + num2) // 21
    console.log(num1 + num2) // 21
    console.log(num1 + num2--) // 21
    console.log(num1 + --num2) // 19
    
    • 前缀 在求值之前改变 有称为副作用
    • 后缀 在求值之后改变


其他类型

// String
let a = '1' 
a++
console.log(a) // 2

let a = 'z' 
a++
console.log(a) // NaN

// Boolean
let a = true
a++
console.log(a) // 2

let a = false 
--a
console.log(a) // -1

// 浮点数
let a = 1.01
a--
console.log(a) // 0.010000000000000009

// Object
// 调用valueOf 如果是NaN调用toString
+{} // Number('[object,object]') => NaN 
+[] // Number([]) => 先调用valueOf => 返回本身 不是原始值 => 调用toString() "" => Number("") => 0
  • 加性操作符
// Number
NaN + 1 // NaN
Infinity + Infinity // Infinity
-Infinity + -Infinity // -Infinity
Infinity + -Infinity // NaN
+0 + +0 // +0
-0 + +0 // +0
-0 + -0 // -0

// String
// 任意操作数是对象、数值、布尔值 则调用toString方法转为字符串
'a' + 'b' // 'ab'
5 + '5' // '55'
1 + {} // '1[object Object]'
{} + {} // 一般浏览器 '[object Object][object Object]' 
                // 有的浏览器会将第一个{} 解释为空代码块  空代码块 +{}  => NaN
                // ({} + {}) '[object Object][object Object]' 
{} + [] // 浏览器 0  解释为 空代码块 +[] => 0
                // node的REPL '[object Object]' + "" => '[object Object]'
[] + {} // String([]) => ""   String({}) => "[object Object]"
[] + [] // 先调用valueOf() 返回的是本身 此时结果不是原始值 在调用toString 返回""
[1] + [1,2] // "11,2"
{} + [1] // 1
{} + [1,2,3] // Number([1,2,3]) => NaN
  • 关系操作符 > <
// 都是数字1 > 2 // false// 都是字符串 判断对应编码 => Array.prototype.sort()'a' > 'b' // false // 一个为数值 将另一个转换为数值比较1 > '0' // true1 < 'a' // true// 一个为对象 调用对象的valueOf方法 如果没有valueOf 则调用toString比较({} > 1) // false Number({}) => NaN({} < 1) // false({} < 'a') // false String({}) => "[object Object]"// 任一操作数为布尔值 转为数值再比较true > 0 // true  true => 1
  • 相等操作符 == != ===
// == !== 两个操作数进行类型转换再比较// 任一操作数为布尔值 转为数值再比较true == 1 // truetrue == { a: 1 } // false Number({a:1}) => NaNfalse == { a: 1 } // falsefalse == [] // truetrue == [1] // true true=>1 Number([1])=>1// 一个是字符串 另一个是数值 将字符串转为数值再比较'1' == 1 // true'a' == 97 // false// 一个是对象 另一个不是 则调用对象的valueOf方法取得其原始值 再根据上面规则比较let obj = {     valueOf(){        return '2'    }}obj == 2 // true// null 与 undefined 相等undefined == null // true// null 与 undefined 不能转换为其他类型进行比较undefined == false // falselet a = ''a == false // true// NaN 不等于任何值NaN == NaN // false// 两个操作数都是对象 判断是否为同一对象let a = {}let b = aa == b // true// 全等 === 不进行类型转换比较
  • 布尔操作符 ! && ||
  • 指数操作符
  • 位操作符
  • 乘性操作符 * /
  • 条件操作符 三元操作符
  • 赋值操作符 += -= …
  • 逗号操作符
let a = (1,2,3,4,5)a // 5

相关面试题

// console.log(1+"2") 和 console.log(1-"2") 的打印结果?// 2.var a = 1;  a+++a;  typeof a+2;// 3var d = a = 3, b = 4console.log(d)// 4var d = (a = 3, b = 4)console.log(d)// 5var a = 1, b = 2, c = 3;var val = typeof a + b || c >0console.log(val)var d = 5;var data = d == 5 && console.log('bb')console.log(data)var data2 = d = 0 || console.log('haha')console.log(data2)var x = !!"Hello" + (!"world", !!"from here!!");console.log(x)// 6console.log(1+1);console.log("2"+"4");console.log(2+"4");console.log(+"4");// 7 var a = typeof typeof 4+4console.log(a)