正则表达式:

语法:

/正则表达式主体/修饰符(可选)

例如: 以/为开头,然后是正则主体,然后是修饰符,其中修饰符是可选项。

  1. var patt = /runoob/i

正则表达式修饰符

修饰符 可以在全局搜索中不区分大小写:

修饰符 描述
i 执行对大小写不敏感的匹配。
g 执行全局匹配(查找所有匹配而非在找到第一个匹配后停止)。
m 执行多行匹配。

在本节课中: var classes = (value || “”).match(/\S+/g); \S表示非空字符,执行全局匹配。
注意,如果上句中的value不是字符串(如object),则会引发异常。

addClass在jQuery中的实现:

  1. jQuery.fn.extend({
  2. // eg: value: "item ret"
  3. addClass: function(value) {
  4. var len = this.length;
  5. var i = 0, elem, cur, j = 0, clazz;
  6. var classes; // (value || "").match(/\S+/g):如果value 为 object,会报错!!!
  7. var proceed = typeof value === "string" && value;
  8. if(proceed) {
  9. classes = (value || "").match(/\S+/g) || []; //正则,或者字符串切割也可以
  10. for(; i < len; i++) {
  11. elem = this[i];
  12. // eg: className 为box
  13. cur = (elem.nodeType === 1 && elem.className) ? (" " + elem.className + " ") : " ";
  14. if(cur) {
  15. while(clazz = classes[j++]) {
  16. if(cur.indexOf(" " + clazz + " ") < 0)
  17. cur = cur + clazz + " ";
  18. }
  19. // 去掉多余空格
  20. elem.className = cur.trim();
  21. }
  22. }
  23. }
  24. }
  25. });

由一道面试题目引起的思考:
([][[]]+[])[+!![]]+([]+{})[!+[]+!![]]

看到这个真的挺无语的,好奇在什么样的场景下需要这样写?

先来看一下拆箱和装箱:

下面的Code会报错: Uncaught SyntaxError: Invalid or unexpected token

  1. 1.toString()

token: 规定语言语义的最小单元。

  1. 词法分析, 语法分析,语义分析,代码生成

数字直接量: 支持 2进制,10进制,8进制,16进制。
十进制:小数点前后可以省略,但是不能同时省略。
比如:
1. => 1
.234 => 0.234

所以,编译器会把 1. 会被识别成 1,也就是 1toString,所以报错。(. 会被识别为小数点,而不是对象的.)
解决办法:

  1. 1 .toString()
  2. (1).toString()
  3. 1..toString()

在例子中1位基本数据类型,怎么会有对象的toString方法啊?
在JS中,基本类型string,number, boolean,有对应的对象类型: String,Number, Boolean,可以通过new Number() 去创建一个对象。

. 运算符提供了装箱操作。1..toString() 会根据基本类型Number调用构造函数new Number(1)生成一个临时对象 ,然后调用这个对象的toString方法,这个过程就是装箱操作。

装箱操作:基本类型转对象类型。
拆箱操作:对象类型转基本类型。

以下表达式为拆箱操作:

表达式 输出
[] “”
{} “[object Object]”
[]+[] “”
{} + {} “[object Object][object Object]”
[]+{} “[object Object]”
{}+[] 0 {}会被解析成代码块,不参与运算

[]和{}都要先转成基本类型,然后再参与运算。
对象类型 =》 基本类型:
先会调用valueOf(), 检测返回值是不是基本类型,如果是基本类型则停止;如果不是基本类型的值,再调用toString(),再次检查返回值,如果是则进行后续运算,如果还不是,则报异常。

[].valueOf() 返回一个空数组对象;({}).valueOf() 返回一个空对象。

!!运算符 用来将后面的表达式强制转换为布尔类型的数据,也就是只能是true或false。

Note:

toString()详解
ECMA 5.1 中关于该方法的描述是这样的:

When the toString method is called, the following steps are taken:If the this value is undefined, return “[object Undefined]“.If the this value is null, return “[object Null]“.Let O be the result of calling ToObject passing the this value as the argument.Let class be the value of the [[Class]] internal property of O.Return the String value that is the result of concatenating the three Strings “[object “, class, and “]“.