[JS]表达式与操做符

表达式是一个能够被求值并产生一个值的JavaScript短语,常量、变量都是最简单的表达式,它们能够被求值和赋值(即产生新值)。基于简单表达式来构建复杂表达式的方式是使用操做符,操做符以某种方式组合两个及以上的简单表达式。
表达式

表达式是一个能够被求值并产生一个值的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操做符

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操做符期待左侧操做数是对象,右侧操做数是对象类的标识。简而言之,instanceof用于判断一个操做数是否为某个对象的实例。索引

let d = new Date()
d instanceof Date // true
d instanceof Object // true,全部对象都是Object的实例
d instanceof Array // false

typeof操做符

typeof操做符一般用于获取一个操做数的类型,它返回的结果为字符串,有"number"、"boolean"、"string"、"function"、"object"、"undefined"六种结果。ip

instanceof操做符是一个二元操做符,它须要有两个操做数才能够完成运算,而typeof是一元运算符,它仅须要一个操做数便可运算。

let b = 10
let a = "hello word!"
typeof b // number
typeof a // string

delete操做符

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。

相关文章
相关标签/搜索