《每天十分钟》-红宝书第4版-变量、作用域与内存

最近有点忙,好长时间没抄经了,今天继续,之前语言基础相对简单,跳过一部分操作符。

变量

js 的变量是特殊的松散类型,由于没有规则定义变量必须包含什么数据类型,变量的值和数据类型在脚本生命期内可以改变。

原始值和引用值。
原始值(primitive value)就是最简单的数据。
引用值(reference value)则是由多个值构成的对象。

之前学过的6 种原始值:Undefined、Null、Boolean、Number、String 和 Symbol。保存原始值的变量是按值(by value)访问的,因为我们操作的就是存储在变量中的实际值。

引用值是保存在内存中的对象。与其他语言不同,JavaScript 不允许直接访问内存位置,因此也就不能直接操作对象所在的内存空间。在操作对象时,实际上操作的是对该对象的引用(reference)而非实际的对象本身。为此,保存引用值的变量是按引用(by reference)访问的。

注意 在很多语言中,字符串是使用对象表示的,因此被认为是引用类型。ECMAScript
打破了这个惯例。

动态属性
原始值使用字面量初始化的,则不能动态添加属性的

var t = "zhangsan"
t.age = 18
console.log(t.age) //undefined

但如果是使用new 关键字创建的Object类型的实例 则可以添加动态属性,因为已经是Object

var abc = new String('zhangsan')
abc.age = 18
console.log(abc.age) // 18

复制值
一个原始值赋值到另一个原始值时,两个变量的内存存储时完全独立的,这个很好理解,因为上面讲了,原始值就是内存直接存储的值

var a = 1;
var b = a
a = 3
console.log(b) //1

而引用类型再赋值过程中实际只是复制了内存的指针

var a = {"name":"zhangsan"}
var b = a
a.name = "lisi"
console.log(b) //{name: 'lisi'}

传递参数
和内存复制一样,原始值完全独立,引用类型指向同一块内存,修改后指向引用的变量都会变化

确定类型
typeof 操作符最适合用来判断一个变量是否为原始类,之前再语言基础中由示例,此处不再重复。
ypeof 虽然对原始值很有用,但它对引用值的用处不大。我们通常不关心一个值是不是对象,
而是想知道它是什么类型的对象。为了解决这个问题,ECMAScript 提供了 instanceof 操作符,语
法如下:

var a = {name:'zhangsan'}
a instanceof Object //true
var b = "123"
b instanceof Object //false

按照定义,所有引用值都是 Object 的实例,因此通过 instanceof 操作符检测任何引用值和
Object 构造函数都会返回 true。类似地,如果用 instanceof 检测原始值,则始终会返回 false,
因为原始值不是对象。

下篇继续抄 较为重要的 执行上下文

今天我家二娃也一年级了,找了篇关于放学开心的诗读读,
《村居》
清代·高鼎
草长莺飞二月天,
拂堤杨柳醉春烟。
儿童散学归来早,
忙趁东风放纸鸢。

你可能感兴趣的:(《每天十分钟》红宝书第4版,javascript,前端,开发语言)