-
Notifications
You must be signed in to change notification settings - Fork 10
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
- Loading branch information
Showing
3 changed files
with
227 additions
and
213 deletions.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
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; | ||
``` | ||
|
||
::: |
Oops, something went wrong.