共计 1089 个字符,预计需要花费 3 分钟才能阅读完成。
一、原始值和援用值的概念
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
2021-03-17