3_1:语言基础:原始值 与 引用值
一 原始值 与 引用值
. 原始值 就是最简单的数据
. 引用值 则是由多个值构成的对象
. 把一个值赋给变量时 JavaScript引擎必须确定这个值是原始值还是引用值
. 保存原始值的变量 是按值(by value)访问的 因为我们操作的就是存储在变量中的实际值
. 引用值是保存在内存中的对象.
. 与其他语言不通 JavaScript不允许直接访问内存位置 因此也就不能直接操作对象所在的内存空间.
. 在操作对象时 我们实际操作的是该对象的引用,而非实际对象本身.
. 保存引用值的变量 是按引用(by reference)访问的
. 注意点:在很多语言中 字符串是使用对象表示的 因此被认为是引用类型 ECMAScript 打破了这个惯例
1)动态属性
. 原始值和引用值的定义方式很类似 都是创建一个变量 然后给它赋一个值.
. 对于引用值而言 可以随时添加 修改 删除其属性和方法.
. 原始值不能有属性 尽管给原始值添加属性不会报错.
2)复制值
. 原始值复制:let a = 10; let b = a; 把a拷贝了一个给b 它们是两个完全独立的变量 互不影响
. 引用值复制:复制的是对象的引用 也就是说a对象和b对象 它们在内存堆中是一个对象
3)传递参数
4)确定类型
. typeof 操作符 最适合判断 一个变量是否是原始类型
更确切的说:判断一个变量是否为 字符串 数值 布尔值 或 undefined 用typeof是最好的方式
如果值是对象或null 那么typeof 返回 object
typeof 对原始值非常有用 但是对引用值用处不大 我们通常不关心一个值是不是对象 而是想知道它是什么类型的对象
. instanceof 操作符 判断对视的引用类型
小结:
. 原始值大小固定 因此保存在栈内存中
. 从一个变量 到 另一个变量 复制原始值 会创建该值的第二个副本.
----------------------------------------------------
. 引用值是对象 存储在堆内存中
. 包含引用值的变量 实际上只包含 指向响应对象的指针 而不是对象本身
. 从一个变量 到 另一个变量 复制引用值 只会复制指针 因此结果是 两个变量都指向同一个对象
-----------------------------------------------------------------------------
typeof 操作符 可以确定值的原始类型
instanceof 操作符 用于确保值的 引用类型