接触JavaScript两年多遇到过各种错误,其中有一些让人防不胜防,原来对JavaScript的误会如此之深,仅以此文总结一下常见的各种想当然的误区。
String replace
string的replace方法我们经常用,替换string中的某些字符,语法像这样子
1 |
string.replace(subStr/reg,replaceStr/function) |
第一个参数是要查找的字符串或者一个正则表达式,第二个参数是想替换成的字符串或一个方法,我们可以这么使用
1 |
"I'm Byron".replace("B","b") // I'm byron |
记过和我们想得一样,但是
1 |
"I'm a student, and you?".replace("n","N"); // I'm a studeNt, and you? |
和我们预期的不一样,第二个‘n’没有被替换。字符串的 replace 方法如果第一个参数传入字符串,那么只有第一个匹配项会被替换。如果要替换全部匹配项,需要传入一个 RegExp 对象并指定其 global 属性。
1 |
"I'm a student, and you?".replace(/n/g,"N"); // I'm a studeNt, aNd you? |
这样才可以达到我们目的,关于string replace方法详细使用可以看看JavaScript string 的replace
Date 对象
我们可以这样构造一个Date对象
1 2 3 4 |
new Date() //Date {Fri Aug 02 2013 16:50:33 GMT+0800 (China Standard Time)} new Date(milliseconds) //Date {Fri Aug 02 2013 16:53:26 GMT+0800 (China Standard Time)} new Date("2013/08/02") //Date {Fri Aug 02 2013 00:00:00 GMT+0800 (China Standard Time)} new Date(year,month,day,hours,minutes,seconds,ms) |
前三种方式没有什么问题,但第四种得到的结果回合我们预期的不一致
1 |
new Date(2013,08,02) //Date {Mon Sep 02 2013 00:00:00 GMT+0800 (China Standard Time)} |
我们可以看到,传入的月份是08,返回的结果却是九月。这是因为Date对象的月份是从0开始计数的(天却不是),即0代表一月,1代表二月…11代表12月。在调用Date实例的getMonth方法时尤其要注意
1 2 |
var d = new Date(2012, 4, 15); // 2012年5月15日 alert(d.getMonth()); // 结果为4 |
Date.parse
Date.parse方法可以识别两种格式的字符串参数(标准的长日期格式,比如带星期的那种,也可以识别,不过不常用):
1. “M/d/yyyy”: 美国的日期显示格式。如果年传入2位则作为 19xx 处理
2.”yyyy-MM-dd” 或 “yyyy/MM/dd”: 注意月和日都必须是两位
Date.parse 的返回结果不是一个Date对象,而是从1970-01-01午夜(GMT)到给定日期之间的毫秒数。可以用Date的构造函数将其转换为Date对象。
1 2 3 |
new Date(Date.parse("8/2/2012")); // 正确识别为2012年8月2日 new Date(Date.parse("2012-08-02")); // 正确识别为2012年8月2日 new Date(Date.parse("2012-8-2")); // 不能识别 |
for…in 遍历数组
for…in用来遍历一个对象中的成员(属性,方法),如果用来遍历数组的到的结果并不是预期中数组每项的值,方法神马的会被遍历出来
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 |
第一个参数是要查找的字符串或者一个正则表达式,第二个参数是想替换成的字符串或一个方法,我们可以这么使用
记过和我们想得一样,但是
和我们预期的不一样,第二个‘n’没有被替换。字符串的 replace 方法如果第一个参数传入字符串,那么只有第一个匹配项会被替换。如果要替换全部匹配项,需要传入一个 RegExp 对象并指定其 global 属性。
这样才可以达到我们目的,关于string replace方法详细使用可以看看JavaScript string 的replace Date 对象我们可以这样构造一个Date对象
前三种方式没有什么问题,但第四种得到的结果回合我们预期的不一致
我们可以看到,传入的月份是08,返回的结果却是九月。这是因为Date对象的月份是从0开始计数的(天却不是),即0代表一月,1代表二月…11代表12月。在调用Date实例的getMonth方法时尤其要注意
Date.parseDate.parse方法可以识别两种格式的字符串参数(标准的长日期格式,比如带星期的那种,也可以识别,不过不常用): 1. “M/d/yyyy”: 美国的日期显示格式。如果年传入2位则作为 19xx 处理 2.”yyyy-MM-dd” 或 “yyyy/MM/dd”: 注意月和日都必须是两位 Date.parse 的返回结果不是一个Date对象,而是从1970-01-01午夜(GMT)到给定日期之间的毫秒数。可以用Date的构造函数将其转换为Date对象。
for…in 遍历数组for…in用来遍历一个对象中的成员(属性,方法),如果用来遍历数组的到的结果并不是预期中数组每项的值,方法神马的会被遍历出来 |