1. ***数据类型转换:
***js是弱类型编程语言:3方面:
1. 声明变量时,不用规定变量存储的数据类型
2. 赋值时,动态决定变量的数据类型
同一个变量,先后可保存不同类型的数据
3. 运算时,js会根据需要,动态转换数据的类型
2大类:
1. 隐式转换:无需程序员干预,js自动完成的类型转换
仅讨论+运算中的隐式转换:2句
算数计算中,一切类型都隐式转为number类型,再计算
比如:"2"-->2 true/false-->1/0
特例:+运算中,只要有一方是字符串,两数据都转为字符串,且+运算变为字符串拼接!
表达式:由数据,变量和运算符组成的一个公式
每个表达式默认都从左向右,两两计算
*每个表达式有且仅有一个运算结果!*
NaN:Not a Number-->说明运算中包含了无法转为数字的值
不是数字 的 数字
NaN和任何数据做计算,永远返回NaN
typeof(x): 专门用于判断x的数据类型,返回数据类型名
typeof(NaN): number
隐式转换,仅影响表达式的运算结果,不影响变量中存储的实际值。
2. 强制转换:程序员通过主动调用专门函数,执行转换
1. 任意类型 to String: 2种:
var str=x.toString();
js中,一切数据都有toString方法
var str=String(x);-->隐式转换
何时使用:程序在需要时,自动调用
***2. 任意类型 to Number: 2种:
任意类型 to Number: var n=Number(x);-->隐式
String to Number: 2种:
var n=parseInt(str);
原理:从str开始位置逐个读取每个字符
直到碰到第一个不是数字的字符时,停止读取
自动忽略开头碰到的空格
比如:var width="12px";
width+"2px"-->"12px2px"
Number(width)+Number("2px")-->NaN
parseInt(width)+parseInt("2px")
parseInt("12px")+parseInt("2px")
12 2 -->14
width=14+"px";
var money="$400"; NaN
"34.56"; 34
var n=parseFloat(str);
原理和parseInt完全一致!
但是,parseFloat,只认第一个小数点
比如:parseFloat("34.56"); 34.56
parseFloat("34.56.78"); 34.56
Number(x) vs parseInt(str)
比如:Number("12px")-->NaN
parseInt("12px")-->12
string to Number-->parseInt
Number(true)-->1
parseInt(String(true))
parseInt("true")-->NaN
x to Number-->Number()
3. 任意类型-->Boolean: 1种:
var bool=Boolean(x);-->隐式转换
"" NaN undefined null 0 --> false
其余-->true
课堂练习:
输入框:var input=[window.]prompt("输入提示");
[window.]alert();
***凡是从页面上获得一切数据,都是字符串类型
2. ***运算符和表达式:
程序:让计算机按照人的想法去执行任务
运算符:程序中模拟人的思维运算或判断的符号
运算符:算数运算符:+ - * / % ++ --
%运算:取余数 6789%100-->89
被除数/除数,不取商,而是取除不尽的余数部分
何时使用:2大用途:
1. 判断奇偶数:n%2-->1 奇数 否则 偶数
2. 限制一个运算的结果,不超过某个最大值(除数)
1. ***算数运算:仅++
++:将当前变量中的值递增1
比如:n++; ++n; <==> n=n+1;
何时使用:今后,只要对变量中的值递增1,还存回变量中
3种情况:n++单独使用,前++和后++都一样
++运算参与到其他表达式中:
前++(++n):将n中的值+1,然后返回*新值*
后++(n++):将n中的值+1,然后返回*旧值*
--:将当前变量中的值递减1
比如:n-- <==>n=n-1;
2. ***关系运算:将两个值做比较:> < >= <= == !=
只能返回两个值之一:如果成立,返回true;否则返回false
隐式转换:将所有类型都转为number类型,再比较!
特殊情况:3种:
1. 两字符串做比较:依次PK每一位字符的unicode编号
只要有一位字符,分出大小,就不再比较
比如:"3">"10" -->true
"Smith">"Scott" -->true
"m" "c"
109 99
"张东">"张无忌" -->false
"东" "无"
19996 26080
2. NaN: NaN和任何数据做大小或等于比较永远返回false
NaN和任何数据做*不等于*比较,永远返回true
isNaN(num):专门判断num是否是NaN
如果是NaN返回true,否则返回false
When:今后只要判断一个数值是否是数字或能否被转为数字,都用isNaN。如果是数字,返回false!否则返回true
3. undefined vs null
undefined == null true
===: 全等:数据类型要相同,再比较值是否相等
不带隐式转换
何时使用:只要不希望关系运算中自动隐式转换时
3. ***逻辑运算:综合多个关系运算的结果得出最终结论
隐式类型转换:自动将每个条件转为Boolean类型
鄙视题:
alert(4&&5);//?
alert(4||5);//?
返回值只能二选一:满足条件返回true,否则返回false
3个:
关系运算1&&关系运算2:
而且
两个条件必须都是true,才返回true,否则返回false
关系运算1||关系运算2:
或者
只要有一个条件为true,则返回true
只有两个条件都为false时,才返回false
!关系运算:颠倒关系运算的true/false结果
***短路逻辑:如果前一个条件已经可以得出结论,
则后续条件不再执行!
作业:5_login.html:鄙视题
***利用短路逻辑:2种:
1. 利用&&的短路逻辑:
关系运算&&操作:只有满足关系运算时,才执“操作”
2. 利用||的短路逻辑:
关系运算||操作:如果前一个条件不满足,才执行后一个"操作"
作业:逻辑运算:课堂练习:2个问题
问题1:如何判断一个字符是汉字:
第一个汉字"一"-->"\u4e00"
最后一个汉字"\u9fa5"
4. 位运算:2个
左移:n<<m 将n的二进制,左移m位
比如:1<<3 -->1* 2的3次方
右移:n>>m 将n的二进制,右移m位
比如:64>>3 -->64/ 2的3次方 ==> 8
5. 扩展赋值运算:5个:+= -= *= /= %=
仅讨论+=: n+=2; ==>n=n+2
将n中的值+2后,再保存回n中
何时使用:今后只要对变量中的值进行累加时,都要用扩展赋值运算。
6. ***三目运算:根据不同的条件,多选*一*,返回不同的结果
语法:条件1?值1:
条件2?值2:
...?...:
默认值;
无论三目运算多么复杂,结果只能是一个值。