一、原始值和援用值的概念
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 = 1let b = truelet 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吗