MDN速刷 JS JS指南篇——表达式与运算符

开始之前

最近被算法虐待的有些懈怠了。感觉刷 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

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 操作符

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 运算符,表明一个运算没有返回值。

你可以使用 void 运算符指明一个超文本链接。该表达式是有效的,但是并不会在当前文档中进行加载。

如下创建了一个超链接文本,当用户单击该文本时,不会有任何效果。

<a href='javascript:void(0)'>Click here to do nothing</a>
<a href='javascript:void(document.form.submit())'>Click here to submit</a>

关系操作符

in

如果所指定的属性确实存在于所指定的对象中,则会返回 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

instanceof

如果所判别的对象确实是所指定的类型,则返回 true。

var theDay = new Date(1995, 12, 17);
if (theDay instanceof Date) {
  // statements to execute
}

运算符优先级

成员 . []
调用 / 实例创建 () new
取反/自增 ! ~ - + ++ – typeof void delete
乘/除 _ / %
加/减 + -
位移 << >> >>>
关系 < <= > >= in instanceof
等于 == != === !==
位与 &
位异或 ^
位或 |
逻辑与 &&
逻辑或 ||
条件运算 ?:
赋值 = += -= _= /= %= <<= >>= >>>= &= ^= | =
逗号 ,

## 表达式

JavaScript 有以下表达式类型

  • 算数: 得出一个数字, 例如 3.14159. (通常使用 arithmetic operators.)
  • 字符串: 得出一个字符串, 例如, “Fred” 或 “234”. (通常使用 string operators.)
  • 逻辑值: 得出 true 或者 false. (经常涉及到 logical operators.)
  • 基本表达式: javascript 中基本的关键字和一般表达式。
  • 左值表达式: 分配给左值。

基本表达式

this

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

你可以使用 new operator 创建一个自定义类型或者是预置类型的对象实例。

var objectName = new objectType([param1, param2, ..., paramN]);

super

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

  • 还没有评论,来说点什么吧。