整理一下学习和工作中遇到的javascript中需要注意的地方。不用就是忘得快啊,写在这里方便自己以后复习吧,本文将持续更新。(首次更新于:2017-8-7

1、小数点减法问题

1
var a = 0.3 - 0.2; //结果是多少?

这里的结果是:0.09999999999999998, 不是0.1,是不是很惊讶!

更神奇的还在后面!

1
2
3
4
5
//循环显示10条相减的信息
for(var i = 1; i < 11; i++){
var j = i + 1;
console.log((j / 10) + "-" + (i / 10) + "=" + (( j / 10) - (i / 10)), i);
}

结果如下:

除了0.2-0.1算对了,其他的都不对,不是大点就是小点。

这是由于二进制浮点数不能精确的表示简单的浮点数, 例如:0.1,只能表示一个及其近似的值。

决解方法也很简单,转换成整数计算即可避免这个问题。

2、关于”任何数字除以0会返回NaN”

这是《Javascript高级程序设计》中的话,似乎有点错误。这可能跟ECMAScript解释器有关。

只有0除以0才会返回NaN。其他数字除以0会返回Infinity(无穷大)。

1
2
3
console.log(0/0);  //NaN
console.log(1/0); //Infinity
console.log(-2/0); //-Infinity

3、数组最大能有多少个值?

数组最多可以包含4 294 967 295 个项。

不要问我为什么,某一天心血来潮,突然想起这个事情,就在网上找到了,博主没验证过这个数字(^_^)

4、递归阶乘函数(严格模式可用)

1
2
3
4
5
6
7
var factorial = (function f(num){
if(num <=1){
return 1;
}else{
return num * f(num-1);
}
})

5、关于setTimeout和setInterval返回值

他们的调用会返回一个数字ID,这个ID是计划执行函数唯一标识,可以用它来取消函数调用。

1
2
3
4
5
6
7
8
var timer = setTimeout(function(){
console.log('hello world');
},1000);

console.log(timer); //数值1

//可用于清除定时器
clearTimerout(timer);

6、获取URL中的传递的参数

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
function locationSerch(name){
var obj = {};
var local = window.location.search;
//检测url
if (!local) {console.error("没有参数"); return obj;}
//去掉?和切割成数组
var arr = local.substr(1).split("&");
//数组循环储存到obj
for (var i =0; i<arr.length; i++) {
var sp = arr[i].split("=");
obj[sp[0]] = sp[1];
}
//返回对象
return obj[name];
}

console.log(locationSerch("name")) // 1

7、关于typeof 检测 NaN

众所周知,NaN代表的意思是不是一个数字,那么用typeof检测NaN会返回什么类型呢?

1
typeof(NaN);    //number

返回的是number类型,这就有点尴尬了,但是也能理解,基础类型就哪几种,number如果不合适,其他类型更不合适。

8、千分位分割

看到最多的是正则表达式操作。用原生的toLocaleString()也可实现相应功能。

1
2
var num = 1234567890;
num.toLocaleString(); //1,234,567,890

9、为什么获取数组的最后一个元素需要减1?

因为数组的长度是从1开始计算(符合人类使用标准),而计算机是从0开始,

即:我们说的第一位,计算机表示的是0,所以取第一个元素为arr[0],最后一个则为数组的长度减去1位则为arr.length-1。

没毛病,老铁~

10、split()、slice()和splice()有什么区别

11、一维数组转树状结构 (更新于:2019/3/24)

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
function filterArray(data, parent){
const tree = [];
let temp;
for (let i = 0; i < data.length; i++) {
if (data[i].parentId === parent) {
const obj = data[i];
temp = this.filterArray(data, data[i].userId);
if (temp.length > 0) {
obj.children = temp;
}
tree.push(obj);
}
}
return tree;
}

12、如何检测Object和Array (更新于:2019/5/5)

使用typeof检测数组和对象返回的都是object

13、两个变量互换,常见的几种方式 (更新于:2019/5/6)

js常见的两个变量互换,例如:var x =1, y =2

文章中有考虑不全的地方,欢迎指正。