精读《javascript高级程序设计》笔记二——变量、作用域、内存以及引用类型

时间:2023-12-14 17:57:26

变量、作用域和内存问题

  1. 执行环境共有两种类型——全局和局部
  2. 作用域链会加长,有两种情况:try-catch语句的catch块,with语句.
  3. javascript没有块级作用域,即在if,for循环中的变量,在块结束后,并不会被销毁.
  4. 最好能手工断开原生javascript对象与DOM元素之间的连接。

Object类型

  1. 创建Object实例有两种方式:new 操作符后跟Object构造函数即new Object(),对象字面量表示法即用{}表示。
  2. 可使作方括号表示法来访问对象的属性,将要访问的属性以字符串的形式放到方括号内。
  3. 方括号访问对象的属性,可以通过变量来访问

    var propertyName = "name"; alert(person[propertyName]);

    属性名包含会导致语法错误的字符,也可以使用方括号

Array类型

  1. 创建Object实例有两种方式:new 操作符后跟Array构造函数即new Object(),对象字面量表示法即用[]表示。
  2. 与对象相同,调用字面量的方式来创建数组时,不会调用数组的构造函数
  3. 检测数组:value instanceof Array
  4. Array.isArray(value)支持IE9+……
  5. 数组的toString()方法返回数组每个值字符串形式拼接而成的一个以逗号为字符串分隔的字符串;调用valueOf()返回的还是数组
  6. 用push()和pop()来模拟栈方法,用push()和shift()来模拟队列方法
  7. concat()方法,会创建一个副本,将接收到的参数添加到副本的末尾,原数组并没有进行改变
  8. slice()接收一个参数,返回从指定位置至末尾的所有项,如果两个参数,返回指定开始位置至结束位置的项,不包括结束位置。另外slice()方法同样不会影响原数组.
  9. splice()方法
    删除 2个参数 要删除第一项位置,要删除项数,例splice(0,2)
    插入 3+个参数 起始位置,0(要删除项数),要插入的项,例splice(2,0,"red","yellow")
    替换 3+个参数 起始位置,要删除项数,要插入的项,例splice(2,1,"red","yellow")
  10. 迭代方法
    every() 对数组的每一项运行给定函数,如果每一项都返回true,则返回true
    filter() 对数组的每一项运行给定函数,返回该函数会返回true的项组成的数组
    forEach() 对数组的每一项运行给定函数,该函数没有返回值
    map() 对数组的每一项运行给定函数,返回每次调用结果返回的数组
    some() 对数组的每一项运行给定函数,如果该函数对任一项返回true,则返回true

    支持迭代方法需IE9+

  11. 缩小方法values.reduce(function(prev,cur,index,array){});同样需IE 9+

Date类型

  1. UTC创建的时间:var allFives = new Date(Date.UTC(2005,4,5,17,55,55,55)),本来按书中说的,应当是2005年5月5日下午5点55分55秒,但我运行时的时间是2005年5月6日1点55分55秒,原因是我所在的时区为东8区,又加了8时
  2. var allFives = new Date(2005,4,5,17,55,55,55);创建的时间可以得到对应的结果。
  3. Date.now()支持的浏览器为IE9+
  4. 在不支持now()方法的浏览器中,可用如下方法统计两段代码之间所用时间
                	var start = +new Date();
    doSomething……
    var end = +new Date();
    console.log(end-start);
  5. 日期格式化方法
    toDateString() 以特定于现实的时间格式显示星期几、月、日、年
    toTimeString() 以特定于现实的时间格式显示时、分、秒、时区
    toLocaleDateString() 以特定于地区的时间格式显示星期几、月、日、年
    toLocaleTimeString() 以特定于现实的时间格式显示时、分、秒
    toUTCString() 以特定于现实的格式完整的UTC日期

正则表达式

  1. 正则表达式:var expression = /pattern/flags;
  2. flags有三种:g是全局,i表不区分大小写,m表示多行匹配
  3. RegExp实例属性
    global 布尔值,是否设定g标志
    ignoreCase 布尔值,是否设定i标志
    lastIndex 整数,表示开始搜索下一个匹配项的字符位置,从0算起
    multiline 布尔值,是否设定m标志
    source 正则表达式的字符串表示,按照字面量形式而非传入构造函数中的字符模式返回
  4. 正则表达式构造函数属性
    长属性名 短属性名 说明
    input $_ 最近一次要匹配的字符串,Opera未实现
    lastMatch $& 最近一次的匹配项,Opera未实现
    lastParen $+ 最近一次匹配的捕获组,Opera未实现
    leftContext $` input字符串中lastMatch之前的文本
    multiline $* 布尔值,表示是否使用多行模式,IE和Opera都未实现
    rightContext $' input字符串中lastMatch之后的文本
  5. 正则表达式的方法var matches = pattern.exec(text)【返回结果集】和 pattern.test(text)【返回true 、false】。
  6. String类型的text.match(pattern)方法与pattern.exec(text)相同

Function类型

  1. arguments.callee()即调用当前函数,严格模式不支持该方法
  2. this引用的时函数据以执行的函数对象
  3. caller这个函数保存着调用当前函数的引用,如果是在全局变量中调用当前函数,返回为null
  4. 每个函数都包含两个属性:length和prototype,其中length表示希望接收的命名参数的个数

String类型

  1. replace()方法的第二个参数可以是一个函数,在只有一个匹配项的情况下,会传递三个参数:模式的匹配项、模式匹配在字符串中的位置和原始字符串
                	function htmlEscape(text){
    return text.replace(/[<>"&]/g,function(match,pos,originalText){
    switch(match){
    case "<":
    return "<";
    case ">":
    return ">";
    case "&":
    return "&";
    case "\"":
    return """;
    }
    });
    }
  2. 字符串与匹配模式相关的几个方法有:match(),search(),replace(),split()都可以传入正则表达式.

Math对象

  1. 求近似值的方法:ceil(),round(),floor()
  2. 从某个整数范围内随机选择一个值的方法: 值 = Math.floor(Math.random()*可能值的总数+第一个可能值)