1. ***数据类型转换:
***js是弱类型语言:3方面:
1. 声明变量时,不需要规定变量存储的数据类型
2. 赋值时,才动态判断数据的类型。
同一个变量,先后可保存不同类型的值
3. ***js在需要时,自动转换数据的类型
2大类转换方式:隐式转换和强制转换
1. 隐式转换:不需要程序员干预,js自动完成的类型转换
隐式转换无处不在,只要js认为有必要。
仅讨论算数计算中的隐式转换:
1. 算数计算中,一切数据都默认转为数字,再计算
Boolean类型:true-->1 false-->0
特殊情况:如果数据无法被转为数字类型
会被转为NaN:Not a Number
表示 不是一个数字 的 数字
(含义) (类型)
NaN不等于,不大于,不小于任何值
NaN参与任何算数运算结果永远为NaN
2. 在+运算中,碰到字符串,+就变为字符串拼接
另一个不是字符串的数据,被自动转为字符串
表达式:变量,数据和运算符组成的公式
默认都是从左向右,两两运算
任何表达式都有1个运算结果
所以任何表达式都可以当一个值使用
2. 强制转换:程序员主动调用专门的函数,执行转换
何时使用:自动转换的类型,不是想要的
任意-->字符串:2个API
x.toString(); x不是undefined或null时,才可用
String(x) --> 相当于隐式转换-->万能
typeof(x)-->返回x的数据类型名称
任意-->数字:3个API
Number(x): 专用于将非字符串类型转数字
相当于隐式转换
将字符串转为数字:2个API
parseInt(str): 从第一个字符开始
整数 依次读取每个数字
只要碰上第一个非数字字符就停止
自动跳过开头的空字符
***不认识小数点
何时使用:将字符串转为整数时
parseFloat(str):用法同parseInt
浮点数 ***认识第一个小数点
何时使用:将字符串转为小数时
只有5个值转为false:
"" NaN undefined null 0
其余都转为true!
快速转换:任意转String: x+"";
任意转Boolean: !!x
2. ***运算符和表达式:
程序:*人脑的想法*在计算机中的执行
运算符:让程序模拟人类想法的特殊符号
表达式:变量,数据和运算符组成的公式
所有表达式都有一个结果-->都可以当一个值用
1. 算数运算:+ - * / % ++ --
%取余数(模运算):
比如:n%m n/m,不取商,而取除不尽的余数
何时使用:2大用途:
1. 判断能否整除:比如判断奇数,偶数
n%2 等于0,可被2整除,——偶数
n%2 不等0,不可被2整除,——奇数
2. 保证运算结果绝不超过除数
++递增 --递减
2种:都会将变量n中的值+1,再存会n中
++n : 表达式返回n的*新*值
n++ : 表达式返回n的*旧*值
3. 关系运算:将两个值做比较-->返回值:true、false
> < >= <= == !=
***关系运算中:
1. 默认将所有类型转为数字再比较
2. 如果参与比较的两值*都是字符串*
依此取出每个字符串的字符,PK unicode
比如:var name1="scott";
var name2="john";
console.log(name1>name2);
何时使用:只要判断条件,条件一般都为关系运算
2个特殊情况:
1. NaN:NaN不等于,不大于,不小于任何值(包括自己)
NaN和任何数据做!=比较时,始终返回true
问题:无法判断一个数字是否为数字
解决:isNaN(n):本意是判断一个值是否是NaN
n是NaN,返回true;否则返回false
如何判断一个值是否为数字:
!isNaN(n)-->!true-->false-->n不是数字
!false-->true-->n是数字
2. undefined vs null
undefined: 所有未赋值的变量的默认值——自动赋值
null:*主动*释放或清空一个变量中的值
undefined和null其实是同一个东西
全等:=== 首先类型相同,同时值相等
不带隐式转换的等于比较
何时使用:区分undefined和null时
只要要求类型相同,且值相等时
2. 逻辑运算:将多个关系运算综合起来,得出最终结论
返回值:true、false
何时使用:程序中,只要判断条件超过1个时
3种:&& || !
且 或 非
&&:两个条件必须都为true,才返回true
只要有一个为false,则返回false
||:两个条件只要有一个为true,就返回true
除非所有条件都为false,才返回false
***短路逻辑:逻辑运算中,只要前一个条件已经可以得出最终结论,后续条件,不再执行!
如何利用短路逻辑:
1. 1件事,满足条件就做,不满足条件,就不错!
条件&&(操作);
何时使用:如果操作仅有一两句话时
2. 如果前一个值有效,就用前一个,否则就用后一个
值1||值2
***逻辑运算中的隐式转换:将所有参与逻辑判断的条件都转为Boolean类型。("" null undefined NaN 0)
3. 位运算:左移<< 右移>>
n<<m: 将n的二进制数所有位,左移m位
n* 2的m次方
n>>m: n/ 2的m次方
4. 扩展赋值运算:+= -= *= /= %=
n+=m: n=n+m 将n中的值增加m,再存回n中
n*=m: n=n*m
何时使用:今后,只要直接累加,累减,累乘原变量时
5. ***三目运算:三元运算,条件运算
什么是:根据不同的条件,执行不同的操作/返回不同的值
语法:
条件1?值1或操作1: //如果满足条件1,就返回值1或执行操作1
条件2?值2或操作2: //否则,如果满足条件2,就返回值2或执行操作2
...?..........:
默认值或操作; //否则,(前边条件都不满足)
//执行默认操作,或返回默认值
总结:多个条件,多件事,多选一执行。
js:如果操作语句比较简单,建议用三目运算替代if..else
***js是弱类型语言:3方面:
1. 声明变量时,不需要规定变量存储的数据类型
2. 赋值时,才动态判断数据的类型。
同一个变量,先后可保存不同类型的值
3. ***js在需要时,自动转换数据的类型
2大类转换方式:隐式转换和强制转换
1. 隐式转换:不需要程序员干预,js自动完成的类型转换
隐式转换无处不在,只要js认为有必要。
仅讨论算数计算中的隐式转换:
1. 算数计算中,一切数据都默认转为数字,再计算
Boolean类型:true-->1 false-->0
特殊情况:如果数据无法被转为数字类型
会被转为NaN:Not a Number
表示 不是一个数字 的 数字
(含义) (类型)
NaN不等于,不大于,不小于任何值
NaN参与任何算数运算结果永远为NaN
2. 在+运算中,碰到字符串,+就变为字符串拼接
另一个不是字符串的数据,被自动转为字符串
表达式:变量,数据和运算符组成的公式
默认都是从左向右,两两运算
任何表达式都有1个运算结果
所以任何表达式都可以当一个值使用
2. 强制转换:程序员主动调用专门的函数,执行转换
何时使用:自动转换的类型,不是想要的
任意-->字符串:2个API
x.toString(); x不是undefined或null时,才可用
String(x) --> 相当于隐式转换-->万能
typeof(x)-->返回x的数据类型名称
任意-->数字:3个API
Number(x): 专用于将非字符串类型转数字
相当于隐式转换
将字符串转为数字:2个API
parseInt(str): 从第一个字符开始
整数 依次读取每个数字
只要碰上第一个非数字字符就停止
自动跳过开头的空字符
***不认识小数点
何时使用:将字符串转为整数时
parseFloat(str):用法同parseInt
浮点数 ***认识第一个小数点
何时使用:将字符串转为小数时
Number(x) vs parseInt(str)
var b=true;
console.log(Number(b)) //1
console.log(parseInt(String(b))) //NaN
"true"
var width="60px";
console.log(Number(width)) //NaN
console.log(parseInt(width)) //60
任意类型-->Boolean: Boolean(x)-->相当于隐式转换
只有5个值转为false:
"" NaN undefined null 0
其余都转为true!
快速转换:任意转String: x+"";
任意转Boolean: !!x
2. ***运算符和表达式:
程序:*人脑的想法*在计算机中的执行
运算符:让程序模拟人类想法的特殊符号
表达式:变量,数据和运算符组成的公式
所有表达式都有一个结果-->都可以当一个值用
1. 算数运算:+ - * / % ++ --
%取余数(模运算):
比如:n%m n/m,不取商,而取除不尽的余数
何时使用:2大用途:
1. 判断能否整除:比如判断奇数,偶数
n%2 等于0,可被2整除,——偶数
n%2 不等0,不可被2整除,——奇数
2. 保证运算结果绝不超过除数
++递增 --递减
2种:都会将变量n中的值+1,再存会n中
++n : 表达式返回n的*新*值
n++ : 表达式返回n的*旧*值
3. 关系运算:将两个值做比较-->返回值:true、false
> < >= <= == !=
***关系运算中:
1. 默认将所有类型转为数字再比较
2. 如果参与比较的两值*都是字符串*
依此取出每个字符串的字符,PK unicode
比如:var name1="scott";
var name2="john";
console.log(name1>name2);
何时使用:只要判断条件,条件一般都为关系运算
2个特殊情况:
1. NaN:NaN不等于,不大于,不小于任何值(包括自己)
NaN和任何数据做!=比较时,始终返回true
问题:无法判断一个数字是否为数字
解决:isNaN(n):本意是判断一个值是否是NaN
n是NaN,返回true;否则返回false
如何判断一个值是否为数字:
!isNaN(n)-->!true-->false-->n不是数字
!false-->true-->n是数字
2. undefined vs null
undefined: 所有未赋值的变量的默认值——自动赋值
null:*主动*释放或清空一个变量中的值
undefined和null其实是同一个东西
全等:=== 首先类型相同,同时值相等
不带隐式转换的等于比较
何时使用:区分undefined和null时
只要要求类型相同,且值相等时
2. 逻辑运算:将多个关系运算综合起来,得出最终结论
返回值:true、false
何时使用:程序中,只要判断条件超过1个时
3种:&& || !
且 或 非
&&:两个条件必须都为true,才返回true
只要有一个为false,则返回false
||:两个条件只要有一个为true,就返回true
除非所有条件都为false,才返回false
***短路逻辑:逻辑运算中,只要前一个条件已经可以得出最终结论,后续条件,不再执行!
如何利用短路逻辑:
1. 1件事,满足条件就做,不满足条件,就不错!
条件&&(操作);
何时使用:如果操作仅有一两句话时
2. 如果前一个值有效,就用前一个,否则就用后一个
值1||值2
***逻辑运算中的隐式转换:将所有参与逻辑判断的条件都转为Boolean类型。("" null undefined NaN 0)
3. 位运算:左移<< 右移>>
n<<m: 将n的二进制数所有位,左移m位
n* 2的m次方
n>>m: n/ 2的m次方
4. 扩展赋值运算:+= -= *= /= %=
n+=m: n=n+m 将n中的值增加m,再存回n中
n*=m: n=n*m
何时使用:今后,只要直接累加,累减,累乘原变量时
5. ***三目运算:三元运算,条件运算
什么是:根据不同的条件,执行不同的操作/返回不同的值
语法:
条件1?值1或操作1: //如果满足条件1,就返回值1或执行操作1
条件2?值2或操作2: //否则,如果满足条件2,就返回值2或执行操作2
...?..........:
默认值或操作; //否则,(前边条件都不满足)
//执行默认操作,或返回默认值
总结:多个条件,多件事,多选一执行。
js:如果操作语句比较简单,建议用三目运算替代if..else