读书笔记之JavaScript语言精粹

来源:互联网 发布:淘宝联盟免单在哪里看 编辑:程序博客网 时间:2024/06/04 21:30

这两天在看《JavaScript语言精粹》,记录下其中的一些容易混淆的,容易出错的知识。由于个人水平有限,记录的知识如果太简单了希望高人高抬贵手,如果有什么不对地方希望大家能帮忙指出,谢谢!

 

2、数字:

a)      JavaScript只有一个单一的数字类型。它在内部被表示为64位的浮点数,没有分离书整数类型,所以11.0是相同的值。

b)     NaN是一个数值,它表示一个不能产生正常结果的运算结果。NaN不等于任何值,包括它自己。

c)      Infinity表示所有大于1.79769313486231570e+308的值

 

3、字符串是不可变的。一旦字符串被创建,就永远无法改变它。但通过+运算符去连接其他的字符串从而得到一个新字符串是很容易的。两个包含着完全相同的字符且字符顺序也相同的字符串被人为是相同的字符串。所以”c” +”a” + “t”’ ===”cat”’true

 

4、下面列出的值被当做假

false, null, undefined, 空字符串” ”, 数字0, 数字NaN,其他所有的值都被当做真。

 

5JavaScript的简单类型包括数字、字符串、布尔值(true false)null值和undefined值。其他所有的值都是对象。数字、字符串和布尔值“貌似”对象,因为它们拥有方法,它们是不可变的。JavaScript中的对象是可变的键控集合(keyed collections)

 

6、对象

       a)对象字面量提供了一种非常方便地创建新对象值的表示方法。一个对象字面量就是包围在一对花括号中的零个或多个“名/值”对。

       b)要检索对象中包含的值,可以采用在[]后缀中括住一个字符串表达式的方式。如果字符串表达式是一个常数,而且它是一个合法的JavaScript标识符而并非保留字,那么可以用.表示法代替。优先考虑使用.表示法,因为它更紧凑且可读性更好。

       c)对象通过引用来传递。它们永远不会被拷贝。

       d)每个对象都连接到一个原型对象,并且它可以从中继承属性。所有通过对象字面量创建的对象都连接到Object.prototype这个JavaScript中标准的对象。原型连接只有在检索值的时候才被用到。如果我们尝试去获取对象的某个属性值,且该对象没有此属性名,那么JavaScript会试着从原型对象中获取属性值。如果那个原型对象也没有该属性,那么再从它的原型对象中寻找,以此类推,知道该过程最后到达终点Object.prototype。如果想要的属性完全不在于原型链中,那么结果就是undefined值。这个过程称为委托。原型关系是一种动态的关系。如果我们添加一个新的属性到原型中,该属性会立即对所有基于该原型创建的对象可见。

       e)反射:检查对象并确定对象有什么属性是很容易的事情,只要试着去检索该属性并验证取得的值。typeof操作符产生的结果有 ’number’’string’ ’boolean’’undefined’’function’’object’。请务必注意:原型链中的任何属性也会产生一个值。有两个方法处理这些不需要的属性。第一个是让你的程序检查并剔除函数值。一般来说做反射的目标是数据,因此你应该意识到一些值可能会是函数。另一个方法是使用hasOwnProperty方法,如果对象拥有独有的属性,它将返回truehasOwnProperty方法不会检查原型链

       f)for in :用来遍历一个对象中的所有属性名,包括原型中的属性,可以用hasOwnPropery方法或者typeof来排除函数。注意:循环出现的顺序不确定。

       g)delete:可以用来删除对象的属性。它将会移除对象中确定包含的属性,它不会触及原型链中的任何对象。删除对象的属性可能会让来自原型链中的属性浮现出来。

       h)减少全局变量污染:最小化使用全局变量的一个方法是在你的应用中只创建一个全局变量,该变量此时变成了你的应用容器。另一个有效的方法是使用闭包来进行信息隐藏,后面讨论。

7 函数

       a)函数对象:在JavaScript中函数就是对象,所以它们可以像任何其他的值一样被使用。函数可以存放在变量,对象和数组中,函数可以被当做参数传递给其他函数,函数也可以再返回函数,而且,因为函数是对象,所以函数可以拥有方法。

       b)函数字面量包括四个部分:i:保留字functionii:函数名;iii:包围在圆括号中的一组参数;iv:包围在花括号中的一组语句。通过函数字面量创建的函数对象包含一个连到外部上下文的连接,这杯称为闭包,它是JavaScript强大表现力的根基。

       c)JavaScript中一共有四种调用模式:方法调用模式、函数调用模式、构造器调用模式和apply调用模式。

              i:方法调用模式:当一个函数被保存为对象的一个属性时,我们称它为一个方法。当一个方法被调用时,this被绑定到该对象。

              ii:函数调用模式:当一个函数并非一个对象的属性时,那么它被当做一个函数来调用,此时,this被绑定到全局对象。这是语言设计上的一个错误。倘若语言设计正确,当内部函数被调用时,this应该仍然绑定到外部函数的this变量。这个设计错误的后果是方法不能利用内部函数来帮助它工作,因为内部函数的this被绑定了错误的值,所以不能共享该方法对对象的访问权。幸运的是,有一个很容易的解决方案:如果该方法定义了一个变量并给它赋值为this,那么内部函数就可以通过那个变量访问到this

              iii:构造器调用模式:结合new前缀调用的函数被称为构造器函数

              ivApply调用模式:apply方法让我们构建一个参数数组并用其去调用函数。它允许我们选择this的值。apply方法接受两个参数。第一个是将被绑定给this的值。第二个就是一个参数数组。

       d)参数:当函数被调用时,会得到一个“免费”的参数,就是arguments数组。通过它函数可以访问所有它被调用时传递给它的参数列表,包括那些没有被分配给函数声明时定义的形式参数的多余参数。arguments并不是一个真正的数组,它只是一个“类似数组(array-like)”的对象。arguments拥有一个length属性,但它缺少所有的数组方法。

       e)异常:exception对象包含可识别异常类型的name属性和一个描述性的message属性。

       f)给类型增加方法:

  

比如给字符串增加一个移除字符串末端空白的方法:

g)递归:JavaScript当前并没有提供尾递归优化,深度递归的函数可能会因为返回堆栈溢出而运行失败。

h)作用域:JavaScript定义在函数中的参数和变量在函数外部是不可见的,而且在一个函数中的任何位置定义的变量在该函数中的任何地方都是可见的。很多现代语言都推荐可能迟地声明变量。而用在JavaScript上的话却成为糟糕的建议,以为它缺少块级作用域。所以,最好的做法是在函数体的顶部声明函数中可能用到的所有变量。

i)闭包:

  

这个quo函数被设计成无须在前面加上new来使用,所以名字也没有首字母大写。当我们调用quo时,它返回包含get_status方法的一个新对象。该对象的一个引用保存在myQuo中。即使quo已经返回了,但get_status方法仍然享有访问quo对象的status属性的特权。get_status方法并不是访问该参数的一个拷贝,它访问的就是该参数本身。这是可能的,因为该函数可以访问它被创建时所处的上下文环境。这称为闭包。

j)模块:模块是一个提供接口却隐藏状态与实现的函数或对象。通过使用函数去产生模块,我们几乎可以完全摒弃全局变量的使用。模块模式的一般形式是:一个定义了私有变量和函数的函数;利用闭包创建可以访问私有变量和函数的特权函数;最后返回这个特权函数,或者把它们保存到一个可访问到的地方。注意:模块模式通常结合单利模式使用。

k)级联:有一些方法没有返回值,如果我们让这些方法返回this而不是undefined,就可以启用级联。在一个级联中,我们可以在单独一条的语句中依次调用同一个对象的很多方法。如:getElement(“myBoxDiv”).move(35, 10).width(150).height(100).color(“red”);

l:记忆:函数可以用对象去记住先前操作的结果,从而能避免无谓的运算。这种优化被称为记忆。JavaScript的对象和数组要实现这种优化是非常方便的。如下面的例子:计算Fibonacci数列(特点:前面相邻两项之和等于后一项的值)。

优化前:

  

fibonacci函数被调用了453次,我们调用了11此,而它自身调用了442次去计算可能已被刚计算过的值。

优化后:

 优化后只被调用了29次,我们调用了11次,它自身调用了18次去取得之前存储的结果。

 

原创粉丝点击