操作符:算术操作符、比较操作符、逻辑操作符、其他操作符
js弱数据类型语言:隐式的数据类型转换
1、 逻辑运算符
(1)逻辑与 && (同真才真,有假则假)
可应用于任意数值,如果有一个操作数不是布尔类型,逻辑与就不一定返回boolean类型;
如果第一个操作数是null,NaN,undefined,false,0," ",可被转换为false的值的时候返回该值;
如果第一个数其他,返回第二个数;
表达式 && 表达式
true && true ==> true
true && false ==> false
false && false ==> false
false && true ==> false
短路:有一个为false-->false
(2)逻辑或 || (有真则真,同假则假)
如果两个操作数是null,NaN,undefined,false,0," ",可被转化为false的值的时候返回该值;
如果第一个操作数是null,NaN,undefined,false,0," "则返回第二个操作数;
表达式 || 表达式
true || true ==> true
true || false ==> true
false || false ==> false
false || true ==> true
短路:有一个为true-->true
(3)逻辑非 !
该操作符应用任何类型数值都返回一个[布尔值];先将任意类型的数值转换为Boolean,然后取反;
!a ==> !Boolean(a)
!0 // true
!"" // true
!NaN // true
!false // true
连用两次逻辑非,就可以将任意数据类型转换为Boolean类型
!! a ==> Boolean(a)
!!"" //false
2、 数据类型转换
(1)其他数据类型转换为String
toString()函数
除了null、undefined,其他三种基本数据类型的变量均有一个toString()函数,该函数可以获取该变量指定值的字符串表示;
number类型.toString();
boolean类型.toString();
var a = true;
a.toString(); //'true'
如果变量为number类型,默认情况下toString()是以十进制格式返回数值的字符串表示,通过传递参数,可以输入以二进制,八进制,十六进制乃至任意有效进制格式的字符串值;
var num = 10;
num.toString(); // "10"
num.toString(2); // "1010"
num.toString(8); // "12"
num.toString(16); // "a"
String()函数
可以将其他任意基本数据类型的值转换为字符串表示,包括null,undefined;
加法 + ( m , n )
不做加法运算时,默认将其他数据类型转换为字符串表示
当 m ,n 不为String,Object类型的时候,先将 m ,n 转换为Number类型,然后再进行计算;
true + false // 1 Number(true) + Number(false) (1+0)
true + 1 // 2 Number(true) + 1 (1+1)
null + undefined // NaN Number(undefined) ---> NaN (0+undefined)
当 m ,n 有一个为String,无论另一个操作数为什么数据类型(但不为对象)都要转换为String,然后再进行拼接
"1"+true // 1 true
"1"+undefined // 1 undefined
"1"+1 // 1 1
当 m ,n 有一个对象,如果该对象既重写toString,又重写了valueOf方法,先调用valueOf方法获取返回值,将该返回值和另一个操作数进行运算。
如果该对象没有重写valueOf方法,将调用toString方法获取返回值,将该返回值和另一个操作数进行运算;
var o ={
name:'briup',
valueOf:function(){
return "1"; // return 1; 返回2
}
}
console.log(o+1); // 11
(2) 其他数据类型转换为Boolean类型
任意其他数据类型都可以转换为布尔类型
Boolean true false
String 非空字符串 ""
Number 任何非0 0/NaN
Object 任何对象 null
Undefined 不适用 undefined
(3) 其他数据类型转换为Number
Number()函数
如果转换的值是null,undefined,boolean,number
Number(true); // 1
Number(false); // 0
Number(null); // 0
Number(undefined); // undefined
Number(10); // 10 如果是数字值,原样输出
如果转换的值是string
Number("123"); // 123 如果仅包含数值,转换为对应的数值
Number("234.1"); // 234.1 解析为对应的小数
Number("+12.1"); // 12.1 首位为符号位,其余为数值,转换为对应的数值
Number("1+2.3"); // NaN NaN符号位出现在其他位置,解析为NaN
Number("0xa"); // 10 如果仅包含十六进制格式,转为对应的十进制的值
Number("010"); // 10 不会当作八进制被解析,结果为10
Number(""); // 0 空字符串转换为0
Number("123ac"); // NaN 包含其他字符,解析为NaN
Number(" 12"); // 12 如果仅包含数值,转换为对应的数值
parseInt()函数
如果转换的值是null,undefined,boolean,均转换为NaN
如果转换的值是string
Number("123"); // 123 如果仅包含数值,转换为对应的数值
Number("234.1"); // 234 小数点后面的数值省略
Number("+12.1"); // 12 首位为符号位,其余为数值,转换为整数
Number("1+2.3"); // 1 NaN符号位出现在其他位置,保留符号位前面的数值
Number("0xa"); // 10 如果仅包含十六进制格式,转为对应的十进制的值
Number("010"); // 10 不会当作八进制被解析,结果为10
Number(""); // NaN 空字符串转换为NaN
Number("123ac"); // 123 如果首位为数值,依次向后解析,找到连续的数值,直到遇到第一个非数值的,将之前获取的数值转换为Number返回
Number(" 12"); // 12 如果仅包含数值,转换为对应的数值
parseFloat() 函数
如果转换的值是null,undefined,boolean,均转换为NaN
如果转换的值是string
Number("123"); // 123 如果仅包含数值,转换为对应的数值
Number("234.1"); // 234.1 保留小数点后面的数值
Number("+12.1"); // 12 首位为符号位,其余为数值,转换为整数
Number("1+2.3"); // 1 NaN符号位出现在其他位置,保留符号位前面的数值
Number("0xa"); // 0 不会当作十六进制解析
Number("010"); // 10 不会当作八进制被解析,结果为10
Number(""); // NaN 空字符串转换为NaN
Number("123ac"); // 123 如果首位为数值,依次向后解析,找到连续的数值,直到遇到第一个非数值的,将之前获取的数值转换为Number返回
Number(" 12"); // 12 如果仅包含数值,转换为对应的数值
注意:
1.默认情况下,ECMAScript 会将小数点后带有6个零以上的浮点数转换为科学计数法;
console.log(0.0000003); // 3e-7
2.在进行算术计算时,所有以八进制、十六进制表示的数值都会被转换成十进制进行计算;
3.保存浮点数,需要的内存时整数的两倍,因此ECMAScript 在特殊情况下会将浮点数转换为整数;
var a = 1; // 1
var b = 1.0; // 1
var c = 2.0; // 2
4.避免测试某个特点的浮点数值,是使用IEEE754 数值的浮点计算的通病;
console.log(0.1+0.2); // 0.30000000000000004 避免这种情况,需要将浮点数转换为整数计算,计算结束后,再转换为浮点数;
3、流程控制语句
(1)分支语句
if 语句
if(condition) {
// code to run if condition is true
}
run some other code
condition表示任意表达式,该表达式求值的结果不一定是布尔类型,
如果不是布尔类型,ECMAScript会调用Boolean()转换函数将这个表达式结果转换为一个布尔类型;
当该值为true时,执行if代码块中的内容
if-else 语句
if(condition) {
// code to run if condition is true
}else{
run some other code instead
}
run some other code
当condition为true时,执行if代码块中的内容,否则,执行else代码块中的内容,
一般情况下,如果代码块中代码只有一行,可以省略大括号
if-else if-else 多条件分支语句
if(condition1){
condition1 ==>true
代码块1
}else if(condition2){
condition1 == false && condition2 == true
代码块2
}else if(condition3){
condition1、2 == false && condition3 == true
代码块2
}else if(condition4){
condition1、2、3 == false && condition4 == true
代码块2
}else{
condition1、2、3、4 == false
}
switch 语句
switch(expression) {
case choice1:
run this code;
break;
case choice2:
run this code instead;
break;
// include as many cases as you like
default:
actually,just run this code;
}
expression 可以是变量,也可以是表达式,当expression === choice,执行当前case代码块的代码;
每个case代码块都必须包含break;表示执行完当前代码块的内容跳出switch代码块;
当所有的case不满足情况下,执行default代码块的内容,default的位置可以随意;
(2)循环语句
一个循环语句应该具备三要素:计数器、循环结束条件、迭代器;
for 循环
for(initializer; exit-condition; final-expression) {
// code to run
}
while 循环
前测试循环语句,即在循环体内的代码被执行之前,就会对出口条件求值,因此循环体内的代码有可能永远不被执行
initializer
while(exit-expression) {
// code to run
final-expression
}
do-while 循环
后测试循环语句,即只有在循环体中的代码执行之后,才会测试出口条件,循环体内的代码最少被执行一次
initializer
do {
//code to run
final-expression
}while(exit-condition);
initializer 初始化值,一般为数字,仅会执行一次。也可以写到循环体外;
exit-condition 结束条件,通常使用逻辑运算符进行结束循环判断;每次执行循环体之前均会执行该代码进行判断;
final-expression 每次执行完循环体代码后执行,通常用于迭代使其更加靠近结束条件;
(3)关键字
break:如果想在所有迭代之前退出,即可使用break;当执行break后,会跳出循环体,执行下面的代码;
continue:与break不同,continue不会跳出循环;而是立即结束当前循环,进入下一次循环;
label:使用label可以在代码中添加标签,以便将来使用;(顶格自定义,对for循环取别名)
label:for(int i = 0 ; i<10 ;i++ ){
if( i == 5 ) {
break label;
}
}
注意:ECMAScript不存在块级作用域,在循环内部定义的变量也可以在外部访问到;