js的类型有多种分类,原始类型(数值,字符串,布尔值,null,undefined)和对象类型(object,String,Number,RgbExp等),或者是拥有方法的类型(object,String,Number,RgbExp,数值,字符串,布尔值等)和没有方法的类型(null,undefined)等。
js变量是无类型的,也即变量可以被赋予任何类型的数值。
js对数字的操作:
不区分整数值和浮点数值,js中的所有数都是使用的浮点数表示的,能够表示的数值范围(-900719925470992~9007199254700992),超过此范围,js就无法保证低位数的精度。js用Infinity表示正无穷,用—Infinity表示负无穷,用NaN表示非数字
算术运算:加(+)减(-)乘(*)除(/)求余(%),除此之外还有借助Math对象来实现的
Math.pow(2,1) //2的53次幂
Math.round(2.4)//四舍五入
Math.ceil(2.4) //向上取整
Math.floor(2.4) //向下取整
Math.abs(-3) //绝对值
Math.min(2,1)//最小值
Math.max(2,1) //最大值
Math.exp(2) //e的2次幂
Math.random() //生成一个0到1之间的随机数
Math.PI//圆周率
Math.E//自然对数的底数
二进制浮点数和四舍五入错误:
js采用的二进制浮点数,因此有限多个实数,因此大多数的js表示的实数都只是近似值,比如0.3-0.1和0.2-0.1不相等,因此在进行js运算时,要尽量避免浮点数的相加减。
将数字转换成字符串:
可以简单地调用toString(c1)方法,且此方法接受一个可选的参数,c1代表转换基数。比如var n = 17;n.toString(2) = 10001;当c1不存在时,默认的转换基数为10;另外Number为数字转换成字符串的机制设置了三种方式,分别是
toFixed(c1)c1代表保留小数的位数,这种方式,不会转换成科学计数法
toExponential(c1)c1代表有效位数,这种方式采用科学计数法
toPrecision(c1)c1代表有效位数,当c1小于n的整数位数时,采用科学计数法,反之采用直接转换法
js对字符串的操作:
将字符串转换为数字:
Number()这种方式可以将数字字符串转换成整数或浮点数字面量,基数只能是10,并且,字符串中不能包含其他的非法字符后缀
parseInt()只解析字符串中的整数,如果有前缀o,则解析成8进制,有前缀0x,则解析成 16进制
parseFloat()可以解析字符串的浮点数
parseInt()和parseFloat()在解析字符串的时候,如果第一个非空格字符是非法的数字直接量(比如“.8”、"abc89"),都会返回NaN。
字符串前直接加“+”或“-”这种方式可以将数字字符串转换成整数或浮点数字面量,基数只能是10,并且,字符串中不能包含其他的非法字符后缀
另外补充加号的作用及用法(
作用:
1.正数表示法
2.相加符号
3.字符串之间的连接符
用法:
1、如果+(加号)两边都是数字,则肯定是加法运算
2、如果+两边有boolean、number类型或null值的某一个,则是加法运算,比如:1+true是2,true+true也是2,null+false是0,1+null是1
3、如果加号两边有最少一边是字符串,则是字符串拼按,比如1+”abcd”
4、如果加号两边最少有一边是是对象类型,这个对象先对象它的toString方法,然后再做字符串拼接,比如:(这些涉及到一些对象的原理性的东西,先做简单了解,以 后会讲)5+[1,2,3,4] 是51,2,3,4 比如({}+{})是 "[object Object][object Object]"
5、数字、布尔、null和undefined做加运算的结果是NaN。
)
对象转换为原始值:
toString(),函数、数组、正则、时间对象都可以使用这个方法转换成相对应的字符串。
valueOf()很多对象使用这个方法会放回对象本身,而不是原始值。时间类型的对象会返回毫秒数。
对象到字符串的转换会首先考虑toString(),再考虑valueOf();而对象到数值的转换,会首先考虑valueOf(),再考虑toString()
js对变量的操作:
js的预编译规则,是当处理器首次扫描文档时,首先会将声明的参数、函数、变量名(值为undefined)放入内存,(声明提前)然后再从上到下执行上下文。其中执行变量值的优先级是函数—>参数—>变量名 。看下面的例子:
1.下面这个例子中,第一个a是因为 ,当执行到函数时,此时函数内部定义了局部变量,所以在函数预编译的时候,先是将变量a(值为undefined)存入内存,当执行上下文到alert(a)的时候,a=undefined;第二个a就是全局a;
var a = 1;
function fn1() {
alert( a ); //underfined
var a = 2;
}
fn1();
alert( a ); //1
2.下面这个例子中,第一个a是因为,当执行到函数的时候,函数内部没有定义a,此时沿着作用域链向上查找到全局的a=1;第二个a是因为 在函数内部的定义的a是全局变量,在执行了fn1()之后,a=2的值取代了a=1的值
var a = 1;
function fn1() {
alert( a );// 1
a = 2;
}
fn1();
alert( a ); //2
3.当存在参数时,因为执行到函数的时候,由于js的预编译中,优先级是函数大于参数大于变量,所以使得第一个a=function a(){ }而不是3
var a = 3;
function test( a ){
alert( a ); //function a(){ }
var a = 123;
function a(){ }
alert( a ); //123
}
test(a);
下面是一些例子:
例1.
var a = 1;
function fn1() {
alert( a );//1
a = 2;
}
fn1(a);
alert(a);//2;
例2.
var a = 10;
function aaa() {
alert( a );
}
function bbb() {
var a = 20;
aaa();
}
bbb();//10
例3.
function a(i) {
alert(i);//10
alert(arguments[0]); //arguments[0]应该就是形参 i //10
var i = 2;
alert(i);//2
alert(arguments[0]);//2
};
a(10);