正则表达式:
语法:
/正则表达式主体/修饰符(可选)
例如: 以/为开头,然后是正则主体,然后是修饰符,其中修饰符是可选项。
var patt = /runoob/i
正则表达式修饰符
修饰符 可以在全局搜索中不区分大小写:
修饰符 | 描述 |
---|---|
i | 执行对大小写不敏感的匹配。 |
g | 执行全局匹配(查找所有匹配而非在找到第一个匹配后停止)。 |
m | 执行多行匹配。 |
在本节课中: var classes = (value || “”).match(/\S+/g); \S表示非空字符,执行全局匹配。
注意,如果上句中的value不是字符串(如object),则会引发异常。
addClass在jQuery中的实现:
jQuery.fn.extend({
// eg: value: "item ret"
addClass: function(value) {
var len = this.length;
var i = 0, elem, cur, j = 0, clazz;
var classes; // (value || "").match(/\S+/g):如果value 为 object,会报错!!!
var proceed = typeof value === "string" && value;
if(proceed) {
classes = (value || "").match(/\S+/g) || []; //正则,或者字符串切割也可以
for(; i < len; i++) {
elem = this[i];
// eg: className 为box
cur = (elem.nodeType === 1 && elem.className) ? (" " + elem.className + " ") : " ";
if(cur) {
while(clazz = classes[j++]) {
if(cur.indexOf(" " + clazz + " ") < 0)
cur = cur + clazz + " ";
}
// 去掉多余空格
elem.className = cur.trim();
}
}
}
}
});
由一道面试题目引起的思考:
([][[]]+[])[+!![]]+([]+{})[!+[]+!![]]
看到这个真的挺无语的,好奇在什么样的场景下需要这样写?
先来看一下拆箱和装箱:
下面的Code会报错: Uncaught SyntaxError: Invalid or unexpected token
1.toString()
token: 规定语言语义的最小单元。
- 词法分析, 语法分析,语义分析,代码生成
数字直接量: 支持 2进制,10进制,8进制,16进制。
十进制:小数点前后可以省略,但是不能同时省略。
比如:
1. => 1
.234 => 0.234
所以,编译器会把 1. 会被识别成 1,也就是 1toString,所以报错。(. 会被识别为小数点,而不是对象的.)
解决办法:
1 .toString()
(1).toString()
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 “]“.