最近被算法虐待的有些懈怠了。感觉刷 MDN 好像对我的帮助没有那么大…
就是这样,每次需要坚持的时候就怀疑坚持下去的意义导致坚持不下去。
这时候就想做一只把头埋进沙子里的鸵鸟,不要去想意义,先做就好。
JS 有以下运算符
| 名字 | 简写的操作符 | 含义 |
|---|---|---|
| 赋值(Assignment) | x = y | x = y |
| 加法赋值(Addition assignment) | x += y | x = x + y |
| 减法赋值(Subtraction assignment) | x -= y | x = x - y |
| 乘法赋值(Multiplication assignment) | x _= y | x = x _ y |
| 除法赋值(Division assignment) | x /= y | x = x / y |
| 求余赋值(Remainder assignment) | x %= y | x = x % y |
| 求幂赋值(Exponentiation assignment) | x **= y | x = x ** y |
| 左移位赋值(Left shift assignment) | x <<= y | x = x << y |
| 右移位赋值(Right shift assignment) | x >>= y | x = x >> y |
| 无符号右移位赋值(Unsigned right shift assignment) | x >>>= y | x = x >>> y |
| 按位与赋值(Bitwise AND assignment) | x &= y | x = x & y |
| 按位异或赋值(Bitwise XOR assignment) | x ^= y | x = x ^ y |
| 按位或赋值(Bitwise OR assignment) | x | = y | x = x | y |
var foo = ['one', 'two', 'three'];
// 不使用解构
var one = foo[0];
var two = foo[1];
var three = foo[2];
// 使用解构
var [one, two, three] = foo;
这里要注意严格等和非严格等
严格等先判断类型是否相等,再判断值是否相等
非严格等判断类型是否相等,不相等则转换为同一类型后再判断值是否相等。
算数运算符主要要考虑 + 号同时是字符串连接符,字符串连接运算要优先于加法运算。
求余、自增减、负数、
一元 + :一元运算符, 如果操作数在之前不是 number,试图将其转换为 number
二元**:计算 base(底数) 的 exponent(指数)次方, 表示为 base^exponent
位运算符将它的操作数视为 32 位元的二进制串。
但是返回结果是标准的 JavaScript 数值。
无符号右移
把 a 的二进制表示向右移动 b 位,丢弃被移出的所有位,并把左边空出的位都填充为 0
a>>>b
而算术右移左边空出的位是根据最高位是 0 和 1 来进行填充的
注意位运算符“非”将所有的 32 位取反,而值的最高位(最左边的一位)为 1 则表示负数(2-补码表示法)。
能被转换为 false 的值有 null, 0, NaN, 空字符串(“”)和 undefined。
注意短路问题
false && anything // 被短路求值为 false true || anything // 被短路求值为 true
+
简写操作符 += 也可以用来拼接字符串
var myString = 'alpha';
myString += 'bet'; // 返回 "alphabet"
a ? b : c
var status = age >= 18 ? 'adult' : 'minor';
对两个操作数进行求值并返回最终操作数的值。它常常用在 for 循环中,在每次循环时对多个变量进行更新。
var x = [0, 1, 2, 3, 4, 5, 6, 7, 8, 9];
var a = [x, x, x, x, x];
for (var i = 0, j = 9; i <= j; i++, j--)
console.log('a[' + i + '][' + j + ']= ' + a[i][j]);
delete objectName.property;
delete ArrayName[index];
delete property; // legal only within a with statement
第三行的形式只在 with 声明的状态下是合法的, 从对象中删除一个属性。
你能使用 delete 删除各种各样的隐式声明, 但是被 var 声明的除外。
如果 delete 操作成功,属性或者元素会变成 undefined。如果 delete 可行会返回 true,如果不成功返回 false。
x = 42;
var y = 43;
myobj = new Number();
myobj.h = 4; // create property h
delete x; // returns true (can delete if declared implicitly)
delete y; // returns false (cannot delete if declared with var)
delete Math.PI; // returns false (cannot delete predefined properties)
delete myobj.h; // returns true (can delete user-defined properties)
delete myobj; // returns true (can delete if declared implicitly)
删除数组中的元素时,数组的长度是不变的,例如删除 a[3], a[4],a[4]和 a[3] 仍然存在变成了 undefined。
delete 删除数组中的一个元素,这个元素就不在数组中了。例如,trees[3]被删除,trees[3] 仍然可寻址并返回 undefined。
var trees = new Array('redwood', 'bay', 'cedar', 'oak', 'maple');
delete trees[3];
if (3 in trees) {
// 不会被执行
}
如果想让数组中存在一个元素但是是 undefined 值,使用 undefined 关键字而不是 delete 操作. 如下: trees[3]分配一个 undefined,但是这个数组元素仍然存在:
var trees = new Array('redwood', 'bay', 'cedar', 'oak', 'maple');
trees[3] = undefined;
if (3 in trees) {
// this gets executed(会被执行)
}
typeof 操作符返回一个表示 operand 类型的字符串值。operand 可为字符串、变量、关键词或对象,其类型将被返回。operand 两侧的括号为可选。
var myFun = new Function('5 + 2');
var shape = 'round';
var size = 1;
var today = new Date();
typeof myFun; // returns "function"
typeof shape; // returns "string"
typeof size; // returns "number"
typeof today; // returns "object"
typeof dontExist; // returns "undefined"
typeof true; // returns "boolean"
typeof null; // returns "object"
typeof 62; // returns "number"
typeof 'Hello world'; // returns "string"
typeof document.lastModified; // returns "string"
typeof window.length; // returns "number"
typeof Math.LN2; // returns "number"
typeof blur; // returns "function"
typeof eval; // returns "function"
typeof parseInt; // returns "function"
typeof shape.split; // returns "function"
typeof Date; // returns "function"
typeof Function; // returns "function"
typeof Math; // returns "object"
typeof Option; // returns "function"
typeof String; // returns "function"
void 运算符,表明一个运算没有返回值。
你可以使用 void 运算符指明一个超文本链接。该表达式是有效的,但是并不会在当前文档中进行加载。
如下创建了一个超链接文本,当用户单击该文本时,不会有任何效果。
<a href='javascript:void(0)'>Click here to do nothing</a>
<a href='javascript:void(document.form.submit())'>Click here to submit</a>
如果所指定的属性确实存在于所指定的对象中,则会返回 true
// Arrays
var trees = new Array('redwood', 'bay', 'cedar', 'oak', 'maple');
0 in trees; // returns true
3 in trees; // returns true
6 in trees; // returns false
'bay' in trees; // returns false (you must specify the index number,
// not the value at that index)
'length' in trees; // returns true (length is an Array property)
// Predefined objects
'PI' in Math; // returns true
var myString = new String('coral');
'length' in myString; // returns true
// Custom objects
var mycar = { make: 'Honda', model: 'Accord', year: 1998 };
'make' in mycar; // returns true
'model' in mycar; // returns true
如果所判别的对象确实是所指定的类型,则返回 true。
var theDay = new Date(1995, 12, 17);
if (theDay instanceof Date) {
// statements to execute
}
| 成员 | . [] |
| 调用 / 实例创建 | () new |
| 取反/自增 | ! ~ - + ++ – typeof void delete |
| 乘/除 | _ / % |
| 加/减 | + - |
| 位移 | << >> >>> |
| 关系 | < <= > >= in instanceof |
| 等于 | == != === !== |
| 位与 | & |
| 位异或 | ^ |
| 位或 | | |
| 逻辑与 | && |
| 逻辑或 | || |
| 条件运算 | ?: |
| 赋值 | = += -= _= /= %= <<= >>= >>>= &= ^= | = |
| 逗号 | , |
## 表达式
JavaScript 有以下表达式类型
this 关键字被用于指代当前的对象。
分组操作符()控制了表达式中计算的优先级
[for (i of [ 1, 2, 3 ]) i*i ];
// [ 1, 4, 9 ]
var abc = [ "A", "B", "C" ];
[for (letters of abc) letters.toLowerCase()];
// [ "a", "b", "c" ]
左值可以作为赋值的目标。
你可以使用 new operator 创建一个自定义类型或者是预置类型的对象实例。
var objectName = new objectType([param1, param2, ..., paramN]);
super 关键字可以用来调用一个对象父类的函数,它在用来调用一个类的父类的构造函数时非常有用,比如:
super([arguments]); // calls the parent constructor. super.functionOnParent([arguments])
扩展语句符允许一个表达式在原地展开, 当需要多个参数 (比如函数调用时) 或者多个值(比如字面量数组) 。
var parts = ['shoulder', 'knees'];
var lyrics = ['head', ...parts, 'and', 'toes'];
function f(x, y, z) {}
var args = [0, 1, 2];
f(...args);
评论0