void 运算符
通常只用于获取 undefined的原始值
void 运算符 对给定的表达式进行求值,然后返回 undefined。
为什么用 void 0
替代 undefined ?
引用自: http://web.jobbole.com/86145/
undefined 并不是保留词(reserved word),它只是全局对象的一个属性,在低版本 IE 中能被重写。
undefined 在 ES5 中已经是全局对象的一个只读(read-only)属性了,它不能被重写。但是在局部作用域(闭包)中,还是可以被重写的。用 void 0 代替 undefined 能节省不少字节的大小,事实上,不少 JavaScript 压缩工具在压缩过程中,正是将 undefined 用 void 0 代替掉了。其实 0 也可以是1,2等任任意表达式,只不过是因为 0 简单,所以使用void 0。
replace方法:
replace() 方法执行的是查找并替换的操作
str.replace(regexp|substr, newSubStr|function)
如果第二个参数是字符串,那么可以使用特殊变量:
var str = "John Smith";
var newstr = str.replace(/(\w+)\s(\w+)/, "$2 $1");
console.log(newstr); // Smith John
(\w:匹配数字,大写字母,小写字母,下划线);
(\s:匹配空格)
$& : 插入匹配的子串。
$n : 假如第一个参数是 RegExp对象,并且 n 是个小于100的非负整数,那么插入第 n 个括号匹配的字符串。
第二个参数是函数的时候:
如果第一个参数是正则表达式, 并且其为全局匹配模式, 那么这个方法将被多次调用, 每次匹配都会被调用。
“2aa-3bbc-4cdaa-“.replace(/(\d)(\D+)(-)/g,function(){
for (var i = 0, len = arguments.length; i < len; i++)
{
console.log(‘第’ + i + “个参数是” + arguments[i])
}
})
效果图片:
每全局匹配到一个子串,函数参数就会多3个。
函数参数:
match: 匹配的子串
p1,p2, : 假如replace()方法的第一个参数是一个RegExp 对象,则代表第n个括号匹配的字符串。
offset :匹配到的子字符串在原字符串中的偏移量。
题:(来自牛客网)
获取 url 中的参数
1. 指定参数名称,返回该参数的值 或者 空字符串
2. 不指定 (if) 参数名称,返回全部的参数对象 或者 {}
3. 如果 (if) 存在多个同名参数,则返回数组
思路:遍历 url 参数和参数的值,将参数名
作为 键名
, 参数值
作为键值
存在一个对象中,然后根据传递的参数名返回对应的值。
//摘录自牛客
function getUrlParam(sUrl,sKey){
var result = {};
//目的不在替换字符串中的值,而是利用匹配到的值来填充的对象中
sUrl.replace(/\??(\w+)=(\w+)&?/g,function(a,k,v){
if(result[k] !== void 0){
var t = result[k];
result[k] = [].concat(t,v);
}else{
result[k] = v;
}
});
if(sKey === void 0){
return result;
}else{
return result[sKey] || '';
}
}
concat()方法:参数既可以是数组,也可以是一个字符串,数字等任意类型。
题:
时间的格式化输出
格式说明
对于 2014.09.05 13:14:20
yyyy: 年份,2014
yy: 年份,14
MM: 月份,补满两位,09
M: 月份, 9
dd: 日期,补满两位,05
d: 日期, 5
HH: 24制小时,补满两位,13
H: 24制小时,13
hh: 12制小时,补满两位,01
h: 12制小时,1
mm: 分钟,补满两位,14
m: 分钟,14
ss: 秒,补满两位,20
s: 秒,20
w: 星期,为 [‘日’, ‘一’, ‘二’, ‘三’, ‘四’, ‘五’, ‘六’] 中的某一个,本 demo 结果为 五
思路:匹配到给定格式中的部分,然后通过replace方法进行替换,最后进行返回。
链接:https://www.nowcoder.com/questionTerminal/a789783e7c984f10a0bf649f6d4e2d59
来源:牛客网
function formatDate(t,str){
var obj = {
yyyy:t.getFullYear(),
yy:(""+ t.getFullYear()).slice(-2),
M:t.getMonth()+1,
MM:("0"+ (t.getMonth()+1)).slice(-2),
d:t.getDate(),
dd:("0" + t.getDate()).slice(-2),
H:t.getHours(),
HH:("0" + t.getHours()).slice(-2),
h:t.getHours() % 12,
hh:("0"+t.getHours() % 12).slice(-2),
m:t.getMinutes(),
mm:("0" + t.getMinutes()).slice(-2),
s:t.getSeconds(),
ss:("0" + t.getSeconds()).slice(-2),
w:['日', '一', '二', '三', '四', '五', '六'][t.getDay()]
};
return str.replace(/([a-z]+)/ig,function(\$1){return obj[\$1]});
}
题:字符串中字符的统计:
统计字符串中每个字符的出现频率,返回一个 Object。
思路:先声明一个空对象,然后在向空对象中添加数据。
方法一:for 循环遍历字符串
var res = {};
for (var i = 0; i < str.length; i++) {
res[str[i]] ? res[str[i]]++ : res[str[i]] = 1;
}
return res;
方法二:replace() 遍历字符串(使用箭头函数一行代码搞定)
var res = {};
str.replace(/\S/g, (a) => res[a] ? res[a]++ : res[a] = 1)
console.log(res);
// \S: 匹配所有的非空字符
// replace() 可以相当于数组的forEach方法使用。
反向引用:
查找文本中两个相同的相邻单词
var str = "Is is the cost of of gasoline going up up";
var patt1 = /\b([a-z]+) \1\b/ig;
str.replace(patt1, function(a){
console.log(a);
});
//Is is
//of of
//up up
// \b:匹配单词的边界的
非获取匹配: ?! ?: ?= 匹配到的值不会进行缓存
?: 正向肯定查找
var con = document.getElementsByName('content')[0].value;
var reg = /\b[\w]+(?=ing\b)/g;
//匹配带ing的单词,但是不要ing。注意:如果ing后不加\b,类似于goingabc也会匹配。
?!: 正向否定查找 (?!^): 不匹配开头
所谓正向否定查找,就是预先判断不为某个值。
var con = document.getElementsByName('content')[0].value;
var reg = /\bwin(?!95\b)/g;//
题:
function cssStyle2DomStyle(sName) {
return sName.replace(/(?!^)\-(\w)(\w+)/g, function(a, b, c){
return b.toUpperCase() + c.toLowerCase();
}).replace(/^\-/, '');
}
// (\w+) :为了确保一个单词中除了开头没有其他的大写字母,所以需要匹配到- 后面所有的字符,然后把第一个大写,其余的小写。
// (?!^): 不去匹配开头
HTML5: 嵌入自定义的数据
data-* 属性赋予我们在所有 HTML 元素上嵌入自定义 data 属性的能力。属性名不应该包含任何大写字母
存储的(自定义)数据能够被页面的 JavaScript 中利用
用户代理会完全忽略前缀为 “data-” 的自定义属性