javascript易错题

来源:互联网 发布:淘宝旺铺智能版好用吗 编辑:程序博客网 时间:2024/06/16 04:36

判断语句变量的自动转化

var x=new Boolean(false);if(x){   //x此时为对象,Boolean(对象)==true  alert("hi");}var y=Boolean(0); //数值0,Boolean(0)==false;if(y){     alert("hello");}

知识点:

   if(flag){}//会先将flag执行转换操作,即if(Boolean(flag))

转换规则:

  • flag为true,非空字符串,任何非零数字值,任何对象。Boolean(flag)结果是true;
  • flag为false,空字符串(“”),0/NaN,null,undefined。Boolean(flag)的结果均为false。

2

var f=function g(){   return 23;}typeof g() //出错,此时g不存在。

类型判断

var str = new String("a");var str1 = "a";typeof str;  //'objecct'str instanceof String; //truetypdof null ;//"object"null instanceof Object ;//false//typeof 返回的数据类型有object number function undefined string boolean

(除了new Funciotn)凡是通过new 出来的对象,typeof运算都是object,最好的判断类型的方法为如下。

var str = new String("a");Object.prototype.toString.call(str);// "[object String]",不管是否是通过new出来的都一样,只要是字符串形式。/**其他类似*数字:"object Number]"*数组:"[object Array]"*布尔:"[object Boolean]"*/var f = new Fucntion();typeof f //"function"//但function f1(){};typeof new f1(); //"object"
console.log(1+ +"2"+"2"); //+"2"把字符串2转化成了数字2,故结果32

优先级问题

if(! a in window){  //这里可以访问到a,因为a的变量声明被提升    var a = 1;}console.log(a); //但是由于 !的优先级高于in,故上述可变成if((!a) in window){  //这里可以访问到a,因为a的变量声明被提升    var a = 1;}console.log(a); //故不会执行var  a=1,故输出undefined

replace 函数第二个参数是函数的问题

如下题

   "2 3 4".replace(/\d+/g,parseInt);//replace函数说明如下

首先看说明
replace() 方法的参数 replacement 可以是函数而不是字符串。在这 种情况下,每个 匹配 都调用该函数(感觉这里不严谨,不应该是匹配项调用该函数,而是调用该函数,并且传入匹配项作为参数) ,它返回的字符串将作为替换文本使用。

那么这些 匹配是啥呢?换句话说传递给函数(replace第二个参数)是什么? 有文档可知
其参数有

  • result: 本次匹配到的结果。
  • $1,…$9: 正则表达式中有几个(),就会传递几个参数,1 9分别代表本次匹配中每个()提取的结果,最多9个。
  • offset:记录本次匹配的开始位置。
  • source:接受匹配的原始字符串。
  • 也就是说,上面的代码相当于

       "2 3 4".replace(/\d+/g,function(result,offset,sourse){      return parseInt(result,offset,sourse);   });   //即此时,分别用parseInt(2,0,"2 3 4")//2  替换2//第三个参数将被忽略,0表示转换2前是十进制,parseInt(3,2,"2 3 4") //NaN  替换3//3转换前是2进制,不存在的,所以为NaNparseInt(4,2,"2 3 4") //NaN   替换4//故结果为"2 NaN NaN"

    正则表达式

      /^[a-z]/.test(null); //ture  /^[a-z]/.test();  //true

    对象全等

       var a={"fo":"bar"};   var b={"fo":"bar"};   console.log(a === b) //false,对象比较的应该是是否是指向同一块内存地址,是的话就全等,否则不全等。

    浮点数相加精度问题

        console.log((0.1+0.2)===0.3)//false   //原因 0.1+0.2会产生精度的问题,其他的浮点数相加貌似不会产生精度问题   console.log(0.1+0.2) //0.30000000000000004 自然就不相等了