# 四.数据类型

前言

  • 基本数据类型:number、string、boolean、undefined、null
  • 引用数据类型:object、array、function

# 1.number

# 1.1 类型转换

# 1.2 常用方法

# 2.string

# 2.1 类型转换

# 2.2 常用方法

# 2.2.1 replace

# 2.2.2 slice

# 3.boolean

# 3.1 类型转换

# 3.2 常用方法

# 4.undefined

# 4.1 类型转换

# 4.2 常用方法

# 5.null

# 5.1 类型转换

# 5.2 常用方法

# 6.object

# 6.1 字面量

let obj = {}
1
let obj = new Object()
1

# 6.1 类型转换

# 6.2 常用方法

# 6.2.1 assign

  • 合并数据
var a = { key: 1 }
Object.assign(a, { key: 2, o: 3 })
1
2

# 6.2.2 keys

# 6.2.3 value

# 7.array

# 7.1 字面量

let arr = []
1
let arr = new Array()
1

# 7.1 类型转换

# 7.2 常用方法

# 7.2.1 forEach

遍历数组中的每一项

  • 1.数组中有几项,那么我们传递进去的匿名回调函数就需要执行几次
var ary = [12, 3, 4, 5, 6]
ary.forEach(function () {
  console.log("ok")
})
1
2
3
4
  • 2.每一次执行匿名函数的时候,还给其传递了三个参数值:数组中的当前项 item,当前项的索引 index,原始的数组 input

  • 3.理论上我们的方法是没有返回值的,仅仅是遍历数组中的每一项,不对原来的数组进行修改,但是我们可以通过数组的索引来修改原来的数组

var ary = [12, 3, 4, 5, 6]
var res = ary.forEach(function (item, index, input) {
  input[index] = item * 10
})
1
2
3
4
  • 4.实现原理
Array.prototype.forEach = function (fn) {
  for (let i = 0; i < this.length; i++) {
    fn(this[i], i)
  }
}
;[1, 2, 3].forEach((item, index) => {
  console.log(item, index)
})
1
2
3
4
5
6
7
8

# 7.2.2 map

  • 1.map 的回调函数中支持 return 返回值
var ary = [12, 3, 4, 67, 8]
var res = ary.map(function (item, index, input) {
  return item * 10
})
1
2
3
4
//匿名回调函数的this是window
var obj = { name: 10 }
var ary = [12, 3, 4, 67, 8]
var res = ary.map(
  function (item, index, input) {
    return this
  }.call(obj)
) //undefined
var res = ary.map(
  function (item, index, input) {
    return this
  }.bind(obj)
)

//不管是forEach还是map都支持两个参数,第二个参数是匿名函数的this
var res = ary.map(function (item, index, input) {
  return this
}, obj)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
  • 2.实现原理
Array.prototype.map = function (fn) {
  let arr = []
  for (let i = 0; i < this.length; i++) {
    arr.push(fn(this[i], i))
  }
  return arr
}
let ary = [1, 2, 3].map((item) => {
  return item * 2
})
console.log(ary)
1
2
3
4
5
6
7
8
9
10
11

# 7.2.3 reduce

  • 1.返回的结果是叠加后的结果,函数的返回结果会作为下一次循环的 prev
let result = [1, 2, 3, 4, 5].reduce((prev, next, currIndex, ary) => {
  if (ary.length - 1 === currIndex) {
    return (prev + next) / ary.length
  }
  return prev + next
}, 0)
console.log(result)

let total = [{ price: 10 }, { price: 20 }, { price: 30 }].reduce(
  (prev, next, currIndex, ary) => {
    return prev.price + next.price
  },
  0
)
console.log(total)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
  • 2.数组展平
let flat = [
  [1, 2, 3],
  [4, 5, 6],
].reduce((prev, next, index, ary) => {
  return [...prev, ...next]
})
console.log(flat)
1
2
3
4
5
6
7
  • 3.实现原理
Array.prototype.myReduce = function (fn, prev) {
  for (let i = 0; i < this.length; i++) {
    if (typeof prev === "undefined") {
      prev = fn(this[i], this[i + 1], i + 1, this)
      ++i
    } else {
      prev = fn(prev, this[i], i, this)
    }
  }
  return prev
}
let total = [1, 2, 3].myReduce((prev, next, currIndex, ary) => {
  return prev + next
}, 0)
console.log(total)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15

# 7.2.4 filter

  • 1.过滤数据,如果返回 true 表示留下 返回 false 表示删除
let arr = [1, 2, 3]
let newArr = arr.filter((item) => {
  return item > 2
})
console.log(newArr)
1
2
3
4
5

# 7.2.5 some

  • 1.找到后返回 true
let s = [1, 2, 3].some((item) => {
  return item === 2
})
console.log(s)
1
2
3
4

# 8.function

# 8.1 函数参数

# 8.1.1 params

# 8.1.2 arguments

function fn() {
  console.log(arguments)
}
fn(111)
1
2
3
4

# 8.2 常用方法

# 8.2.1 call

# 8.2.2 apply

# 8.2.3 bind