【新人报到】【学习笔记】JavaScript核心技术开发解密
作为学生党,初次发布文章,若有错误,望诸位指正!
学习书籍《JavaScript核心技术开发解密》
先列一个flag,日后不完成难免被打脸。
经过这近几天的学习,题主真切体会到学习语言要亲身实践,体会得到很多书本上没有的知识!
废话不多说,直接分享我的学习笔记了(虽然知识很low……)
1.三种常见的数据结构(完)
1.1 栈
1.2 堆
1.3 队列
栈和队列都是动态的集合
区别:栈:后进先出,队列:先进先出;栈的插入和删除操作都是在一端进行的,而队列的操作却是在两端进行的。
定义一个栈
#coding:utf-8 typedef struct { ElemType *base; ElemType *top; int stackSize; }sqStack;
这里定义了一个顺序存储的栈,它包含了三个元素:base,top,stackSize。
创建一个栈
#coding:utf-8 define STACK_INIT_SIZE 100 initStack(sqStack *s) { s->base = (ElemType *)malloc( STACK_INIT_SIZE * sizeof(ElemType) ); if( !s->base ) exit(0); s->top = s->base; // 最开始,栈顶就是栈底 s->stackSize = STACK_INIT_SIZE; }
实现一个栈
#coding:utf-8 function Stack(){ this.dataStore = []; this.top = 0; this.push = push; this.pop = pop; this.peek = peek; }
用一个数组dataStore来保存栈内元素,变量top记录栈顶位置
push()方法
先来实现push()方法,当向栈中压入一个新元素时,需要将其保存在数组中变量top对应的位置,然后将top值加1:
#coding:utf-8 function push(element){ this.dataStore[this.top++] = element;//top值加1,指向下一个空位置 }
pop()方法
#coding:utf-8 function pop(){ return this.dataStore[--this.top];//pop方法与push相反 }
peek()方法
peek方法返回数组的第一个top-1位置的元素,即栈顶元素:
#coding:utf-8 function peek(){ return this.dataStore[this.top-1]; }
length()方法
length方法通过返回变量top值的方法返回栈内的元素的个数:
#coding:utf-8 function length(){ return this.top; }
clear()方法
将变量top的值设为0,就可以清空一个栈:
#coding:utf-8 function clear(){ this.top = 0; }
2.内存空间(完)
类型 值
Boolean 只有两个值:true/false
Null 只有一个值:null
Undefined 只有一个值:undefined
Number 所有的数字
String 所有的字符串
Symbol ES6的新成员,一种独一无二的标记,避免属性命名时候的冲突
引用数据类型和堆内存空间
需要注意的是,在JavaScript中是不允许直接访问堆内存中的数据,实际上操作的是对对象的引用而不是实际的对象,比如浅拷贝深拷贝,可以进行的操作是保存引用,然后进行值传递操作。
#coding:utf-8 //demo.js var a = 20; var b = a; b = 30;
//问此时的a值是多少?
#coding:utf-8 //demo1.js var m = {a:10,b:20}; var n = m; n.a = 15;
//问此时的m.a值是多少?
分析:当变量对象进行复制时,新的变量会被创建一个内存空间,同时保存引用后分配到一个新的值,修改行为和复制行为是相互独立的,因此修改b值以后a值不会发生变化。
3.执行上下文(完)
JavaScript的运行环境主要有:全局环境,函数环境,和eval环境(不建议使用,这里不做介绍 )
划重点:JavaScript引擎会以栈的形式处理,栈底永远是执行全局上下文,栈顶则是当前正在执行的上下文
具体实现:当代码执行中遇到以上几种情况时,都会生成一个执行上下文(也叫执行环境或者环境,JS高设3有讲)并把这些
代码放入到执行栈里面,处于栈顶的上下文执行完毕后,就会自动出栈。
实例1
#coding:utf-8 var color = "blue1"; function changeColor(){ var anotheColor = "red"; function swapColors(){ var temp = anotherColor; anotherColor = color; color = temmp; } swapColors(); } changeColor();
描述:
图一 JavaScript执行栈的入栈操作过程
JavaScript执行栈出站的过程:1.swapColor()出栈,2.changeColor()出栈,最后只剩全局作用域变量
实例2
#coding:utf-8 function f1(){ var n = 999; function f2(){ alert(n); } return f2(); } var result = f1(); result(); //999
这是闭包的例子,有点迷惑性
图二 f1入栈操作过程
这时候,因为f2()只是声明而没有执行函数或者划分函数空间,估不会产生上下文,f1()执行完毕,出栈。
图三 result EC入栈操作过程
result()执行完毕,出栈,整个过程结束。
声明周期
划重点:当调用一个函数的时候,就会创建一个执行上下文(也叫执行环境,或者环境),声明周期大致分成两个阶段:创建阶段和执行阶段
创建上下文:创建变量对象,确认作用于域链,确认this指向
执行上下文:变量赋值(值传递),函数引用,执行其他代码
执行完毕后,创建的内存等待被回收.
4.变量对象
5.作用域与作用域链
6.闭包
7.this
8.函数与编程式编程
9.面向对象
10.ES6与模块化
#Java#