Fork me on GitHub

一些JS实用技巧

  • 给一个未声明的变量赋值,该变量会被自动创建为全局变量,在JS开发中,应该避免使用全局变量。所以,在给一个变量赋值时,一定要var声明后再使用。
  • 避免使用eval()或Function构造函数;eval()和Function构造函数被称为脚本引擎,每次执行它们的时候都必须把源码转换成可执行的代码,这种操作代价挺大的。
  • 不要向setTimeout()和setInterval()方法里传递字符串。如果在这两个方法里传递字符串,那么字符串会像eval那样重新计算,这样速度就会变慢。
  • 如果在全局区域里使用with()插入变量,那么,万一有一个变量名字和它名字一样,就很容易混淆和重写,应该避免这种写法。

话说踩100个坑就算是打怪升级成功了。前端这条路很长,需要自己不断雕琢……

No1:使用===替换==,隐患有时候就是这样出现的。

1
2
3
4
5
6
7
8
[10] === 10 //false
[10] == 10 //true
'10' == 10 //true
'10' === 10 //false
[] == 0 //true
[] === 0 //false
'' == false //true but true == "a" is false
'' === false //false

No2:给数组创建一个随机项

1
2
var items = [12, 548 , 'a' , 2 , 5478 , 'foo' , 8852, , 'Doe' , 2145 , 119];
var randomItem = items[Math.floor(Math.random() * items.length)];

No3:在特定范围里获得一个随机数

1
var x = Math.floor(Math.random() * (max - min + 1)) + min;

No4:在数字0和最大数之间生成一组随机数

1
2
3
var numbersArray = [] , max = 100;
for( var i=1; numbersArray.push(i++) < max;i+=2); // numbers = [0,1,2,3 ... 100]
console.log(numbersArray)

No5:数字数组随机排序

1
2
var numbers = [5, 458 , 120 , -215 , 228 , 400 , 122205, -85411];
numbers = numbers.sort(function(){ return Math.random() - 0.5});

No6:数组追加

1
2
3
var array1 = [12 , "foo" , {name:"Joe"} , -2458];
var array2 = ["Doe" , 555 , 100];
Array.prototype.push.apply(array1, array2);

No7:将参数对象转换为数组

1
var argArray = Array.prototype.slice.call(arguments);

No8:验证一个给定参数是否为数字

1
2
3
function isNumber(n){
return !isNaN(parseFloat(n)) && isFinite(n);
}

No9:验证一个给定的参数为数组

1
2
3
function isArray(obj){
return Object.prototype.toString.call(obj) === '[object Array]' ;
}

No10:从数字数组中获得最大值和最小值

1
2
3
var numbers = [5, 458 , 120 , -215 , 228 , 400 , 122205, -85411];
var maxInNumbers = Math.max.apply(Math, numbers);
var minInNumbers = Math.min.apply(Math, numbers);

No11:清空数组

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
var myArray = [12 , 222 , 1000 ];
myArray.length = 0;
//不要用delete从数组中删除项目
//我们可以使用split来代替使用delete来删除数组项。与其删除数组中未定义项目,还不如使用delete来替代。
var items = [12, 548 ,'a' , 2 , 5478 , 'foo' , 8852, , 'Doe' ,2154 , 119 ];
items.length; // return 11
delete items[3]; // return true
items.length; // return 11
//items will be equal to [12, 548, "a", undefined × 1, 5478, "foo", 8852, undefined × 1, "Doe", 2154, 119]
var items = [12, 548 ,'a' , 2 , 5478 , 'foo' , 8852, , 'Doe' ,2154 , 119 ];
items.length; // return 11
items.splice(3,1) ;
items.length; // return 10
//items will be equal to [12, 548, "a", 5478, "foo", 8852, undefined × 1, "Doe", 2154,119]
//delete方法应该删除一个对象属性
//使用length属性缩短数组,还可以使用length属性缩短数组
var myArray = [12 , 222 , 1000 , 124 , 98 , 10 ];
myArray.length = 4; // myArray will be equal to [12 , 222 , 1000 , 124]
//如果你所定义的数组长度值过高,那么数组的长度将会改变,并且会填充一些未定义的值到数组里,数组的length属性不是只读的。
myArray.length = 10; // the new array length is 10
myArray[myArray.length - 1] ; // undefined

No12:使用逻辑符号进行判断

1
2
3
var foo=10;
foo == 10 && fn();
foo == 5 || fn2();

No13:And设置默认值

1
2
3
function fn3(val){
val = val || 20;
}

No14:使用map遍历数组

1
2
3
var arr=[1,2,3,4,5].map(function (val){
return val*val;
})

No15:对小数进行取舍

1
2
3
4
var num=3.1415926;
num=num.toFixed(4);
//好比0.1+0.2===0.3 //false,应该是0.30000000000000004

No16:逗号操作符

1
2
var a = 0;
var b = ( a++, 99 );

No17:计算或查询缓存变量

1
2
var item=document.querySelector('#item');
console.log(item);

No18:避免负向索引

1
2
var numbersArray = [1,2,3,4,5];
var from = numbersArray.indexOf("foo");

No19:避免使用eval()或Function构造函数

1
2
3
var func1 = new Function(functionCode);
var func2 = eval(functionCode);
//eval()和Function构造函数被称为脚本引擎,每次执行它们的时候都必须把源码转换成可执行的代码,这是非常昂过的操作。

No20:不要向setTimeout()和setInterval()方法里传递字符串

1
2
3
4
5
6
//如果在这两个方法里传递字符串,那么字符串会像eval那样重新计算,这样速度就会变慢,而不是这样使用:
setInterval('doSomethingPeriodically()', 1000);
setTimeOut('doSomethingAfterFiveSeconds()', 5000);
//相反,应该这样用:
setInterval(doSomethingPeriodically, 1000);
setTimeOut(doSomethingAfterFiveSeconds, 5000);

No21:给XMLHttpRequests设置timeouts

1
2
3
4
5
6
7
8
9
10
11
12
13
var xhr = new XMLHttpRequest ();
xhr.onreadystatechange = function () {
if (this.readyState == 4) {
clearTimeout(timeout);
// do something with response data
}
}
var timeout = setTimeout( function () {
xhr.abort(); // call error callback
}, 60*1000 /* timeout after a minute */ );
xhr.open('GET', url, true);
xhr.send();

No22:多级判断用switch语句

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
function getCategory(age) {
var category = "";
switch (true) {
case isNaN(age):
category = "not an age";
break;
case (age >= 50):
category = "Old";
break;
case (age <= 20):
category = "Baby";
break;
default:
category = "Young";
break;
};
return category;
}
getCategory(5); //Baby
据说帅的人都赏给博主几块钱零花钱。