判断语句变量的自动转化
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 自然就不相等了