diff --git a/src/notes/javascript/05.md b/src/notes/javascript/05.md new file mode 100644 index 0000000..db64b13 --- /dev/null +++ b/src/notes/javascript/05.md @@ -0,0 +1,222 @@ +:::snippet 数据类型 + +1. 基本数据类型:Undefined、Null、Boolean、Number 和 String 是按值访问的,因为可以操作保存在变量中的实际的值。 +2. 引用类型的值是保存在内存中的对象,JavaScript 不允许直接访问内存中的位置。 +3. 在操作对象时,实际上是在操作对象的引用而不是实际的对象。 +4. 在很多语言中,字符串以对象的形式来表示,因此被认为是引用类型的。ECMAScript 放弃了这一传统。 + +::: + +:::snippet 动态属性 + +1. 引用类型可以动态的增加、删除、改变属性和操作 + +```JavaScript +var person = new Object(); +person.name = "Nicholas"; +alert(person.name); //"Nicholas" +``` + +2. 基本类型的值不能添加属性,尽管这样做不会导致任何错误 + +```JavaScript +var name = "Nicholas"; +name.age = 27; +alert(name.age); //undefined +``` + +::: + +:::snippet 复制变量 + +1. 值类型复制变量,实际内存会分配新的空间存储新的值 + +```JavaScript +var num1 = 5; +var num2 = num1;//num1和num2指向了不同的内存空间 +``` + +2. 引用类型复制变量,引用指向同一个地址,值相同 + +```JavaScript +var obj1 = new Object(); +var obj2 = obj1; +obj1.name = "Nicholas"; +alert(obj2.name); //"Nicholas",obj2.name与obj1.name都指向统一内存地址值一致 +``` + +::: + +:::snippet 传递参数 + +1. 值类型参数,方法内部是值类型复制,参数在内部修改不影响外部 + +```JavaScript +function addTen(num) { + num += 10; + return num; +} +var count = 20; +var result = addTen(count); +alert(count); //20,没有变化 +alert(result); //30 +``` + +2. 引用类型参数,方法内部改变值`属性`值外部也会跟着改变 + +```JavaScript +function setName(obj) { + obj.name = "Nicholas"; +} +var person = new Object(); +setName(person); +alert(person.name); //"Nicholas" +``` + +3. 引用类型参数,参数实际是值复制,可以改变属性,但是不能改变整个参数赋值 + +```JavaScript +function setName(obj) { + obj.name = "Nicholas"; + obj = new Object(); + obj.name = "Greg"; +} +var person = new Object(); +setName(person); +alert(person.name); //"Nicholas" +``` + +::: + +:::snippet 检测类型 + +1. 基本类型的检测可以使用关键字 `typeof` 来进行检测 +2. Object 类型对应的具体类型,要用`instanceof`来检测 + +```JavaScript +alert(person instanceof Object); // 变量person 是Object 吗? +alert(colors instanceof Array); // 变量colors 是Array 吗? +alert(pattern instanceof RegExp); // 变量pattern 是RegExp 吗? +``` + +3. 5 中基本类型使用`instanceof`检测都会返回 false + +::: + +:::snippet 执行环境以及作用域 + +1. 执行环境定义了变量或函数有权访问的其他数据,决定了它们各自的行为。 +2. web 浏览器定义全局执行环境就是`window`对象,因此所有全局变量和函数都是作为 window 对象的属性和方法创建的。 +3. 当代码在一个环境中执行时,会创建变量对象的一个作用域链,作用域链的用途,是保证对执行环境有权访问的所有变量和函数的有序访问。 +4. 标识符会从作用域一级一级往上找,直到全局作用域,找不到则报错 + +::: + +:::snippet 延长作用域 + +1. try-catch 语句的 catch 块。 + +```JavaScript +try { + var number=123; +} catch (err) { + alert(number) //123 +} +``` + +2. with 语句。 + +```JavaScript +function buildUrl() { + var qs = "?debug=true"; + with(location){ + var url = href + qs; + } + return url; +} +``` + +::: + +:::snippet 没有块级作用域 + +1. 由于不存在块级作用域,i 变量定义后为`window`对象的属性成为全局变量,所以循环完后 i 的值为 10 + +```JavaScript +for (var i=0; i < 10; i++){ + doSomething(i); +} +alert(i); //10 +``` + +2. 默认声明变量不加`var`为全局变量,属于`window`对象的属性 + +```JavaScript +function add(num1, num2) { + var sum = num1 + num2; + return sum; +} +var result = add(10, 20); //30 + alert(sum); //由于sum 不是有效的变量,因此会导致错误 +``` + +```JavaScript +function add(num1, num2) { + sum = num1 + num2; + return sum; +} +var result = add(10, 20); //30 +alert(sum); //30 +``` + +3. 查询标识符,从作用域链的前端开始,向上逐级查询与给定名字匹配的标识符。如果在局部环境中找到了该标识符,搜索过程停止,变量就绪。 + +```JavaScript +var color = "blue"; +function getColor(){ + var color = "red"; + return color; +} +alert(getColor()); //"red" +``` + +::: + +:::snippet 垃圾收集 + +1. 标记清除:通过代码的执行位置,`进入环境`和`离开环境`标记,使用完成后,等待到垃圾回收执行时间,自动回收 +2. 引用计数:通过代码的引用次数来做标记,使用完成后,等待到垃圾回收执行时间,自动回收 + +```JavaScript +//引用计数存在循环引用问题 +var element = document.getElementById("some_element"); +var myObject = new Object(); +myObject.element = element; +element.someObject = myObject; + +//清除引用循环 +myObject.element = null; +element.someObject = null; +``` + +3. 性能问题:各个浏览器有各自的垃圾回收策略和时间间隔,不建议自己调用垃圾回收 + +```JavaScript +window.CollectGarbage();//ie垃圾回收 +window.opera.collect();//opera7垃圾回收 +``` + +4. 管理内存:全局变量可以手工清除,局部变量作用域外自动清除等待垃圾回收一般无需处理 + +```JavaScript +function createPerson(name){ + var localPerson = new Object(); + localPerson.name = name; + return localPerson; +} +var globalPerson = createPerson("Nicholas"); +// 手工解除globalPerson 的引用 +globalPerson = null; +``` + +::: diff --git a/src/notes/javascript/JAVASCRIPT-07.md b/src/notes/javascript/JAVASCRIPT-07.md deleted file mode 100644 index 597966b..0000000 --- a/src/notes/javascript/JAVASCRIPT-07.md +++ /dev/null @@ -1,213 +0,0 @@ -# 变量、作用域和内存 - -## 基本类型和引用类型的值 - -### 1. 基本概念 - -- 基本数据类型:Undefined、Null、Boolean、Number 和 String 是按值访问的,因为可以操作保存在变量中的实际的值。 -- 引用类型的值是保存在内存中的对象,JavaScript 不允许直接访问内存中的位置。 -- 在操作对象时,实际上是在操作对象的引用而不是实际的对象。 -- 在很多语言中,字符串以对象的形式来表示,因此被认为是引用类型的。ECMAScript 放弃了这一传统。 - -### 2. 动态属性 - -- 引用类型可以动态的增加、删除、改变属性和操作 - -```JavaScript -var person = new Object(); -person.name = "Nicholas"; -alert(person.name); //"Nicholas" -``` - -- 基本类型的值不能添加属性,尽管这样做不会导致任何错误 - -```JavaScript -var name = "Nicholas"; -name.age = 27; -alert(name.age); //undefined -``` - -#### 3. 复制变量 - -- 值类型复制变量,实际内存会分配新的空间存储新的值 - -```JavaScript -var num1 = 5; -var num2 = num1; -//num1和num2指向了不同的内存空间 -``` - -- 引用类型复制变量,引用指向同一个地址,值相同 - -```JavaScript -var obj1 = new Object(); -var obj2 = obj1; -obj1.name = "Nicholas"; -alert(obj2.name); //"Nicholas",obj2.name与obj1.name都指向统一内存地址值一致 -``` - -### 4. 传递参数 - -- 值类型参数,方法内部是值类型复制,参数在内部修改不影响外部 - -```JavaScript -function addTen(num) { - num += 10; - return num; -} -var count = 20; -var result = addTen(count); -alert(count); //20,没有变化 -alert(result); //30 -``` - -- 引用类型参数,方法内部改变值`属性`值外部也会跟着改变 - -```JavaScript -function setName(obj) { - obj.name = "Nicholas"; -} -var person = new Object(); -setName(person); -alert(person.name); //"Nicholas" -``` - -- 引用类型参数,参数实际是值复制,可以改变属性,但是不能改变整个参数赋值 - -```JavaScript -function setName(obj) { - obj.name = "Nicholas"; - obj = new Object(); - obj.name = "Greg"; -} -var person = new Object(); -setName(person); -alert(person.name); //"Nicholas" -``` - -### 5. 检测类型 - -- 基本类型的检测可以使用关键字 `typeof` 来进行检测 -- Object 类型对应的具体类型,要用`instanceof`来检测 - -```JavaScript -alert(person instanceof Object); // 变量person 是Object 吗? -alert(colors instanceof Array); // 变量colors 是Array 吗? -alert(pattern instanceof RegExp); // 变量pattern 是RegExp 吗? -``` - -- 5 中基本类型使用`instanceof`检测都会返回 false - -## 执行环境以及作用域 - -### 1. 概念 - -- 执行环境定义了变量或函数有权访问的其他数据,决定了它们各自的行为。 -- web 浏览器定义全局执行环境就是`window`对象,因此所有全局变量和函数都是作为 window 对象的属性和方法创建的。 -- 当代码在一个环境中执行时,会创建变量对象的一个作用域链,作用域链的用途, - 是保证对执行环境有权访问的所有变量和函数的有序访问。 -- 标识符会从作用域一级一级往上找,直到全局作用域,找不到则报错 - -### 2. 延长作用域 - -- try-catch 语句的 catch 块。 - -```JavaScript -try { - var number=123; -} catch (err) { - alert(number) //123 -} -``` - -- with 语句。 - -```JavaScript -function buildUrl() { - var qs = "?debug=true"; - with(location){ - var url = href + qs; - } - return url; -} -``` - -### 3. 没有块级作用域 - -- 由于不存在块级作用域,i 变量定义后为`window`对象的属性成为全局变量,所以循环完后 i 的值为 10 - -```JavaScript -for (var i=0; i < 10; i++){ - doSomething(i); -} -alert(i); //10 -``` - -- 默认声明变量不加`var`为全局变量,属于`window`对象的属性 - -```JavaScript -function add(num1, num2) { - var sum = num1 + num2; - return sum; -} -var result = add(10, 20); //30 - alert(sum); //由于sum 不是有效的变量,因此会导致错误 -``` - -```JavaScript -function add(num1, num2) { - sum = num1 + num2; - return sum; -} -var result = add(10, 20); //30 -alert(sum); //30 -``` - -- 查询标识符,从作用域链的前端开始,向上逐级查询与给定名字匹配的标识符。如果在局部环境中找到 - 了该标识符,搜索过程停止,变量就绪。 - -```JavaScript -var color = "blue"; -function getColor(){ - var color = "red"; - return color; -} -alert(getColor()); //"red" -``` - -## 垃圾收集 - -- 标记清除:通过代码的执行位置,`进入环境`和`离开环境`标记,使用完成后,等待到垃圾回收执行时间,自动回收 -- 引用计数:通过代码的引用次数来做标记,使用完成后,等待到垃圾回收执行时间,自动回收 - -```JavaScript -//引用计数存在循环引用问题 -var element = document.getElementById("some_element"); -var myObject = new Object(); -myObject.element = element; -element.someObject = myObject; - -//清除引用循环 -myObject.element = null; -element.someObject = null; -``` - -- 性能问题:各个浏览器有各自的垃圾回收策略和时间间隔,不建议自己调用垃圾回收 - -```JavaScript -window.CollectGarbage();//ie垃圾回收 -window.opera.collect();//opera7垃圾回收 -``` - -- 管理内存:全局变量可以手工清除,局部变量作用域外自动清除等待垃圾回收一般无需处理 - -```JavaScript -function createPerson(name){ - var localPerson = new Object(); - localPerson.name = name; - return localPerson; -} -var globalPerson = createPerson("Nicholas"); -// 手工解除globalPerson 的引用 -globalPerson = null; -``` diff --git a/src/setting.json b/src/setting.json index 63938bf..8117013 100644 --- a/src/setting.json +++ b/src/setting.json @@ -20,6 +20,11 @@ "path": "@/notes/javascript/04.md", "name": "语句和函数", "date": "" + }, + { + "path": "@/notes/javascript/05.md", + "name": "变量、作用域和内存", + "date": "" } ] }