发表于: 2018-05-31 22:50:11
1 570
今天完成的事情,学习了js操作符
明天计划的事情,学习js变量、作用域和内存的问题;
今天的收获:
- 逻辑非 ! 无论这个值是什么数据类型,非操作符都会将它转换为一个布尔值,然后再求反;一般用来判断某个元素是否存在,也可以用来转换一个值相应的布尔值,需要同时使用两个操作符 !!
var a = 10;
function text () {
if ( a != 0) {
a= 30;
}
}
text(); //a=30
- 逻辑与 && (一般用在条件判断语句 ,两个true就会返回true,只要有一个false就返回false;
- 第二个操作数是对象,只有在第一个操作数的求值结果为true的情况下才会返回对象
var a = true;
console.log(a && “b”);//返回b
var a = false;
console.log(a && "a");//返回false
- 第一个操作数是对象,就返回第二个操作数
var a = true;
console.log("b" && a);//返回true
- 两个操作数都是对象,就会返回第二个操作数
console.log(“b" && "a");//返回a
- 第一个操作数是NaN,就会返回NaN;
- 第一个操作数是null,就会返回null;
- 第一个操作数是undefined,就会返回undefined;
- 与操作符属于短路操作,第一个操作符是false,就不会对第二个求值了,第一个是true,就会对第二个求值,如果第二个没有声明的话就会报错;
var b = true;
console.log(b && number);//number is not defined
- 逻辑或 || ,只要有一个真就返回真,两个false就返回false;
- 第一个操作数是对象,就返回第一个操作数
var a = false;
console.log( "b" || a);//返回b
- 第一个是求值结果是false,第二个操作数是对象,返回第二个操作数; 第一个求值结果是true,返回true;
var a = false;
console.log( a || "b");//返回b
- 两个操作数都是对象,则会返回地一个操作数, 和&&操作符刚好相反,&&是取得第二个操作数;
console.log( “a" || "b");//返回a
- 两个操作数同时都是 unll / undefined / NaN ,就会返回null/undefined/NaN;
- 或操作符也是短路操作符,第一个求值结果为true,就不会对第二个操作数进行求值了,
- 乘性操作符,操作数不是数值,后台会先使用number( )转型函数将其转换为数值,空字符串当做0,布尔值true当做1
- 乘法 规则
- 两个数都是数值,按正常乘法计算,如果超过了数值范围,返回Infinity或者-Infinity;
- 一个操作数是nan,结果是nan, infinity和0相乘,结果是nan;
- infinity和非0的数值相乘,返回的结果是infinity或者-infinity,结果取决于有符号操作数的符号;infinity和infinity相乘的结果是infini;
- 如果有一个操作数不是数值的话,后台会调用number( )方法转换为数值再应用上面的规则;
- 除法 规则
- 操作数都是数值,按常规的除法计算,商超出了ECMAScript数值的表示范围,就返回infinity或者-infinity;
- 只要有一个操作数是nan,返回的结果就是nan。
- infinity除以infinity的结果是nan;0 被 0 除,结果是nan;
- 如果是非零的有限数被零除,结果是infinity或者-infinity ,infinity被任何非零数值除,结果和左边相同;
console.log(5/0);//Infinity
- 如果不是数值,后台会调用number( )转换为数值,再应用上面的规则
- 求模
- 如果被除数是无穷大的而除数是有限大的值,会返回nan;
vara=NumberMAX_VALUE*NumberMAX_VALUE
console.log(a % 12); // NaN
- 如果被除数是有限大的数值而除数是零;返回NaN
console.log( 12 % 0 );// NaN
- infinity被infinity除,结果是NaN
- 被除数是有限大的数值而除数是无穷大的数值,结果是被除数;
var a = Number.MAX_VALUE * Number.MAX_VALUE;
console.log(12%a);//12
- 被除数是零,结果是零
- 不是数值会调用number()方法转换为数值,再进行上面的操作;
- 加性操作符
- 加法 + ,如果两个操作数都是字符串,纳闷两个字符串将会被拼接起来; 只有一个操作数是字符串,则将另一个操作数转换为字符串,然后再拼接起来;
- 有一个nan,结果是nan; infinity+infinity=infinity ,-infinity+-infinity=-infinity,+infinity+-infinity=nan;
- +0 + -0 =+0;
- 减法 - ,减法和加法不一样的地方就是如果是字符串的话,减法会调用number( )将其转换为数值,然后再进行减法计算了;
- 关系操作符 <、 >、 <=、>=
- 两个操作数都是数值的话就正常数值比较;
- 两个操作数都是字符串,比较两个字符串对应的字符编码(如果字符串内含有多个字符,只会比较第一个字符),ASCII码http://ascii.911cha.com/ ,转换位ascii码的方法是charCodeAt();
- 一个操作数是对象的话就会调用value( )方法或者tostring( )方法,然后按照前面的规则比较
- 如果一个操作数是布尔值,则先将其转换为数值,然后再执行比较;
- 相等操作符 ==相等,!=不相等(先转换操作数再比较),===全等 !==不全等(不转换直接比较)
- 相等和不相等的转换规则
- 一个操作数是布尔值,转换,false为0,true为1;
- 一个是字符串,一个是数值,先将字符串转为数值;
- 一个操作数是对象,另一个不是,调用对象的valueof( )方法,再比较;
- 比较规则
- null和undefined 是相等的,比较之前不能将null和undefined转换为其他任何值; 但是在全等的情况下是不相等的;
console.log(null==undefined);//true
表达式 | 值 | 表达式 | 值 | 表达式 | 值 |
null == undefined | true | false == 0 | true | “5” == 5 | true |
“nan” == nan | false | true == 1 | true | ||
5 == nan | false | true == 2 | false | ||
nan == nan | false | undefined == 0 | false | ||
nan != nan | true | null == 0 | false |
- 全等和不全等 ===全等 !==不全等 ,只在两个操作数未经转换就相等的情况下就返回true
- (三元)条件操作符
- var max = (num1 > num2) ? num1 : num2 这个例子是说max会保存一个最大值,也可以这样理解条件操作符,如果num1>num2, num1的值赋给max,否则num2的值赋给max;
- 可以用来简化判断,上面的例子其实就是if else的语句
- 赋值操作符 ,
var num = 10 ;
num = num +10; 等价于 num += 10; 符合赋值操作符;
- 逗号操作符
- 可以在一条语句中执行多个操作,在赋值的时候用逗号操作符会返回表达式的最后一项;
- break语句
- break与语句会立即退出最内层循环,强制执行循环后面的语句,如果后面还有语句的话;
var num = 0;
for (var i = 1; i < 10; i++) {
if (i % 5 == 0) {
break;
}
num++;
console.log(num);// 1 2 3 4
}
- continue语句也是立即退出循环,但退出循环后会从循环的顶部继续执行,只要控制表达式满足,就会再次进行循环,直到不满足条件,然后继续执行循环后面的语句;
var num = 0;
for (var i = 1; i < 10; i++) {
if (i % 5 == 0) {
continue;
}
console.log(i);
num++; // 1 2 3 4 6 7 8 9
}
- label语句,一般配合break和continue在for中使用,让退出跳转到要返回到的标签(位置),一般在多层嵌套中使用!
- 使用label语句一定要使用描述性的标签,同时不要嵌套过多的循环;
评论