表达式是一个能够被求值并产生一个值的JavaScript短语,常量、变量都是最简单的表达式,它们能够被求值和赋值(即产生新值)。基于简单表达式来构建复杂表达式的方式是使用操做符,操做符以某种方式组合两个及以上的简单表达式,列如:let result = x * y,x 与 y两个简单表达式被操做符*组合起来,造成的一个值为result。javascript
最简单的表达式称为主表达式,一般包括常量、变量等。java
1.23 // 数值 "hello" // 字符串 true // 布尔值true false // 布尔值false null // null值 this // 当前对象 i // 变量i sum // 变量sum
函数定义表达式定义JavaScript函数,其值为新定义的函数,函数定义表达式由function关键字、参数列表、函数代码块(函数体)构成。数组
let square = function(x, y) { // ...... return x * y }
属性访问表达式是求对象属性或数组元素的值,JS有两种方式访问属性的语法,一个是表达式后跟一个句点和一个标识符,另外一个是表达式位于方括号的表达式。ide
let a = {x: 1, y: {z: 3}} let b = [a, 4, [5, 6]] // 第一种,句点 a.x // 1 a.y.z // 3 // 第二种,方括号 a[1] // 4 a[0].x // 1
当使用属性访问表达式时,若是.
或[]
的左侧的表达式求值为null或undefined,会报TypeError。所以,使用?.
或?.[]
语法防止这种错误发生。函数
let a = { b: null } a.b?.c.d // undefined let a = { b: undefined } a.b?.c.d // undefined let a = { b: {} } a.b.c?.d // undefined操做符
操做符用于算术表达式、比较表达式、逻辑表达式、赋值表达式等。多数的操做符都以+
、=
这样的标点符号表示,可是也有一些以delete和instanceof关键字表示。关键字也是操做符,只是它的语法没有那么简短。this
操做符操做的对象叫作操做数,好比 a + b = c 中,+操做符须要操做a和b两个操做数,而且+操做符操做数个数为2。code
in操做符期待左侧操做数是字符串、符号或能够转换为字符串的值,期待右侧操做数是对象。对象
let a = { x: 1, y: 1 } 'x' in a // true,对象a存在属性名x 'c' in a // false,对象a不存在属性名c let b = [1, 2, 3] '2' in b // true,b数组有索引值2 '3' in b // false,b数组没有索引值3
instanceof操做符期待左侧操做数是对象,右侧操做数是对象类的标识。简而言之,instanceof用于判断一个操做数是否为某个对象的实例。索引
let d = new Date() d instanceof Date // true d instanceof Object // true,全部对象都是Object的实例 d instanceof Array // false
typeof操做符一般用于获取一个操做数的类型,它返回的结果为字符串,有"number"、"boolean"、"string"、"function"、"object"、"undefined"六种结果。ip
instanceof操做符是一个二元操做符,它须要有两个操做数才能够完成运算,而typeof是一元运算符,它仅须要一个操做数便可运算。
let b = 10 let a = "hello word!" typeof b // number typeof a // string
delete是一元操做符,删除对象属性或数组元素。
let a = { x: 1, y: 2 } delete a.x 'x' in a // false,对象a不存在属性名x
条件操做符又称为三元运算符,由于它有三个操做数,a ? b : c
。
let a = 10 let flag = false a > 0 ? (flag = true) : (flag = false) // flag为true
若是第二和第三操做数相对复杂,能够在其首尾添加一堆括号。
三元操做符简化了if语句,上述代码能够写成:
if (a > 0) { flag = true } else { flag = false }
先定义操做符??是一个二元操做符,只有在第一个操做数值为null或undefined时才会返回第二个操做数的值。
let a = null a ?? 10 // 结果为10
由于a为null值,因此返回第二个操做数的值。因此先定义操做符相似于以下表达式:
let a = null a === null ? 10 : null // 结果为10
?? 是对 || 的一个有用的代替,适合选择先定义的操做数,而不是第一个为真值的操做数。
let maxWidth = 0 let preference = { maxWidth: 120, title: "", visited: false } let max = maxWidth ?? preference.title ?? preference.visited ?? preference.maxWidth ?? 500 // 结果为0
若操做数的值为0、空字符串和false,而这些值在某些状况下是彻底有效的,好比maxWidth是0因此就会被忽略。
let maxWidth = 0 let preference = { maxWidth: 120, title: "", visited: false } let max = maxWidth || preference.title || preference.visited || preference.maxWidth || 500 // 结果为120
若操做符改成 ?? ,那么对于该表达式来讲,0也会成为有效值,因此max为0。