void 运算符 | replace方法
来源:互联网 发布:视频监控网络服务器 编辑:程序博客网 时间:2024/06/05 14:13
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-” 的自定义属性