`

Javascript中那些坑

 
阅读更多
1. 隐式创建全局变量

function test(){
  var a = c = 10;
}
test()
console.log(c); // 10
console.log(a); // a is not defined

给未定义的变量赋值会在隐式地创建一个全局变量,而全局变量是Javascript最邪恶的一个特性,应尽量避免。 使用严格模式(“use strict”)可避免这类隐式创建。

2. 没有块作用域

function test(){
  var a = 10;
  if(true){
    var b = 11;
  }
  console.log(a+b);
}
test(); //21
console.log(a); // a is not defined

javascript有块语法但是没有块作用域, 在一个函数内部定义的变量对整个函数可见。在Javascript中,只有全局作用域和函数作用域(Local作用域)。因此,在定义一个函数时,一开始就把所需用到的变量声明好是更好的实践,而非Java中那样在需要使用前再声明。

3. 分号

function test1(){
  return {
          status: true
        };
}
function test2(){
  return
        {
          status: true
        };
}
console.log(test1());//{status: true}
console.log(test2());//undefined

在使用return语句时,应保证return语句后紧跟需要返回的值,如果换行会导致最后的分号形成一条单独的空语句,整个函数的返回值就成了这条空语句的返回值undefined.

4.typeof

console.log(typeof null);	//object
console.log(typeof NaN); 	//number
console.log(typeof /a/);	//object
console.log(typeof Array);	//function
console.log(typeof []);		//object
console.log(typeof 1);		//number
console.log(typeof new Numeber(1));//object

简单一句话,谨慎的使用typeof, 使用之前最好先验证一下,因为其返回值有时是反直觉的。

5. parseInt

console.log(parseInt(8));			//8
console.log(parseInt("8"));			//8
console.log(parseInt("8 kg"));		//8
console.log(parseInt("8kg"));		//8
console.log(parseInt("08"));		//8
console.log(parseInt("08",10));		//8
console.log(parseInt("09"));		//9
console.log(parseInt("09",8));     //0

ParseInt接收2个参数,第一个是需要转换的字符串string,string前面的字符串会自动忽略;第二个是需要转换的进制radix,如果不给的话,各个浏览器的实现方式就不一样了,ECMAScript 5中把其默认值修改为10进制,避免了很多的麻烦,为了兼容老的标准,最好是在使用parseInt时总是给一个radix,让代码更清晰,也避免老版本的兼容问题。

6. 假值

在javascript中,代表false的值有:
0
NaN
‘’
false
null
undefined
其它的值都为真,在做条件判断的时候要牢记。

7. 等于和不等于

console.log(''=='0');				//false
console.log(''== 0);				//true
console.log('0'== 0);				//true
console.log(false =='false');		//false
console.log(false =='0');			//true
console.log(false == undefined);	//false
console.log(false == null);			//false
console.log(undefined == null);		//true
console.log('\t\r\n' == 0);			//true

console.log(''==='0');				//false
console.log(''=== 0);				//false
console.log('0'=== 0);				//false
console.log(false ==='false');		//false
console.log(false ==='0');			//false
console.log(false === undefined);	//false
console.log(false === null);		//false
console.log(undefined === null);	//false
console.log('\t\r\n' === 0);		//false

javascript中提供了2组相等比较操作符(===和!==, ==和!=),从上面的代码中可看出, ==这组操作太邪恶了,一堆反直觉的结果值,因此在代码中应尽量避免使用这组操作符。

8. 位操作符

javacript中提供了很多位操作符:
&,|,^,~,>>,>>>,<<,<<<

首先,位操作是作用于整数, 在Java中使用位操作是因为其更复合于硬件的运行原理从而可以极大的提升程序运行的效率,可是Javascript中,首先没有整数,只用double精度的浮点数,使用位操作需要先把运算子转换为整数,运算完之后再转回浮点数;其次,javascript离硬件还很远,中间隔着各种实现引擎。因此在javascript中使用位操作是吃力不讨好的事,应尽量避免使用。

9. void

var a = 10;
console.log(void a); //undefined
console.log(a);		 //10

javascript中有一个名叫void的操作符,该操作符接受一个运算子,然后返回undefined。然后就木有了,这个操作符的应用场景我实在没有想到,不明白定义出来干什么的。
1
0
分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics