进击的js
JavaScript解析器将当前作用域内声明的所有变量和函数都会放到作用域的开始处,但是,只有变量的声明被提前到作用域的开始处了,而赋值操作被保留在原处。
示例1:
var a =function(){
console.log('aaa');
}
function a(){
console.log('bbb');
}
a();//结果:aaa
首先函数申明和变量申明都会提前到作用域的开始出,但是变量声明的赋值操作被保留在原处,即 var a = undefined ,
a = function(console.log('bbb');){} 然后当程序执行到原变量赋值处时 a = function(){console.log('aaa'); 然后在执行a()就相当于执行
var a =function(){console.log('aaa');}这个函数 结果也就是aaa了
示例2:
1:function a() {}
var a;
alert(typeof a); //function:
2:
var a;
function a() {}
alert(typeof a); //function:
3:function a() {}
var a =2;
alert(typeof a); //number:
4:
var a =2;
function a() {}
alert(typeof a); //number:
5:
var a =2;
var a =function () {}
alert(typeof a); //function:
总结1:函数表达式只有变量“被提前”了,函数没有“被提前(示例5)
2:函数申明会首先被提升,然后才是变量申明(示例3,4)
3:重复的var(变量)声明会被忽略掉(示例1,2)
关于js浮点数相加的问题(其实java中也存在这个问题)
有时候项目中会遇到这种需求,那么该如何解决了,当前我所采用的方法是将浮点数转变成整数进行运算,然后对结果在除以相应的倍数
例如:
(1.1*10+0.1*10)/10
1.2//结果正常
上面只是真的一个案例来说,那么如果对于其他浮点数(2位小数点或者更多小数点)相加,我们可以采取一个通用的方法,即先判断参加运算的浮点数最多有几位小数点,然后全部乘以这个最多位数的10的倍数
即:将参加运算的数转换为字符串,然后利用js的split()的方法获取最长的小数位数,方法如下
var a = "1.222222"
b = a.split(".")
b[1].length //结果为6
通过这种方法就可以解决小数的位数问题了
使用 slice() 从字符串提取字符,返回的是被截取的字符串
如何获取用js获取url后面的参数
function getParam(queryValue){
var str = location.search.substring(1);
var valueArry = str.split("&");
for(var i=0,length=valueArry.length;i<length;i++){
var index = valueArry[i].split("=");
if(index[0] == queryValue) return index[1];
}
return false
}
//访问js对象属性
var test ={a:1,b:2}
一般方式:test.a //结果 1
另一种方式:test['a'] //结果 1 通过访问对象的动态属性
//js匿名执行函数也就是形成一个闭包
两种方式
1:(function(){alert(1)})()
执行结果 弹出1:
2.(function(){alert(1)}())
执行结果为弹出1:加括弧的主要用途是将里面的函数声明变成函数表达式,还有形容
~function test(){}() ,true&& function test(){}() 也是可以的,原理都是讲一个声明式函数转换为函数表达式,可以立刻执行
易错点
js中的数组的长度计算方法为arry.length,其数值为index的值大1,并不是数组里面有几个元素长度就为几,如下