javascript语言-javascript核心实践
2015-09-16 22:50:05 0 举报
AI智能生成
登录查看完整内容
参考书籍《javascript 核心及实践》
作者其他创作
大纲/内容
javascript语言-javascript核心实践
函数式编程语言
与LISP
动态性
在一个 JavaScript 对象中,要为一个属性赋值,我们不必事先创建一个字段,只需要在使用的时候做赋值操作即可
弱类型
数据类型
基本数据类型:字符串(string),数值(number),布尔值(boolean),undefined,null 及对象(object)
对象类型
对象(属性的集合,即键值的散列表),数组(有序的列表),函数(包含可执行的代码)
对象和数组的界限并不那么明显(事实上它们是属于同一类型的),但是他们的行为却非常不同
基本类型与对象间的转换
基本数据类型在做一些运算时,会临时包装一个对象,做完运算后,又自动释放该对象
对象转换为基本类型则是通过这样的方式:通过调用对象的 valueOf()方法来取得对象的值,如果 valueOf 取不到值的话,则需要调用对象的 toString()方法
所有的非空对象,在布尔值环境下,都会被转成 true
类型的判断
typeof、instanceof
基本类型和引用类型
基本类型如数字,布尔值,它们在内存中都有固定的大小,我们通过变量来直接访问基本类型的数据。 而对于引用类型,如对象,数组和函数,由于它们的大小在原则上是不受任何限制的,故我们通过对其引用的访问来访问它们本身
基本类型:var x = 1;//数字x,基本类型var y = x;//数字y,基本类型print(x);print(y);x = 2;//修改x的值print(x);//x的值变为2print(y);//y 的值不会变化
变量的作用域
在函数内 var 关键字是必须的,如果使用了变量而没有写 var 关键字,则默认的操作是对全局对象的
对象与 JSON,JSON 是 JavaScript 中对象的字面量,是对象的表示方法
对象的属性
属性是由键-值对组成的,即属性的名字和属性的值。属性的名字是一个字符串,而值可以为任意的 JavaScript 对象(JavaScript 中的一切皆对象,包括函数)
属性与变量
变量其实就是属性
原型对象及原型链
通过使用原型,JavaScript 可以建立其传统 OO 语言中的继承,从而体现对象的层次关系
this 指针:在 JavaScript 中,this 表示当前上下文,即调用者的引用
,this 的值并非函数如何被声明而确定,而是被函数如何被调用而确定,这一点与传统的面向对象语言截然不同
call 是 Function 内置对象上的一个方法
使用对象
通过 new 操作符作用于 Object 对象,构造一个新的对象,然后动态的添加属性,从无到有的构建一个对象。 定义对象的“类” :原型,然后使用 new 操作符来批量的构建新的对象。 使用 JSON
JSON 的另一个应用场景是:当一个函数拥有多个返回值时,在传统的面向对象语言中,我们需要组织一个对象,然后返回,而 JavaScript 则完全不需要这么麻烦
函数,函数本身也是对象
function p(){ print(\"invoke p by ()\"); }p.id = \"func\";p.type = \"function\";print(p);print(p.id+\":\"+p.type);print(p());没有错,p 虽然引用了一个匿名函数(对象),但是同时又可以拥有属性,完全跟其他对象一样,运行结果如下:function (){print(\"invoke p by ()\");}func:functioninvoke p by ()
函数的参数
你可以将任意多的参数传递给一个函数,即使这个函数声明时并未制定形式参数
子主题
JavaScript 在处理函数的参数时,与其他编译型的语言不一样,解释器传递给函数的是一个类似于数组的内部值,叫 arguments
函数作用域
词法作用域
其作用域为在定义时(词法分析时)就确定下来的,而并非在执行时确定
var str = \"global\";function scopeTest(){print(str);var str = \"local\";print(str);}scopeTest();而正确的结果应该是:undefinedlocal
在词法分析结束后,构造作用域链的时候,会将函数内定义的var 变量放入该链, 因此 str 在整个函数 scopeTest 内都是可见的(从函数体的第一行到最后一行),由于 str 变量本身是未定义的,程序顺序执行
调用对象
函数上下文
通过Function 对象上的 call 或者 apply 函数来修改函数的上下文
高级主题
原型链
JavaScript 对象是一个属性的集合,另外有一个隐式的对象:原型对象。原型的值可以是一个对象或者 null
执行期上下文
执行器上下文的概念贯穿于 JavaScript引擎解释代码的全过程,这个概念是一个运行的概念,执行器上下文一般实现为一个栈。
全局代码(游离于任何函数体之外),函数代码,以及 eval代码(eval接受字符串,并对这个字符串求值,通常来讲,函数式编程都会提供这个函数或者类似的机制)。
全局上下文仅有一个,函数上下文和 eval上下文则可能有多个
函数执行期上下文对象
。每个上下文对象所需要包含的有变量对象,作用域链以及 this
而在函数上下文中,变量对象表现为活动对象
活动对象
作用域链
作用域链与原型链类似,也是一个对象组成的链,用以在上下文中查找标识符(变量,函数等)。查找时也与原型链类似,如果激活对象本身具有该变量,则直接使用变量的值,否则向上层搜索,一次类推,知道查找到或者返回 undefined
this
:this 是一个特殊的对象,与执行期上下文相关,因此可以称之为上下文对象。this 是执行期上下文对象的一个属性
词法作用域
词法作用域(静态作用域)是指,在函数对象的创建时,作用域”[[scope]]”就已经建立,而并非到执行时,因为函数创建后可能永远不会被执行,但是作用域是始终存在的
数组:JavaScript 内置的 Array 也是从 Object 上继承下来的
创建数组
var array = [];
join,连接数组元素为一个字符串:
连接多个数组为一个数组:concat
从数组中取出一定数量的元素,不影响数组本身:slice
闭包
函数内定义函数成为理所当然,如果在函数 func 内部声明函数 inner,然后在函数外部调用 inner,这个过程即产生了一个闭包
闭包的用途
匿名自执行函数
缓存
实现封装
面向对象的 Javascript
原型继承
引用
JavaScript 中的引用始终指向最终的对象,而并非引用本身 83页
封装
原型链上的方法,均为公开的
函数式的javascript
匿名函数
高阶函数
以一个或多个函数为参数的函数称之为高阶函数
闭包与柯里化
柯里化就是预先将函数的某些参数传入,得到一个简单的函数,但是预先传入的参数被保存在闭包中
函数式编程风格
函数式编程的谓词(关系运算符,如大于,小于,等于的判断等),以及运算(如加减乘数等)都会以函数的形式出现
0 条评论
回复 删除
下一页