JS变量包括基本类型和引用类型
定义:
1.基本类型:简单的数据段(按值访问)可以操作保存在变量中的实际值
2.引用类型:一或多个值构成的对象 JS不允许直接访问内存 不能直接操作对象的内存空间
当复制保存着对象的某个变量时,操作的是对象的引用。但在为对象添加属性时,操作的是实际
的对象
1.动态属性
对比:
let person = new Object() //引用类型
person.name = 'ljh'
console.log(person.name) //ljh
let otherPerson = 'cjl' //基本类型
otherPerson.age = 20
console.log(otherPerson.age) //undefined 不会报错
结论:只能给引用类型值动态地添加属性
2.复制变量值
基本类型复制:
let num1 = 5
let num2 = num1
虽然两个变量值相同 但是num1中的5与num2中的5是完全独立的
num2只是num1中5的一个副本 如图表示复制过程:
引用类型复制:
let obj1 = new Object()
let obj2 = obj1
obj1.name = 'ljh'
console.log(obj2.name) //ljh
引用类型复制同样也会将存储在变量对象中的值复制一份放到
为新变量分配的空间中 但是 不同:
这个值的副本实际上是一个指针,而这个指针指向存储在堆中的一
个对象。复制操作结束后,两个变量实际上将引用同一个对象。
因此,改变其中一个变量,就会影响另一个变量
过程如图:
3.传递参数
所有函数的参数都是按值传递
也就是说,把函数外部的值复制给函数内部的参数,就和把值从一个变量复制到另一个变量一样
基本类型:
function addTen (num) {
num += 10
return num
}
let count = 20
let result = addTen(count)
console.log(count) //20
console.log(result) //30
在函数内部,参数 num 的值被加上了 10,但这一变化不会影响函数外部的 count 变量。参数
num 与变量 count 互不相识,它们仅仅是具有相同的值
引用类型:
function setName (obj) {
obj.name = 'ljh'
obj = {}
obj.name = 'cjl'
//证明obj为局部对象
//console.log(obj.name) //cjl
}
let person = {}
setName(person)
console.log(person.name) //ljh
显示的值仍然是"ljh"。这说明
即使在函数内部修改了参数的值,但原始的引用仍然保持未变。实际上,当在函数内部重写 obj 时,这
个变量引用的就是一个局部对象了。而这个局部对象会在函数执行完毕后立即被销毁。
4.检测基本类型 typeof
typeof可以检测字符串,数值,布尔值,undefined返回对应类型
若是null或对象则返回object 无法检测具体引用对象的类型
4.2检测引用类型 instanceof
let a = []
let b = {}
let c = 1
console.log(a instanceof Array) //true
console.log(b instanceof Object) //true
console.log(c instanceof Object) //false