数组
[1, 2, 3, 'hello', true, false]数据类型分类
number / string / boolean / undefined / null / object / function / array / ...
数组也是数据类型中的一种
我们简单的把所有数据类型分为两个大类 基本数据类型 和 复杂数据类型
基本数据类型: number / string / boolean / undefined / null
复杂数据类型: object / function / array / ...
创建一个数组
字面量创建一个数组
var arr1 = []
var arr2 = [1, 2, 3]
内置构造函数创建数组
var arr1 = new Array()
var arr2 = new Array(10)
var arr3 = new Array(1, 2, 3)
数组的 length
var arr = [1, 2, 3]
console.log(arr.length)
数组的索引
var arr = ['hello', 'world']
var arr = ['hello', 'world']
console.log(arr[0])
console.log(arr[1])
数据类型之间存储的区别(重点)
既然我们区分了基本数据类型和复杂数据类型
那么他们之间就一定会存在一些区别
他们最大的区别就是在存储上的区别
我们的存储空间分成两种 栈 和 堆
栈: 主要存储基本数据类型的内容
堆: 主要存储复杂数据类型的内容
基本数据类型在内存中的存储情况
复杂数据类型在内存中的存储情况
var obj = {
name: 'Jack',
age: 18,
gender: '男'
}
在堆里面开辟一个存储空间
把数据存储到存储空间内
把存储空间的地址赋值给栈里面的变量
数据类型之间的比较
var num = 1
var str = '1'
console.log(num == str)
var obj = { name: 'Jack' }
var obj2 = { name: 'Jack' }
console.log(obj == obj2)
因为我们创建了两个对象,那么就会在 堆空间 里面开辟两个存储空间存储数据(两个地址)
虽然存储的内容是一样的,那么也是两个存储空间,两个地址
复杂数据类型之间就是地址的比较,所以 obj 和 obj2 两个变量的地址不一样
所以我们得到的就是 false
数组的常用方法
var arr = [1, 2, 3]
arr = [1, 2]
数组常用方法之 push
var arr = [1, 2, 3]
arr.push(4)
console.log(arr)
数组常用方法之 pop
var arr = [1, 2, 3]
arr.pop()
console.log(arr)
数组常用方法之 unshift
var arr = [1, 2, 3]
arr.unshift(4)
console.log(arr)
数组常用方法之 shift
var arr = [1, 2, 3]
arr.shift()
console.log(arr)
数组常用方法之 splice
var arr = [1, 2, 3, 4, 5]
arr.splice(1, 2)
console.log(arr)
var arr = [1, 2, 3, 4, 5]
arr.splice(1, 2, '我是新内容')
console.log(arr)
数组常用方法之 reverse
var arr = [1, 2, 3]
arr.reverse()
console.log(arr)
数组常用方法之 sort
var arr = [2, 3, 1]
arr.sort()
console.log(arr)
数组常用方法之 concat
var arr = [1, 2, 3]
var newArr = arr.concat([4, 5, 6])
console.log(arr)
console.log(newArr)
数组常用方法之 join
var arr = [1, 2, 3]
var str = arr.join('-')
console.log(arr)
console.log(str)
for 和 for in 循环
var arr = [1, 2, 3, 4, 5]
for (var i = 0; i < arr.length; i++) {
console.log(arr[i])
}
i < arr.length 因为 length 就是数组的长度,就是一个数字,所以我们可以直接用它来决定循环次数
console.log(arr[i]) 因为随着循环,i 的值会从 0 开始依次增加
所以我们实际上就相当于在打印 arr[0] / arr[1] / ...
var obj = {
name: 'Jack',
age: 18
}
for (var key in obj) {
console.log(key)
}
for in 循环的遍历是按照对象中有多少成员来决定了
有多少成员,就会执行多少次
key 是我们自己定义的一个变量,就和 for 循环的时候我们定义的 i 一个道理
在每次循环的过程中,key 就代表着对象中某一个成员的 属性名
函数参数传递基本数据类型和复杂数据类型的区别
var num = 100
var num2 = num
num2 = 200
console.log(num)
console.log(num2)
var obj = {
name: 'Jack'
}
var obj2 = obj
obj2.name = 'Rose'
console.log(obj.name)
console.log(obj2.name)
因为复杂数据类型,变量存储的是地址,真实内容在 堆空间 内存储
所以赋值的时候相当于把 obj 存储的那个地址复制了一份给到了 obj2 变量
现在 obj 和 obj2 两个变量存储的地址一样,指向一个内存空间
所以使用 obj2 这个变量修改空间内的内容,obj 指向的空间也会跟着改变了
函数的参数
function fn(n) {
n = 200
console.log(n)
}
var num = 100
fn(num)
console.log(num)
function fn(o) {
o.name = 'Rose'
console.log(o.name)
}
var obj = {
name: 'Jack'
}
fn(obj)
console.log(obj.name)