Netscapt:javascript Microsoft:JScript
变量:内存中存储数据的一块空间。一切数据必须存在变量中。
声明:var 变量名-->在内存中开辟一块空间
赋值:变量名=值-->将值保存到左边的变量空间中备用。
使用:使用变量名,等效于直接使用变量中的数据。
数据类型:
why:存储空间大小,用途
原始类型:数据保存在变量本地
复习:
number string Boolean undefined null
string:字符串内容一旦创建不能改变,要想改变只能创建新的字符串
正课:
数据类型间的转换:
隐式转换:程序自动转换数据类型(坑)
JavaScript是一种弱类型的程序语言体现在两个方面:
1.变量声明时不必限定数据类型,今后可能保存任何类型数据
2.数据类型间可以自动类型转换
仅考虑+(两种情况):
1.只要有字符串参与,一切类型都加""变为字符串
2.如果没有字符串,都转为数字计算:其中:true-->1 false-->0
var num1=1,num2=2;
var str="medusa";
var b1=true,b2=false;
console.log(str+num1); //"medusa1"
console.log(str+b1); //"medusatrue"
console.log(num1+num2+str); //"3medusa"
console.log(str+num1+num2); //"medusa12"
console.log("b1+b2="+(b1+b2)); //" b1+b2=1"
console.log("b1+num2="+(b1+num2)); //"b1+num2=3 "
强制转换:程序员通过调用专门函数手动转换类型
String: x.toString() -->将x转为字符串类型,其中x可以为任何数据类型。
Number: Numer(x) -->将任意类型转为number类型
string --> number:
转为整数:var num=parseInt("str")
本质是读取字符串中的整数部分:
1.从第一个字符向后读;
2.如果碰到第一个数字字符,开始获取数字;
再次碰到不是数字的字符(包括小数点),停止读取。
3.如果开头碰到空格,忽略;
4.如果碰到的第一个非空格字符,不是数字,说明不能转 -->NaN:Not a Number
什么是NaN:不是数字(内容)的数字(类型)。
console.log(parseInt(" 12px")); //12
console.log(parseInt("true")); //NaN
console.log(parseInt("22.5")); //22
parseInt是不认小数点的,只能读小数点之前的数字
转为浮点数:var num=parseFloat(str)
本质是读取字符串中浮点数部分
用法和parseInt完全相同。唯一差别:parseFloat认识小数点,仅认第一个小数点。parseFloat遇到小数时如果小数点前面没有0,会自动添加0;如果遇到小数点后面只有0,会自动输出一个整数不带小数点
console.log(parseFloat("22.5")); //22.5
console.log(parseFloat("22.5.5")); //22.5
console.log(parseFloat(".25")); //0.25
console.log(parseFloat("22.0")); //22
prompt("提示信息"):专门用于请求用户输入数据,收集数据的对话框。
var str=prompt("提示信息");
*凡是从页面上获得的数据,都是字符串!必须先转换再计算*
例:
<script>
var str=prompt("请输入工资");
var salary=parseInt(str)+1000; //此处若用var salary=str+1000; 获得到的就是输入的字符串,输出的结果就是NaN
alert("您涨薪后工资为:"+salary);
</script>
只要计算结果返回NaN,就说明计算参数错了
总结(数据类型之间的转换):
string-->number: Number(x)
boolean-->number: Number(x)
number-->string: x.toString()
boolean-->string: x.toString()
number-->boolean: Boolean(x)
string-->boolean: Boolean(x)
Number()的强制类型转换与parseInt()和parseFloat()方法的处理方式相似,只是它转换的是整个值,而不是部分值。parseInt()和parseFloat()方法只转换第一个无效字符之前的字符串。如“3.4.5”被转换成“3.4”,
parseInt可以转换parseInt("-280px"),结果是-280。
这个函数返回字符串前面的数字,忽略尾部的非数字部分。
parseInt("11eleven")结果是11
parseInt("eleven")结果是NaN
parseInt("-11eleven")结果是-11
Number是严格的,不允许任何非空格的字符。
Number("-280px")结果是NaN
Number("-280px")结果是NaN
Number("-280")结果是280
什么是运算符:程序模拟人类运算的特殊符号
算术运算符:+ - * / % ++ --
+ 可以表示加法,也可以用于字符串的连接
- 可以表示减号,也可以表示负号(任意类型数据做减号,都会被转为数字类型;如果有参数,不能自动转为数字,则返回NaN)
除法运算:如果除数为0:Infinity(无穷大)
console.log(5/0); //Infinity
console.log(0/0); //NaN
console.log(type0f(5/0); //number
type0f(x):判断任意数据的类型
%:取余数,也叫模运算,取得是除不尽的余数。限制一个数不能超过某个最大范围时,就可以用模运算。
递增/递减运算:
++: i++ ==> i=i+1;只要遇到对变量+1,就用i++
i++单独用:++放前放后,效果一样:i++ ==> ++i
i++出现在表达式内部:前++是先+1,再参与表达式;后++,先用旧值参与表达式,表达式之后再+1
关系运算:>
什么是关系运算:判断关系大小!一般在条件判断中使用。
结果只有两个:成立:true;不成立:false
注意:关系运算自带隐式类型转换
字符串参与关系运算:从第一个字符开始,依次取出每个字符,PK Unicode编号
在关系运算中:任何类型(包括字符串)和数字比较,都转为数字,再比较;布尔类型参与关系运算,始终转为数字比较。
在关系运算中,等于要用==,不能用=
console.log(3>10); //false
console.log('3'>'10'); //true
console.log('3'>10); //false
console.log('10'==10); //true
console.log('2'>true); //true
console.log(2>true); //true
在关系运算中:先将参与判断的数据,强转为相同类型,再比较。
undefined类型,是从null类型继承来的。但是undefined值在比较时会被自动转为null。即undefined做==比较时:即:undefined==null ==>true
===严格相等:不带自动类型转换的相等比较!既会比较类型,也会比较值,只要任何一个不相等都会返回false。
只要不确定比较的类型,又不希望自动类型转换时,就用===
console.log(undefined==null); //true
console.log(typeof(undefined)); //undefined
console.log(typeof(null)); //object
console.log(undefined===null); //false
NaN做等值比较==:NaN和任何数字作比较,永远返回false,即使和自己比较也返回false,即 NaN==NaN ==>false
isNaN(x):专门用来判断一个数据是否是NaN。如果是NaN返回true;如果不是NaN返回false。是数字返回false,如果不是数字返回true。只要不能自动转换为数字的,都返回true;只要能自动转为数字的,都返回false
console.log(isNaN("")); //false
注:关系运算中"",可以自动转为0
console.log(isNaN(22.5)); //false
console.log(isNaN("10")); //false
注:关系运算中,"10"可以自动转为10
console.log(isNaN("12px")); //true
console.log(isNaN(true)); //false
console.log(isNaN("true")); //true
注:关系运算中,true可以自动转为1,"true"不可以.字符串是不能自动转换为true的,但是布尔类型可以自动转换为数字
console.log(isNaN(NaN)); //true
console.log(isNaN("NaN")); //true
注:上面这两个是有着本质区别的
关系运算总结:
1.普通数据,先转为相同类型,再比较
2.undefined,就用===
3.NaN,就用isNaN(x)
var temper=0;
var weather="雨";
var money=45;
var jacket=temper<-3; //false
var umbrella=weather=="雨"; //true
var taxi=money>=45; //true
console.log(jacket+" "+umbrella+" "+taxi); //false true true
console.log(jacket+umbrella"+taxi); //false true true
逻辑运算:基于多组关系运算,得出1个结论
&&:与运算,所有条件为true,才返回true;只有一个为false就返回false
||:或运算,只要任意一个为true,就返回true;只有所有条件都为false时,才返回false
!:非运算,颠倒true和false,今后只要颠倒判断结果,就用!
var c=prompt("请输入一个字符:");
var isNumber=c>="0"&&c<="9";
var isAlphabet=(c>="A"&&c<="Z")||(c>="a"&&c<="z");
var isChiense=c>="\u4E00"&&c<="\u9FA5"; //注意,以后只要是验证字符是不是汉字就用这个来验证
console.log(isNumber+","+isAlphabet+","+isChiense);
var year=prompt("请输入年份:");
year=parseInt(year);
var isLeapYear=(year%4==0&&year%100!=0)||(year%400==0); //闰年的判断公式记下
console.log("是闰年吗"+isLeapYear);
关于“短路逻辑”的问题:只要前一个判断足以得出最终结论,则后续条件不执行!
例一:
var i=10;
var j=10;
var k=i--<0&&j++>0;
console.log("k="+k+","+"i="+i+","+"j="+j); //k=false,i=9,j=10
例二:
var i=10;
var j=10;
var k=i-->0||j++>0;
console.log("k="+k+","+"i="+i+","+"j="+j); //k=true,i=9,j=10
位运算:将数字以二进制形式进行计算
位移:
左移:n<<m ==>n*(2的m次方)
例3<<1 ==>3*(2的1次方)
3<<2 ==>3*(2的2次方)
3<<3 ==>3*(2的3次方)
右移:n>>m ==>n/(2的m次方)
例64>>1 ==>64/(2的1次方)
64>>2 ==>64/(2的2次方)
64>>3 ==>64/(2的3次方)
总结:左移几位就乘几个2,右移几位就除以几个2
赋值运算:=用于为变量赋值。赋值运算的结果就是等号右边表达式的结果。
var x=y=z=10; //赋值的结果就是右边表达式的值10,这种写法不推荐使用
扩展赋值表达式:(+= -= *= /= %=)一般是对已有数据计算同时,将结果再存回变量。一般在修改原变量值时使用。
+= : i+=5;等效于i=i+5;同理其他几个
字符连接运算:+ 运算
三目运算:根据不同条件,动态返回不同结果!三目运算返回的结果是一个值。
为什么是三目:至少需要三个表达式。console.log(变量=="条件"?"执行1":"执行2");
语法:条件?当条件满足时返回的值:当条件不满足时返回的值
例:
var ts="人";
var bgj="妖";
var who=ts;
console.log(who=="人" ?"放过":"杀掉");
例2:
var who=bgj;
var r=who=="人"?"放过":
who=="妖"?"杀掉":
"送到泰国"; //上述条件不满足,则送到泰国
console.log(r);
三目运算中,多个条件时,即多选一,语法如下:
条件1?条件1满足时的值:
条件2?条件2满足时的值:
条件n?条件n满足时的值:
默认值;
三目运算应用:
需求1:2个数中取最大的
var score1=100;
var score2=80;
var result=score1>score2?score1:score2;
注意:后一个条件中不用包含否定前一个条件的关系判断。因为,进入后一个条件隐含的条件就是前一个条件不满足。
例:
var salary=parseInt(prompt("请输入工资"));
var c= salary>=20000?"土豪":
salary>=8000?"小资":
"屌丝";
console.log(c);