变量和简单数据类型
简单数据类型,分为字符串、数值型、布尔型、null和undefined
变量需要用关键字var定义,它的作用就是保存这些值
字符串就是一些文本,通过操作符 “+” 可以对字符串进行连接
var str01 = "我的名字是:";
var str02 = "叶小凡";
alert(str01 + str02 );
数值型:数字分为整数和小数 都可以呀ongoing变量装起来
布尔型:分为true和false
用if语句判断,if("叶小凡"){ alert(‘真’);} else { alert(" 假" ); } ==>运行结果为 真
不为空的字符串自然是真,如果字符串是空的即 if 里面为空,结果为 假
数值型分正数、负数和0
if( 10 ){ alert(‘真’);} else { alert(" 假" ); } ==>运行结果为 真
if( -10 ){ alert(‘真’);} else { alert(" 假" ); } ==>运行结果为 真
if( 0 ){ alert(‘真’);} else { alert(" 假" ); } ==>运行结果为 假
字符串只要不为空,就表示真,否则就是假。
数字只要不为0,就代表真,否则就是假。
null 和 undefined 都是代表空值
null 是主动地将某个变量设置为空值
undefined 更多的是因为对于一些意外状况而出现( 定义了一个变量,但是没有给他赋值,所以他的值就是undefined )
真假判断,null和undefined都是空值,自然代表了假
化浮为整
计算0.1 + 0.2
var num01= 0.1 ;
var num02= 0.2;
alert ( num01 + num02); ==> 结果为 0.30000000000000004
( 精度丢失问题)
小数计算丢失精度,整数计算没有这个问题
var num01= 0.1 ;
var num02= 0.2;
num01 = num01 * 10;
num02 = num02 * 10;
alert ( num01 + num02); ==>结果为 3
则
alert(num01 + num02 )/ 10); ==> 结果0.3
如果不是0.1+0.2 , 0.1和0.01 呢 小数点后面的位数!
0.01就是小数,也是浮点数,化浮为整就要 X100 ( 100 是因为小数点后面有两位)
获取小数点后面的位数! 把数字当成字符串处理! 因为字符串有一个length属性
var num01 = "0.01";
alert (num01.length); 结果是4,表示0.01这个字符串有4位
字符串有个splice函数,把字符串通过某者规则和标记符号进行分隔,并返回一个数组
( splice方法是插入、删除或者替换数组元素,不仅在原有数组修改,还返回被处理的内容。
splice方法用前两个参数进行定位,余下的参数表示插入 )
0.01如果通过 " . ( 点) " 来分隔 就会返回一个字符串数组 整个字符串数组里面应该有两个字符串,一个是0 一个是01
var num01 = " 0.01 ";
var num01_arr = num01.split(".");
经过点号分隔,0.01被拆开了 变成了字符串数组[ 0,01 ] 其中想要获得01,又因为数组下标是从0开始,所以需要这样获取:
var num01 = "0.01";
var num01_arr = "num01.split(".");
var num01_arr_2 = num01_arr[1];
alert ( num01_arr_2.length);
最后结果为 2
获取到了0.01小数点后面的位数(小数点后两位),两位对应倍数100
计算0.1+0.2 需要先把两个数中比较小的那个数字通过上面这个方法求出倍数,然后把这两个数都乘以这个倍数,就可以化浮为整了。(整数计算没有精度丢失问题,计算出结果后除以倍数就得到正确答案了!)
函数:返回值、参数列表和函数体
(将函数想象成黑盒子,参数就是黑盒子里的物体<可以是单个的也可以是多个物体> 黑盒子内部空间就是函数的函数体,在函数体中,对参数进行处理,处理结束后,该函数设计者需要得到某个结果从黑盒子中扔出,就可以使用return关键字将其抛出)
业务逻辑:必须清楚地明白自己设计这个函数是为了什么。( 为了解决什么问题)
例:0.1+0.2 小数相加会有精度丢失问题 => 为了解决这个问题 先把0.1和0.2变成整数进行计算,最后再除以一个倍数10。对于小数计算,可以设计一个通用的函数,将需要相加的参数传递进去,将化浮为整的逻辑就写在函数体中,最后将结果返回
function add(num1,num2){
// 将数字转换成字符串
num1 = num1.toString();
num2 = num2.toString();
// 获取两个数字的小数点后面位数
var a = num1.split(".")[1].length;
var b = num2.split(".")[1].length;
//用console.log查看倍数
console.log(a);
console.log(b);
函数的调用:调用一个函数就只需要在函数名称右边打一对小括号就可以。如果函数有一个参数,那么就在小括号里填入具体数据,比如变量或者直接量。如果函数有多个参数,就在圆括号填入多个具体数据,用逗号分隔。例:var num1 = 10; var num2 = 20; add(num1,num2);
比如:传进来0.2 0.02
// 获取两个数字的小数点后面的位数
var a = num1.split(".")[1].length;
var b = num2.split(".")[1].length;
计算得出位数:a = 1 b=2
( 需要把0.2 0.02同时乘100 变成20 和 2 ,然后计算20+2 =22 ,最后除以100得到0.22 )
var max = a; //先默认较大的位数为a
if ( a<b ){ //如果a比b小,就把b 赋值给max(最大值)
max = b ;
}
//根据位数获得对应的10的幂数
//两个小数同时乘以倍数
//相加完毕后,再将结果除以倍数
max就是较大的位数,如果 max = 2 那么2就变成100 ( 也就是10 X 10 )
max是3就是10*10*10 4=>10*10*10*10 ······
//根据位数获取对应的10的幂数
var beishu = 1;
for (var i= 0;i<max;i++){
beishu = beishu * 10;
}
如果传入的是0.2 0.02 那么max就是2,for就循环两次,每次倍数都扩大10倍,两次扩大100
// 两个小数同时乘得到的这个倍数
num1 = num1 * beishu;
num2 = num2 * beishu;
0.2*100 = 20 0.02*100 = 2 => 20 + 2 = 22
最后相加以后再除以倍数,把结果返回出去
// 相加完后,将结果除以倍数!
var sum = ( num1 + num2 ) / beishu;
return sum;
22 / 100 = 0.22
最后调用函数来算最开始的值: alert(add(0.1,0.2)) => 结果为0.3
如果在该代码中,测试1和0.2 cannot read property ' length' of undefined
只要是字符串就会有length属性 length属性代表了一个字符串的长度
var a = num1.split(".")[1].length;中 num1.split(".")[1] 这句代码的意思是将变量num1根据“.”进行分隔。这个时候num1的值为1,本来就没 有点号。也就是说,给字符串“1”根据“.”分隔,那么只会得到一个 只有单个数据的数组:[“1”]。又因为数组的下标是从0开始的,所以 [1]代表从数组的第2个位置获取数据。可是num1.split(".")得到的 数组只有一个元素,换句话说,只有下标为0的位置里才有数据,因此,强行去[1]的地方获取数据自然是 不可行的,自然就会报错
传入数字后,先判断是不是小数,如果是就继续之前的方法 ,如果不是小数就默认为小数位是0
只要是字符串 就会有index O放方法 => 利用字符串 indexOf 方法
indexOf 方法 : 是在原字符串中搜索一个特定的字符串,
比如说从“ 123456” 搜索2 ,字符串的下标从0开始,所以找到2的时候,返回结果为1
如果查询的内容在字符串中不存在:
查询一个不存在的匹配项,得到的结果就是 -1
利用indexOf 方法 查询 “ . ” 得到一个返回值,只要返回值不是-1 就代表是有小数点,说明这个数是小数
replace 方法
先将小数的 “ . ( 点 )” 去掉
2.2就变成22;1.001变成1001 为了保证位数的一致,
1.001比2.2小数位数多了两位,所以要在22后面补零,变成2200
如果是去除小数点,就用replace," abcd " 里面内容替换成大写C 就变成了" abCd"
则 "abcd".repalce("c","C")
这次将传入的两个参数num1 num2 用toString 方法写成字符串
用index获取小数点位置( 如果其中一个是整数那么index获取的就是-1 ,等于-1时不存在,小数位就是0 ,如果不是-1 那么就通过字符串截取函数splice获取小数点的位数)
function add (num1,num2){
// 将数字转换成字符串
num1 = num1.toString();
num2 = num2.toString();
// 获取小数点的位置
var index1 = num1.indexOf(".");
var index2 = num2.indexOf(".");
// 如果小数点存在,那么就再获取各自的小数位数
var ws1 = 0 ;
var ws2 = 0;
if ( index1 ! =-1){
ws1 = num1.split(".")[1].length;
}
if ( index2 != -1 ){
ws2 = num2.split(".")[1].length;
}
// 看谁的小数位数大,谁的小数位数小
var bigger = (ws1>ws2) ? ws1 : ws2 ;
var smaller = (ws1<ws2) ? ws1 : ws2 ;
// 计算得到需要补齐的0的个数,大的位数减去小的
var zerosCount = bigger - smaller;
//( 不管两个数谁大谁小 )全部去除小数点
num1 = num1.replace(".","");
num2 = num2.replace(".","");
// 比较num1和num2谁大,比较方法就是看谁是smaller,是smaller的一方就补0
if(ws1 == small){
for(var i = 0 ;i<zerosCount;i++){
num1 += "0";
}
}else{
for(var i = 0 ;i<zerosCount;i++){
num2 += "0";
}
}
// 开始计算
var sum = parseInt(num1) + parseInet(num2);
//根据较大的小数位数计算倍数
var beishu = 1;
for(var i = 0; i<bigger;i++){
beishu = beishu * 10;
}
sum = sum / beishu;
return sum;
}
// 弹窗显示alert
alert(add(1.001,2.002));
}
先将两个数字转换成字符串(toString)
获取各自小数位,如果是整数没有小数位那么就是0
接下来去掉小数点 replace ==> "1.01".replace("."," ") 这样得到的就是101
如果另一个数是整数2,那么为了保证位数一直,就需要再整数后面添0 ,添的和小数位数一样多
那么两个0就是2和1.01位数差,要拿到2和1.01小数位数,利用字符串截取的办法
获取1.01小数后面使用splice函数和length属性