《JavaScript权威指南》自学时记下的笔记。
DAY 2 in 2021/12/31
S4 表达式和运算符
原始表达式
包括三种:
1.常数值
2.保留字:true false null this
3.变量
对象和数组的初始化表达式
省略的数组元素是undefined:
var arr = [1,5];
属性访问
两种写法:一种用点,一种用方括号。如果有错就是undefined
运算符
优先级:乘法除法高于加法减法,赋值最后
结合性:一元操作符、赋值、三元条件运算符都是从右至左。
x = ~-y;
// x = ~(-y);
w = x = y = z;
// w = (x = (y = z));
q = a?b:c?d:e?f:g;
// q = a?b:(c?d:(e?f:g));
除法会认为是浮点数除法。
求余在面对浮点数时候也是:6.5%2.1=0.2
加法运算符:字符串和数字的转换,其中一个是字符串就会把数字转换为字符串
var a = "1";
var b = "4";
console.log(a*b,typeof(a*b));//4 number
console.log(a+b,typeof(a+b));//14 string
1 + “2” //“12”
“1” + 2 //“12”
2 + null // 2
2 + undefined //NaN
另外要考虑到结合性:
1 + 2 + “okok” //“3okok”
1 + (2 + “okok”) //“12okok”
一元运算符:+ - ++ –
前后++区别belike:后++自增但是,返回的是原来的值
var i = 1, j = ++i;//i=2,j=2
var i = 1, j = i++;//i=2,j=1
++x并不和x = x+1一样:
var x = "1";
console.log(++x);//2
x = "1";
x = x+1;
console.log(x);//"11"
关系表达式
=和不同,===不做类型转换直接false,==会做类型转换:
- null=undefined
- 如果是字符串和数字,字符串转换为数字
- true转换1,false转换0
- 对象转换为对应原始值
如下后者是false是因为转换为12,true转换为1
"1"==true //true
"12"==true //false
比较运算符也类似:
与加号不同,加号偏爱字符串;比较运算符偏爱数字,只有全是字符串才比较字符串
in运算符:对象中有某个属性名-true
instanceof:左侧是对象,右侧是标识类。
&& ||:从左往右计算。”短路“
if (a==b) stop(); //a==b时调用stop()
(a==b) && stop(); //等价于
逻辑或常用来在函数体内提供默认值
var mm = max_width || pre.max_width || 500//前面没有定义就往后面塞默认值
eval运算符:
ES5中,别名是全局eval,eval本身是局部的。严格模式下,只能改局部变量,不能定义新的变量或函数。
typeof运算符:
答案有:undefined object boolean number string function等
注意:null也会是object
最常用用法:
(typeof value == "string") ? "'"+value+"'" : value
delete运算符:
用来删掉属性或元素,返回true或者false。
注意:对于数组,删去的元素是一个空洞,长度未减!
var a = [1,2,3];
delete a[2];
console.log(2 in a);//false
console.log(a.length);//3
逗号:常用在循环中
for( var i=1, j=10; i<j; i++,j--)
console.log(i+j)
S5 语句
空语句的作用:初始化:
for(i==0; i<a.length; a[i++]=0) ;
声明语句:
函数声明也和var一样,会提前到顶部,但是整体上都可见。但可以在声明一个JS函数之前调用它。
函数声明的{}必须有。
if后的()必须有。
switch中的case是===,default可以放在任意位置(不一定要放最后)。
循环中,for/in可以来遍历属性:
var o ={ x:123, y:456};
for(var p in o){
console.log(o[p]);
}
//123
//456
语句标签:
break和continue唯一可以使用,只在起作用的语句内有定义。
可以嵌套。任何语句可能有多个语句标签。
注意break不能跳出函数外面。
mainloop: while(XXXX){
//....
continue mainloop;
//...
break mainloop;//直接跳出该块
//...
}
with语句:只能赋值不能创建新语句。