💙《JavaScript高级程序设计》 | 语言基础(下篇)

88 阅读5分钟

开启掘金成长之旅!这是我参与「掘金日新计划 · 12 月更文挑战」的第14天,点击查看活动详情

3.5 操作符

一元操作符


i++ / i--: 先执行,后加减 1;

--i / ++i:先加减 1,后执行;

位操作符


按位非操作符用波浪符(~)表示,它的作用是返回数值的一补数

按位与操作符用和号(&)表示,有两个操作数:结果一假则假;

按位或操作符用管道符(|)表示,同样有两个操作数:结果一真则真;

按位异或用脱字符(^)表示,同样有两个操作数:结果同则假,异则真;

左移操作符用两个小于号(<<)表示,会按照指定的位数将数值的所有位向左移动:位数向前进相应位数;

有符号右移由两个大于号(>>)表示,会将数值的所有 32 位都向右移,同时保留符号(正或负)。 有符号右移实际上是左移的逆运算;

无符号右移用 3 个大于号表示(>>>),会将数值的所有 32 位都向右移。对于正数,无符号右移与有符号右移结果相同;对于负数是其绝对值的二补数;

布尔操作符


逻辑非操作符由一个叹号(!)表示,将操作数转换为布尔值,然后再对其取反。

逻辑与操作符由两个和号(&&)表示,应用到两个值:结果一假则假;

逻辑或操作符由两个管道符(||)表示,应用到两个值:结果一真则真;

乘法、除法和取模


乘法操作符由一个星号(*)表示,可以用于计算两个数值的乘积;

除法操作符由一个斜杠(/)表示,用于计算第一个操作数除以第二个操作数的商;

取模(余数)操作符由一个百分比符号(%)表示。

指数操作符


ECMAScript 7 新增了指数操作符,Math.pow()现在有了自己的操作符 **

console.log(Math.pow(3, 2); // 9
console.log(3 ** 2); // 9
console.log(Math.pow(16, 0.5); // 4
console.log(16** 0.5); // 4

// 不仅如此,指数操作符也有自己的指数赋值操作符**=,该操作符执行指数运算和结果的赋值操作:
let squared = 3;
squared **= 2;
console.log(squared); // 9

let sqrt = 16;
sqrt **= 0.5;
console.log(sqrt); // 4

加性操作符


加法操作符(+)用于求两个数的和;

减法操作符(-)用于求两个数的差;

关系操作符


关系操作符执行比较两个值的操作,包括小于(<)、大于(>)、小于等于(<=)和大于等于(>=

但在比较 NaN 时,无论是小于还是大于等于,比较的结果都会返回 false。

相等操作符


等于操作符用两个等于号(==)表示,如果操作数相等,则会返回 true

不等于操作符用叹号和等于号(!=)表示,如果两个操作数不相等,则会返回 true

注意:null 和 undefined 相等;null 和 undefined 不能转换为其他类型的值再进行比较。NaN 不等于 NaN。

全等操作符由 3 个等于号(===)表示,只有两个操作数在不转换的前提下相等才返回 true

不全等操作符用一个叹号和两个等于号(!==)表示,只有两个操作数在不转换的前提下不相等才返回 true

注意: 因此推荐使用全等和不全等操作符。这样有助于在代码中保持数据类型的完整性。

条件操作符


// 又称三元运算符
condition ? expr1: expr2

// 约等于
if ( condition ) {
	expr1;
} else {
	expr2;
}

赋值操作符


乘后赋值(*=)、除后赋值(/=)、取模后赋值(%=)、加后赋值(+=)、减后赋值(-=)、左移后赋值(<<=)、右移后赋值(>>=)、无符号右移后赋值(>>>=

注意: 这些操作符仅仅是简写语法,使用它们不会提升性能。

3.6 语句

if 语句


// 频繁语句
if (condition) statement1 else statement2
if (condition1) statement1 else if (condition2) statement2 else statement3

do-while 语句


do-while 语句是一种测试循环语句,即循环体中的代码执行后才会对退出条件进行求值。换句 话说,循环体内的代码至少执行一次

// do-while 的语法如下:
do {
 statement
} while (expression);

let i = 0;
do {
 i += 2;
} while (i < 10);
// 在这个例子中,只要 i 小于 10,循环就会重复执行。i 从 0 开始,每次循环递增 2

while 语句


while 语句是一种测试循环语句,即先检测退出条件,再执行循环体内的代码。因此,while 循 环体内的代码有可能不会执行

// while 循环的语法如下:
while(expression) statement

let i = 0;
while (i < 10) {
 i += 2;
}
// 在这个例子中,变量 i 从 0 开始,每次循环递增 2。只要 i 小于 10,循环就会继续。

for语句


for 语句也是测试语句,进入循环前要初始化代码,以及循环执行后要执行的表达式;

// for 循环的语法如下:
for (initialization; expression; post-loop-expression) statement

let count = 10;
for (let i = 0; i < count; i++) {
 console.log(i);
}
// 在这个例子中,变量 i 从 0 开始,递增变量 i。只要 i 不小于 10,循环就会继续。

for-in 语句 和 for-of 语句的区别:


for-in 语句是一种严格的迭代语句,用于枚举对象中的非符号键属性;for-in 语句不能保证返回对象属性的顺序。

// for in 语法如下:
for (property in expression) statement

for…of是作为 ES6 新增的遍历方式,是一种严格的迭代语句,允许遍历一个含有 iterator 接口的数据结构(数组、对象等)并且返回各项的值,普通的对象用 for..of 遍历是会报错的。

// for of 语法如下:
for (property of expression) statement

区别如下:

  • for…in 获取的是对象的键名,for…of 遍历获取的是对象的键值;
  • for… in 会遍历对象的整个原型链,性能非常差不推荐使用,而 for…of 只遍历当前对象不会遍历原型链;
  • 对于数组的遍历,for…in 会返回数组中所有可枚举的属性(包括原型链上可枚举的属性),for…of 只返回数组的下标对应的属性值;

总结: for…in 循环主要是为了遍历对象而生,不适用于遍历数组;for…of 循环可以用来遍历数组、类数组对象,字符串、Set、Map 以及 Generator 对象。

区别的知识点根据其他人总结修改!!!不知道原作者是谁!

标签语句


标签语句用于给语句加标签,语法如下⬇️:

label: statement

break 和 continue 语句


break 语句用于立即退出循环,强制执行循环后的下一条语句;

continue 语句也用于立即退出循环,但会再次从循环顶部开始执行;

with语句


with 语句的用途是将代码作用域设置为特定的对象,语法如下⬇️:

with (expression) statement;

由于 with 语句影响性能且难于调试其中的代码,通常不推荐在产品代码中使用 with 语句。

switch语句


switch 语句是与 if 语句紧密相关的一种流控制语句,从其他语言借鉴而来。语法如下⬇️:

switch (expression) {
 case value1:
     statement
     break;
 case value2:
     statement
     break;
 case value3:
     statement
     break;
 case value4:
     statement
     break;
 default:
     statement
}

注意: 为避免不必要的条件判断,最好给每个条件后面都加上 break 语句

注意: switch 语句在比较每个条件的值时会使用全等操作符,因此不会强制转换数据类型

3.7 函数

注意: 第 10 章会更详细地介绍函数。

严格模式对函数也有一些限制

  • 函数不能以 evalarguments 作为名称;
  • 函数的参数不能叫 evalarguments
  • 两个命名参数不能拥有同一个名称。

如果违反上述规则,则会导致语法错误,代码也不会执行。