JavaScript-3


变量作用域

  • 变量作用域(生命周期)是指变量的有效范围。作用域分为两种,全局作用域和局部作用域。
  1. 全局作用域: 在当前文档中的任何位置都可以使用。

  2. 局部作用域: 只有在当前代码块中可用。

    • 代码块:使用 { } 包裹的代码。

    作用域链

    当代码在一个环境中执行时,会创建变量对象的一个作用域链(作用域形成的链条)

  3. 作用域链的前端,始终都是当前执行的代码所在环境的变量对象

  4. 作用域链中的下一个对象来自于外部环境,而在下一个变量对象则来自下一个外部环境,一直到全局执行环境

  5. 全局执行环境的变量对象始终都是作用域链上的最后一个对象
    内部环境可以通过作用域链访问所有外部环境,但外部环境不能访问内部环境的任何变量和函数。
    由于变量的查找是沿着作用域链来实现的,所以也称作用域链为变量查找的机制.这个机制也说明了访问局部变量要比访问全局变量更快

var与let/const

let/const ES6声明变量新语法。

  1. let 可以声明局部变量。
  2. let 声明的变量不支持变量提升。
  3. let 声明的变量不允许重复声明。
  4. const 声明常量,常量在声明时必须赋值。一旦赋值不能修改

命名空间

命名空间 namespace:解决程序命名冲突(命名空间污染)的问题。

错误处理

使用try…catch尝试捕获一个错误

try {
    ...    //异常的抛出
} catch(e) {
    ...    //异常的捕获与处理
} finally {
    ...    //结束处理
}
  • try 块中内容为可能出现异常的代码。
  • catch:一旦 try 块中内容出现异常在 catch 块中就可以捕获到该异常。如果没有异常则 catch 块中内容不执行。
  • finally:无论是否出现异常 finally 块中代码都会执行

throw

throw 语句用来抛出一个用户自定义的异常。当前函数的执行将被停止(throw之后的语句将不会执行),并且控制将被传递到调用堆栈中的第一个catch块。如果调用者函数中没有catch块,程序将会终止。

throw "Error2"; // 抛出了一个值为字符串的异常
throw 42;       // 抛出了一个值为整数42的异常
throw true;     // 抛出了一个值为true的异常
throw new Error('这是一个错误'); //抛出一个错误对象

正则表达式

正则表达式: 正则的作用是用来匹配字符串中是否有符合正则表达式中规则的字符串,当然当我们匹配后就可以对字符串进行检索、替换等一系列操作。正则表达式让操作字符串变的更加简单。

获取正则对象

  • var patt=new RegExp(pattern,modifiers);

  • var patt=/pattern/modifiers;

    • pattern: 正则表达式的文本。

    • modifiers:匹配的模式。

    • i: 忽略大小写。

    • g: 全局匹配;找到所有匹配,而不是在第一个匹配后停止。

    • m: 多行匹配。

  • 正则的行首与行尾

    var patt=/^匹配规则$/

    在写正则规则的时候需要注意,如果使用/匹配规则/的写法时,该规则会检索字符中是否包含该规则所匹配的字符串,简单点说只要有符合该规则的字符就能通过验证。而/^匹配规则$/则需要字符串中所有字符都必须符合该规则。

    正则对象中方法:

  • test() 检索给定字符的值是否和正则表达式匹配返回布尔值。

  • exec() 检索字符串中指定的值。返回找到的值,并确定其位置。

    String 字符串对支持正则表达式的方法:

  • search() 字符搜索

  • split() 分割字符串操作

  • replace() 替换匹配到的字符串

  • match() 匹配一个或多个规则

正则表达式 规则

  • 元字符:具有特殊含义的字符。大部分元字符前使用转义字符\。
表达式 描述
. 查找单个字符,除了换行和行结束符。
\w 查找单词字符。
\W 查找非单词字符。
\d 查找数字。
\D 查找非数字字符。
\s 查找空白字符。
\S 查找非空白字符。
\b 匹配单词边界。
\B 匹配非单词边界。
\0 查找 NULL 字符。
\n 查找换行符。
\f 查找换页符。
\r 查找回车符。
\t 查找制表符。
\v 查找垂直制表符。
\xxx 查找以八进制数 xxx 规定的字符。
\xdd 查找以十六进制数 dd 规定的字符。
\uxxxx 查找以十六进制数 xxxx 规定的 Unicode 字符。

* 量词:用来描述匹配字符的数量。

表达式 描述
n+ 匹配任何包含至少一个 n 的字符串。
n* 匹配任何包含零个或多个 n 的字符串。
n? 匹配任何包含零个或一个 n 的字符串。
n{X} 匹配包含 X 个 n 的序列的字符串。
n{X,} X 是一个正整数。前面的模式 n 连续出现至少 X 次时匹配。
n{X,Y} X 和 Y 为正整数。前面的模式 n 连续出现至少 X 次,至多 Y 次时匹配。
n$ 匹配任何结尾为 n 的字符串。
^n 匹配任何开头为 n 的字符串。
?=n 匹配任何其后紧接指定字符串 n 的字符串。
?!n 匹配任何其后没有紧接指定字符串 n 的字符串。
  • 范围:描述匹配范围内字符。
表达式 描述
[abc] 查找方括号之间的任何字符。
[^abc] 查找任何不在方括号之间的字符。
[0-9] 查找任何从 0 至 9 的数字。
[a-z] 查找任何从小写 a 到小写 z 的字符。
[A-Z] 查找任何从大写 A 到大写 Z 的字符。
[A-z] 查找任何从大写 A 到小写 z 的字符。
(red\|blue\|green) 查找任何指定的选项。

正则练习

  • 从一段文本中选出可用的QQ号

    var str = "qq号大全,984033324,1452245123-22q2222ddddd,456123";
    // 匹配所有数字
    var re1 = /\d+/g;
    // 匹配是否是QQ号
    var re2 = /^[1-9]\d{4,10}$/g;
    // 挑出所有的数字
    var arrays = str.match(re1);
    // 检验数字是否是QQ号
    for (var i = 0; i < arrays.length; i++) {
      if (null != arrays[i].match(re2)) {
          alert(arrays[i] + "是QQ号");
      } else {
          alert(arrays[i] + "不是QQ号");
      }
    }
  • 验证邮箱

    var re = /^\w+@[a-z0-9]+\.[a-z]{2,4}$/;
    var email = 'li_chao@126.com.122222222225';
    alert(re.test(email));
  • 去除字符串首尾空格

    var str = "    hello javascript  ";
    var re = /^\s+|\s+$/g;
    alert("(" + str.replace(re,'') + ")");
  • 验证是否包含中文

    中文转Unicode

    • 一 \u4e00
    • 龥 \u9fa5
```js
var str='java中国';
var re  = /[\u4e00-\u9fa5]/;
alert(re.test(str));

- 验证字符串中是否包含指定的单词

  ```js
  var str = 'welcome to,shengzhen!';
  var word = 'to';
  var re = new RegExp("\\b" + word + "\\b",'g');
  alert(re.test(str));