运算符
- + 数学运算和字符串连接, 任何数据加上字符串都等于字符串。
var a = 1 + 1 + "a" + 1 + 2; (a="2a12")
var a = 1 + 1 + "a" + (1 + 2); (a="2a3")
var a = "aa" + true; (a= "aatrue") - +; -; *; /; %; = ; ()
var a = 1 / 0; (a = NaN) NaN(Not a Number)代表非数,但是它是一个数字类型的值;
凡是JS 觉得结果应该是一个数字,但是又不知道如何去表示的,就用 NaN 来代替;
var a = b = 10; 赋值的顺序 自左向右; 运算的顺序 自右向左 特殊运算符特殊处理 : 优先级 = 最弱 () 最高;其他的是先乘除后加减 - ++; --; +=; -=; *=; /=; %=
var a = 1; console.log(a ++); 打印 1
var a = 10; a += 10; (a:20)
var a = 10; a += 10 + 1; (a:21) 相当于 先算右边 10 + 1 然后 a = a + 11;
var a = 10; a += 10 + "1"; (a:"10101") - 较运算符 >; <;==; <=; <=; != 逻辑运算符结果为 boolean 值
var a = 1 == "1"; (a = true;)
var a = 1 == true (a = true)
var a = 1 != true; (a = false)undefined == null; (true, 这是系统定义的,没有隐式转换规则)
NaN == NaN; (false, 两边的东西一样的都相等, 除了这个特例, 非数不等于任何东西包括自己)
{} == {}; (false 对象和对象之间比对的是放置对象地址的房间,这是俩房间不会相等的)
引用值比对的事地址,地址一样才相等 var obj = {}; var obj1 = obj; obj1 === obj; (true 绝对相等,比的就是地址 无论是 == ===)
var a = 1 > 2; (a = false)
var a = "a" > "b"; (a = false; 字符串比的是 Ascii 码顺序)
var a = "1" > "2" (a = false)
var a = "10" > "2" (a = false, 就是说 它把十看成是一零, 1 和 2 比,有结果了之后压根不比后面的字了)
var a = "1 刘飞" > "2 呵呵" (a = false 先从第一个开始比 ascii, 如果第一个字符已经分出高下,后面就不用比了);
var a = 1 > "2"; (false 有数字参与比较的话,就会两边先隐式转换成数字)
var a = false > true; (a = false, 用的是 0 和 1 来比)
var a = 1> 2> 3; (a = false, 1>2 = false = 0; 0> 3 = false)
var a = undefined > 0; undefined < 0; NaN> 0; NaN < 0; "123abc">0; "123abc"<0; (a=false; 相当于 先把 undefined 用 Number() 隐式转换成 NaN,它和 0 压根就没法比) - 逻辑运算符 && || ! 与或非 隐式转换用的是 Boolean()
只有这六个值转换成 Boolean 值是 false, 其他全是 true : undefined, null, NaN, ""(空字符串), 0, false
- var a = 表达式1 && 表达式2 && .... && 表达式n-1 && 表达式n
&& 与运算符:
看第一个表达式 "表达式1" 转换成 boolean 值是否为真,如果结果为真那么往后看下一个表达试的结果,下一个是真就一直再往后看,直到 "表达式n-1" 也是真的话,就返回最后一个 表达式n 的值;
如果第一个表达式为假,那么就直接返回第一个表达式的值
如果第一个表达式为真,第二个表达式为假,就返回第二个表达式的值; 以此类推
如: var a = 1 + 1 && "你好" && 3 -1; (a = 2;)
2 > 1 && document.write("a"); 这样可以当做一个短路语句, 不关注返回值,只有在 2 > 1 条件成立的时候,才执行后面的语句。 实际用的时候,就是我们在接收后端传过来的数据的时候来做一个判断
var data = "后端传过来的数据";
data && 函数("data 的值是有意义的时候才执行这个函数");
Tips: JS 里的 单个 & 也是与运算符,但是没有什么用,是来比二进制的东西,就知道 & 和 && 是不同的东西就行了, & 没有什么用. - || 或运算符
参考&&运算符, 只不过它是相反的。 var a = 表达式1 || 表达式2 || .... || 表达式n-1 || 表达式n; 表达式1 是真的话就马上返回表达式1的值,不管后面了。 如果是假的话 就再看表达式2的情况。
实际应用的情况是这样
div.click = function (e) {
//这个 e 在非 IE 浏览器是有值的,在IE 浏览器里是 undefined;
// IE 浏览器下 想要得到和 e 一样的值 叫作 window.event; 而在其他浏览器下 window.event 的值是 undefined;
//所以我们用这个方法来写兼容
var event = e || window.event;
} - ! 非 把表达式转换成 boolean 值然后取反,所以 ! 的结果一定是一个 boolean 值
var a = !"123"; (a = false)
var a = !!NaN; (a = false) - (,) 逗号操作符 要配合括号使用
(a, b) 会返回 b 的值
var num = 1,2; 不带括号的话,它会报错,因为它会识别成 var num = 1; var 2; 把 2 当成是变量声明了,语法混乱
条件语句 if; else if; else;
if 和 && 的互相转化
if ( 1 > 2) {...} === 1 > 2 && ...
条件补充语句 switch case; break; continue;
switch(a)
{
case 1: document.write ("a");
case "2": document.write ("b");
case true: document.write ("c");
}
switch 语句很不服责任,当 a = 1 的时候,它会继续执行下面的东西 也就是说它会打印 abc, 所以 switch 的每个 case 后要用 break 跳出来;
但是有时候特意不用 break, 要利用 switch 往下漏的原理实现多条件判断:
switch (data){
case "周一":
case "周二":
case "周三":
case "周四":
case "周五": document.write ("工作"); break;
case "周六":
case "周日": document.write ("休息"); break;
}
break: 终止循环,跳出 switch;
continue: 终止本次循环,进行下一次循环;
循环: for; while; do.. while
For 循环重点,执行顺序很重要
for ( var i = 1; i <= 10; i ++) {document.write ("a");}
// 执行顺序如下:
// 1. 先 var i = 0
// 2. 把中间的条件判断拿到 if 中 if ( i < 10 ) {document.write ("a");}
// 3. i ++;
// 4. 把中间的条件判断拿到 if 中 if ( i < 10 ) {document.write ("a");}
// 5. i ++;
// 6. 把中间的条件判断拿到 if 中 if ( i < 10 ) {document.write ("a");}
// 7. i ++;
.... 知道中间的 if 判断是 false 后,马上结束循环.
所以它相等于
var i = 1;
for (; i<= 10;){document.write ("a");
i++;
}
这里 for 循环的第一个表达式和第三个为空, 那就不执行了。
也等于如下: 只要我们掌握了执行顺序,就可以任意写了
var i = 1;
for (; i;) {document.write ("a");
i++;
if (i == 11) i = 0;
}
var i = 100;
for (;i--;){
//打印出来 100 到 1 的数字;
}
while 循环
for (; i < 10 ;) {for 循环第一个表达式和第三个表达式不写就是 while 循环, 也就是说 while 循环的底层方法就是for}
var i = 0; while (i<10) {巴拉巴拉; i++}
do .. while 循环
do {
//没人用,无论条件行不行,先循环一遍。
} while(条件)
For in 遍历对象
var person = {name:"tracy", sex:"girl"}
for(x in person) {//x 为属性名
console.log(x + person[x]);
//Tips 不能这么写,会报错: console.log(x + person.x);
}