javascript易错题

本文详细解析了JavaScript中变量类型的判断方法及条件语句中变量的自动转换规则,包括typeof运算符、对象全等比较、正则表达式的使用技巧及特殊场景下的数据类型转换。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

判断语句变量的自动转化

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; //true
typdof 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进制,不存在的,所以为NaN
    parseInt(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 自然就不相等了
    
    
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值