Javascript权威指南看书笔记(二)

时间:2022-08-27 08:23:05

——–第一遍刷javascript权威指南,上次的看书笔记看的是书上的前
四章(书上第一章是概述),这两个礼拜又看了几章,既是复习又是总结,
码一下最近的看书笔记。但像闭包等一些知识点感觉自己理解的不够,
之后有自己的理解的再总结吧。


第五章 语句

  • 如果有特殊目的,需要使用空语句,最好在代码中添加注释,可清楚说明这条语句是有用的。

  • 函数定义的两种写法

    var f=function(x)
    {

    return x+1;
    }//表达式赋值给一个变量
    function f(x)
    {

    return x+1;
    }//含有变量名的语句
    • 两者区别:
      使用var的话只有变量声明提前,变量初始化代码仍在原位置,使用函数声明语句,函数名称和函数体均提前。
  • switch语句的case操作实际上是“===”,因此不会做任何类型转换

  • switch语句中可用return代替break

  • “default:”标签可以放在switch内任何地方

  • 死循环:while(true);for(;;);

  • for/in循环可以枚举对象属性和数组索引

  • for/in循环只能遍历到“可枚举”的属性

  • return语句可以单独使用而不必带expression,函数返回undefined

  • 严格模式与非严格模式的重要区别
    1.严格模式中禁止使用with语句
    2.严格模式下,所有变量都要先声明
    3.严格模式下调用函数中(不是方法)的this值是undefined,非严格模式中函数中的this值是全局对象

第六章 对象

  • 创建对象方法,es5定义了一个名为Object.create()的方法,他创建一个新对
    象,其中第一个参数是这个对象的原型。

  • 通过(.)和([ ])运算符来获取属性的值,对于(.)来说,右侧必须是一个以属性名称命名的简单标识符。对于([ ])来说,方括号内必须是一个计算结果为字符串的表达式(使用“ ”)

  • 在javascript中,只有在查询属性时才会体会到继承的存在,而设置属性则和集成无关

  • 查询一个不存在的属性并不会报错,返回undefined;查询不存在的对象的属性时会报错(null和undefined值都没有属性)

  • delete运算符只能删除自有属性,不能删除继承属性

  • delete不能删除可配置性为false的属性,(比如通过var声明的全局对象的属性),非严格模式会返回false

  • 检测属性可使用in运算符,或使用“!==”判断一个属性是否为undefined;但in可以区分不存在的属性和存在但值为undefined的属性

第七章 数组

  • 数组直接量的语法(“[]”)允许有可选的结尾的逗号,故[,,]只有两个元素(undefined)而非三个

  • 可使用构造函数array创建数组,

var a=new Array();
var a=new Array(10);//一个数值参数指定长度
var a=new Array(5,4,3,2,1,"testing,testing");//显式指定两个或多个数组元素获知数组的一个非数值元素
  • 数组是对象的特殊形式,javascript将制定的数字索引值转换成字符串——1变成”1”——将其当作属性名来使用

  • 数组的特别之处就在于当使用小于2^32的非负整数作为属性名时数组会自动维护其length属性值

  • 所有的索引都是属性名,但只有在0~2^32-2之间的整数属性名才是索引,如果使用的属性是数组的索引,数组就会根据需要更新length

  • 数组索引仅仅是对象属性名的一种特殊类型,这意味着javascript数组没有”越界”错误的概念

  • 添加数组元素时可以使用push()方法在数组末尾增加一个或多个元素,和给a[a.length]赋值是一样的

  • 使用delete不会修改数组的length属性,会变成稀疏数组

  • javascript不支持真正的多维数组,但可以用数组的数组来近似

  • Array.join()方法将所有元素转化为字符串并连接在一起,返回最后生成的字符串,是String.split ()方法的逆向操作(将字符串分割成若干块来创建一个数组)

  • 字符串的行为类似于只读数组,可以用charAt()方法和[]来访问单个字符

第八章 函数

  • 函数声明语句被提前到外部脚本或外部函数作用域的顶部,所以可以在它定义之前出现的代码所调用;表达式定义的函数赋值给一个变量,变量的声明提前但赋值没有,所以在定义之前无法调用

  • 函数声明语句并非真正的语句,它可以出现在全局代码里,或内嵌在其他函数中,但它不能出现在循环,条件判断,或者try/cache/finally以及with语句中,但函数的定义表达式可以出现在javascript代码的任何地方

  • 关键字this没有作用域限制,嵌套函数不会从调用它的函数中继承this。嵌套函数作为方法调用时,this值指向调用它的对象。嵌套函数作为函数调用时,非严格模式下this是全局对象,严格模式下是undefined

  • javascript的”函数重载”,标识符arguments是指向实参对象的引用,实参对象是一个类数组对象,可以通过数字下标访问传入函数的实参值,而并不一定通过名字得到实参

  • javascript中无法声明只在一个代码块内可见的变量,因此,常定义一个函数用做临时的命名空间。(直接定义一个匿名函数并在单个表达式中调用它)

(function(){
//code
}());