javascript-表达式与操作符
1.数组初始化
二维数组
let matrix=[[1,2,3],[4,5,6],[7,8,9]];
未定义元素undefined
let sparseArray=[1,,,,5];
包含三个未定义元素
2.对象初始化
let p={x:2.3,y:-1.2};点对象包含x,y坐标
let q={};空对象
q.x=2.3;q.y=-1.2;赋值
3.函数
let square=function(x){return x*x;};
4.属性访问符。包括.和[]
let o={x:1,y:{z:3}};
let a=[o,4,[5,6]];
o.x;//1
o.y.z//3
o["x"]//1
a[1]//4
a[2]["1"]//6
a[0].x//1
如未找到,会返回undefined
5.条件属性运算符?.
a?.b
如果a是Null或undefined,表达式返回Undefined。当a不为null,undefined会返回a.b的值。
let a{b:{}};
a.b?.c?.d//undefiend,.c会返回Undefined
?可以用于?.[],它有短路效应。
let a;
let index=0;
try{
a[index++];
}catch(e){
index;//值为1
}
a?.[index++];
index;//值依然为1,a?触发了短路
a[index++];//抛出TypeError异常
6.条件运算符用于函数调用。
function square(x,log){
log?.(x);//试图调用Log方法,如果为undefined或null,就不调用。不抛出异常
return x*x;
}
注意条件运算符在这里只判断log是否为Null或undefined,如果log为一个值不为函数,还是会抛出异常。
函数调用条件运算符依然有短路效应。
例:
o.m()//例1
o?.m()//例2
o.m?.()//例3
例1:o必须是一个对象,m是该对象的方法
例2:如果o为Null或undefined,返回Undefined。如果o不为前述两者,它必须包含一个m方法
例3:o必须不是null和undefined,它如果包含一个m方法,调用方法。如果不含M方法,则返回undefined
例2是对o进行判断,例3是对o.m方法进行判断。
7.一些有特点的操作符
(1)typeof 返回类型名的字符串
(2) ~位取反运算符
(3)void 返回undefined
(4)**幂运算符
(5)<<左移运算符
(6)>>右移运算符,包含符号位
(7)>>>右移运算符,以0填充符号位
(8)instanceof测试对象类?
(9)in判断属性是否存在
(10)== !=不严格相等,不等运算符。判断前会进行类型转换
(11)=== !==严格相等,不等运算符。会首先判断左右两边类型
(12)& | ^位与,位或,位异或
(13)&& ||逻辑与逻辑或
(14)?? ?.
javascript /操作符。浮点数运算。返回浮点数,如果操作数是Int也会返回浮点数。0/0会返回NaN。不会报错。
%取模操作符在浮点数下依然可以使用。6.5%2.1得到0.2
8.加法运算符的逻辑
(1)操作数是对象,会调用valueOf()方法进行转换,如果无有效的valueOf会使用toString()方法转换
(2)如果转换完成后有字符串,会进行拼接
(3)如果转换完成都是数,会进行加法。
例:2+undefined//NaN
9.一元加运算符:将操作数转化为一个数。不能使用在BigInt中
一元减运算符:转化为一个数,并取反
=操作符,对象含有相同的值也不相等,他们可能指向不同的堆空间。数组也一样。不能简单使用=和!==。
NaN始终不相等。
9.3 in运算符
左侧是string ,symbol,或可以被转换为字符串的值。右侧是对象
当左侧是右侧的属性时,运算结果为ture
例:
let point={x:1,y:1};
"x" in point //true
"z" in point //false
"toString" in point//true 对象继承了toString方法
let data=[7,8,9];
"0" in data//true 有0下标
1 in data//true
3 in data//false 下标范围为0-2
9.4 instanceof 操作符
运算符左侧是对象,右侧是类。如果左侧是右侧的实例,则返回true。
左侧如果不是对象,会返回false
右侧如果不是类,则throw TypeError
例:
let d=new Date();
d instance of Date//true
d instance of Object//true
d instance of Number//false
let a=[1,2,3];
a instanceof Array//true
a instanceof Object//true
a instanceof RegExp//false
13.??操作符。first-defined操作符。
如果左操作数不是null或undefined。返回左值。若是null或undefined返回右值。??操作符也有短路效应。
左操作数是false也会返回左操作数,只检查它是不是null,undefined
例:
let options={timeout:0,title:"",verbose:false, n: null};
options.timeout??1000//返回0,timeout在options里有定义。
options.title??"Untitled"//返回"",原因同上
options.verbose??true//返回false
options.quiet??false//返回false,quiet在options里未定义
options.n??10//返回10,n是null,返回右操作数
14.typeof操作符
x typeofx
undefined "undefined"
null "object"
true or false "boolean"
any number orNaN "number"
any BigInt "bigint"
any string "string"
any symbol "symbol"
any function "function"
any nonfunction object "object"
注意Null的typeof是object,如果要测试是不是Null,需要另行测试
15.删除操作符delete
let a=[1,2,3];
delete a[2];
2 in a//false
a.length//3,数组长度不会改变。
delete操作符会删除属性,试图访问删除后的属性会返回undefined,删除数组后数组长度不会改变。会产生一个“空洞”
delete期待的是被删除操作数是一个左值。如果不是左值,会不采取操作返回true。
严格模式中,delete变量,函数,函数参数会返回SyntaxError。试图删除non-configurable属性会产生TypeError
delete成功会返回true,失败会返回false。例:
let o={x:1,y:2};
delete o.x;//true
typeof o.x //undefined
delete o.x//删除一个不存在的属性,返回true
delete 1;//没有效果,但返回true,如果是严格模式strict mode会返回false或SyntaxError
delete o;//false,TypeError