JavaScript原始值和引用值

一、原始值和引用值的概念

1.1 原始值

简单的数据:uderfined,null,boolean,number,string,symbol。
储在 栈(stack)
在许多语言中,字符串都被看作引用类型,而非原始类型,因为字符串的长度是可变的。ECMAScript 打破了这一传统。

1.2引用值

Object、Function、Array、Date、RegExp 。
存储在堆(heap)内存
引用值是保存在内存中的对象,因为JavaScript不允许直接访问内存位置,所以不能操作对象所在的内存空间。在操作对象时,实际操作的是对该对象的引用,而非实际对象本身。
由于引用值的 大小会改变,所以不能把它放在栈中,否则会降低变量查寻的速度。相反,放在变量的栈空间中的值是该对象存储在堆中的地址。地址的大小是固定的,所以把它存储在栈中对变量性能无任何负面影响。

二、动态属性

引用值可以随时增删改其属性和方法

原始值不能有属性,即使不会报错

三、复制值

原始值会被复制到新变量位置,互相独立,引用值复制的实际上是一个指针,它指向存储在对内存的对象,操作完成后,两个变量指向同一个对象。因此一个对象上的变化会在另一个对象上反映。

let a = 111
 let b = a
     b = 222

 let aa = new Object();
 let bb = aa
 aa.age = 2
 console.log(a,b,aa.age,bb.age)//111 222 2 2

四、传递参数

ECMAScript中所有参数都是按值传递的,而变量有按值和按引用访问,按值传递参数,值会被复制到一个局部变量。

如果参数按引用传递的,函数内部会反映到外部对象,这是因为函数内部的对象和外部对象都指向同一对象,不意味参数是按值传递。

function setName(obj){
 obj.name = "xt"
 obj = new Object()
 obj.name = "lt"
}
let person = new Object()
setName(person)
console.log(person.name)//"xt" 

五、比较方式

原始值按值比较,引用值按引用比较

let a = 1
let b = true
let aa = new Object()
let bb = new Object()
console.log(a==b,a===b,a==b,a===b)//true false false false 

六、确定类型

用typeof 判断原始值

用instanceof 操作符判断对象

result = variable instanceof constructor

console.log(person instanceof Object)//变量perdon是Object吗 

你可能感兴趣的:(javascript前端)