Skip to content

Commit

Permalink
内容更新
Browse files Browse the repository at this point in the history
  • Loading branch information
kitorv committed Jan 2, 2019
1 parent a204bff commit cc405e9
Show file tree
Hide file tree
Showing 3 changed files with 227 additions and 213 deletions.
222 changes: 222 additions & 0 deletions src/notes/javascript/05.md
Original file line number Diff line number Diff line change
@@ -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;
```

:::
Loading

0 comments on commit cc405e9

Please sign in to comment.