> For the complete documentation index, see [llms.txt](https://note.niefee.com/llms.txt). Markdown versions of documentation pages are available by appending `.md` to page URLs; this page is available as [Markdown](https://note.niefee.com/summary/5/2016-nian-5-yue-9-ri.md).

# 2016年5月9日

\[TOC]

## 2016年5月9日

### javascript

#### 对象的属性模型

* Object.getOwnPropertyDescriptor()

在JavaScript内部，每个属性都有一个对应的attributes对象，保存该属性的一些元信息。

```javascript
var o = { p: 'a' };

Object.getOwnPropertyDescriptor(o, 'p')
// Object { value: "a",
//   writable: true,
//   enumerable: true,
//   configurable: true
// }
```

上面代码表示，使用Object.getOwnPropertyDescriptor方法，读取o对象的p属性的attributes对象。

attributes对象包含如下元信息:

* value：表示该属性的值，默认为undefined。
* writable：表示该属性的值（value）是否可以改变，默认为true。
* enumerable：表示该属性是否可枚举，默认为true。如果设为false，会使得某些操作（比如for... - in循环、Object.keys()）跳过该属性。
* configurable：表示“可配置性”，默认为true。如果设为false，将阻止某些操作改写该属 - 性，比如，无法删除该属性，也不得改变该属性的attributes对象（value属性除外），也 - 就是说，configurable属性控制了attributes对象的可写性。
* get：表示该属性的取值函数（getter），默认为undefined。
* set：表示该属性的存值函数（setter），默认为undefined。
* Object.defineProperty()，Object.defineProperties()

**Object.defineProperty**方法允许通过定义attributes对象，来定义或修改一个属性，然后返回修改后的对象。

```
Object.defineProperty(object, propertyName, attributesObject)
```

#### 正则表达式

**新建**

```javascript
var regex = /xyz/;

var regex = new RegExp('xyz');
```

第一种方法在编译时新建正则表达式，第二种方法在运行时新建正则表达式。

* 修饰符属性
* ignoreCase：返回一个布尔值，表示是否设置了i修饰符，该属性只读。
* global：返回一个布尔值，表示是否设置了g修饰符，该属性只读。
* multiline：返回一个布尔值，表示是否设置了m修饰符，该属性只读。

```javascript
var r = /abc/igm;

r.ignoreCase // true
r.global // true
r.multiline // true
```

* 与修饰符无关的属性
* lastIndex：返回下一次开始搜索的位置。该属性可读写，但是只在设置了g修饰符时有意义。
* source：返回正则表达式的字符串形式（不包括反斜杠），该属性只读。&#x20;

```javascript
var r = /abc/igm;

r.lastIndex // 0
r.source // "abc"
```

* test()

正则对象的test方法返回一个布尔值，表示当前模式是否能匹配参数字符串。

```
/cat/.test('cats and dogs') // true
```

* exec()

正则对象的exec方法，可以返回匹配结果。如果发现匹配，就返回一个数组，每个匹配成功的子字符串，就是数组成员，否则返回null。

```javascript
var s = '_x_x';
var r1 = /x/;
var r2 = /y/;

r1.exec(s) // ["x"]
r2.exec(s) // null
```

* 字符串对象的方法

1. match()：返回一个数组，成员是所有匹配的子字符串。
2. search()：按照给定的正则表达式进行搜索，返回一个整数，表示匹配开始的位置。
3. replace()：按照给定的正则表达式进行替换，返回替换后的字符串。
4. split()：按照给定规则进行字符串分割，返回一个数组，包含分割后的各个成员。
   * 字面量字符和元字符

**（1）点字符（.）**

点字符（.）匹配除回车（\r）、换行(\n) 、行分隔符（\u2028）和段分隔符（\u2029）以外的所有字符。

```
/c.t/
```

上面代码中，c.t匹配c和t之间包含任意一个字符的情况，只要这三个字符在同一行，比如cat、c2t、c-t等等，但是不匹配coot。

**（2）位置字符**

* ^ 表示字符串的开始位置
* $ 表示字符串的结束位置

```javascript
// test必须出现在开始位置
/^test/.test('test123') // true

// test必须出现在结束位置
/test$/.test('new test') // true

// 从开始位置到结束位置只有test
/^test$/.test('test') // true
/^test$/.test('test test') // false
```

**（3）选择符（/）**

* 重复类

使用大括号（{}）表示。{n}表示恰好重复n次，{n,}表示至少重复n次，{n,m}表示重复不少于n次，不多于m次。

```
/lo{2}k/.test('look') // true
/lo{2, 5}k/.test('looook') // true
```

* 量词符
  * ? 问号表示某个模式出现0次或1次，等同于{0, 1}。
  * * 星号表示某个模式出现0次或多次，等同于{0,}。
  * * 加号表示某个模式出现1次或多次，等同于{1,}。

```javascript
// t出现0次或1次
/t?est/.test('test') // true
/t?est/.test('est') // true

// t出现1次或多次
/t+est/.test('test') // true
/t+est/.test('ttest') // true
/t+est/.test('est') // false

// t出现0次或多次
/t*est/.test('test') // true
/t*est/.test('ttest') // true
/t*est/.test('tttest') // true
/t*est/.test('est') // true
```

* 贪婪模式

上一小节的三个量词符，默认情况下都是最大可能匹配，即匹配直到下一个字符不满足匹配规则为止。

```
var s = 'aaa';
s.match(/a+/) // ["aaa"] 
```

* 字符类

字符类（class）表示有一系列字符可供选择，只要匹配其中一个就可以了。

```javascript
    /[abc]/.test('hello world') // false
    /[abc]/.test('apple') // true
```

**（1）脱字符（^）**

如果方括号内的第一个字符是\[ ^ ]，则表示除了字符类之中的字符。

```
/[^abc]/.test('hello world') // true
```

**（2）连字符（-）**

\[abc]可以写成\[a-c]，\[0123456789]可以写成\[0-9]，同理\[A-Z]表示26个大写字母。

```
/a-z/.test('b') // false
```

连字符还可以用来指定Unicode字符的范围。

```javascript
var str = "\u0130\u0131\u0132";
/[\u0128-\uFFFF]/.test(str)
// true
```

* 转义符

^、.、\[、$、(、)、|、\*、+、?、{和\。

* 预定义模式
  * \d 匹配0-9之间的任一数字，相当于\[0-9]。
  * \D 匹配所有0-9以外的字符，相当于\[^0-9]。
  * \w 匹配任意的字母、数字和下划线，相当于\[A-Za-z0-9\_]。
  * \W 除所有字母、数字和下划线以外的字符，相当于\[^A-Za-z0-9\_]。
  * \s 匹配空格（包括制表符、空格符、断行符等），相等于\[\t\r\n\v\f]。
  * \S 匹配非空格的字符，相当于\[^\t\r\n\v\f ]。
  * \b 匹配词的边界。
  * \B 匹配非词边界，即在词的内部。
* 特殊字符
  * \cX 表示Ctrl-\[X]，其中的X是A-Z之中任一个英文字母，用来匹配控制字符。
  * \[\b] 匹配退格键(U+0008)，不要与\b混淆。
  * \n 匹配换行键。
  * \r 匹配回车键。
  * \t 匹配制表符tab（U+0009）。
  * \v 匹配垂直制表符（U+000B）。
  * \f 匹配换页符（U+000C）。
  * \0 匹配null字符（U+0000）。
  * \xhh 匹配一个以两位十六进制数表示的字符。
  * \uhhhh 匹配一个以四位十六进制数表示的unicode字符。
