摘要:JS开发过程中一些极易落入的陷阱,你中招了没?
1、字符串替换的古怪现象
先来看如下一段代码:
(function() {
var srcStr = 'one OR zero is one',
desStr = '';
desStr = srcStr.replace('one', 'zero');
console.log(srcStr);
console.log(desStr);
}());
如上,结果是什么?
one OR zero is one
zero OR zero is one
你会惊讶的发现:结果不是想象中的'zero OR zero is zero',这是因为String.prototype.replace方法默认只将第一次匹配到的字符串予以替换,而非完全替换所有的匹配结果。
那么怎样才能实现完全替换呢?正则表达式!
desStr = srcStr.replace(/one/g, 'zero');
再看结果:zero OR zero is zero
继续,将源字串修改为句首字母大写形式:var srcStr = 'One OR zero is one',执行上面的代码,
结果:One OR zero is zero
已经完全替换所有匹配结果了,怎么还不行?
可能你已经知道原因了,区分大小写。
继续解决问题,通过/i忽略大小写的差异: desStr = srcStr.replace(/one/gi, 'zero');
再看结果:zero OR zero is zero
2、对象本身还是引用?
var src = [1,2,3];
des = src;
des = [];
此时,src也同样是[]了么?
答案是否定的,这就是著名的"对象传递时实际只是在传递引用",于是乎就有了des被重新赋值为空数组,而其从src处得来的引用指向的对象(数组[1,2,3]),仍然不变。
所以当想清空该数组对象时,需要使用length属性来截断,即操作引用对应对象本身的属性,进而影响该对象。
des.length = 0;