標籤: 語法,語句,表達式,you don't know javascriptjavascript
var a = 3 * 6;
var b = a;
b;
複製代碼
表達式:前端
語句: 這三行代碼叫作包含表達式的語句。java
> var a = 30
< undefined
> a = 40
< 40
複製代碼
> {
var b = 10;
b = 20
}
< 20
複製代碼
var result = {
var b = 10;
b = 20
}
// SyntaxError
複製代碼
var result = eval(`{ var b = 10; b = 20 }`)
result // 20
複製代碼
effect
譯爲反作用
,有點難以理解。運算
做用,他會對程序中的其餘部分(變量)產生影響。簡單理解爲有運算符的表達式就會有effect
。var a = 30;
a++; // 30
a; // 31
++a; // 32
a; // 32
複製代碼
反作用
產生的時間不一樣,++a
在反作用(a自增)產生以後返回值,而a++
在反作用產生以前返回值。es6
delete
表達式也有返回值,刪除不存在或可配置的屬性,返回true,不然返回false或者報錯。web
var a,b,c
a = b = c = 30;
// c = 30的反作用是將30複製給c,返回值是表達式c = 30的結果值,一樣原理左依次執行。
複製代碼
function foo (a) {
return a > 20
}
var num = 30
if (num > 10) {
var result = foo(num)
if (result) {
console.log(result)
}
}
複製代碼
上面的兩個if
能夠合併成chrome
var result
if (num > 10 && (result = foo(num))) {
console.log(result)
}
複製代碼
var a = {
foo: 1
}
複製代碼
{
let a = 10;
a
}
複製代碼
let {a, b} = {a: 10, b: 20}
複製代碼
if
和else
後面的語句只有一句時能夠省略{}
。if (a) console.log(a)
複製代碼
else if
不是JavaScript的語法規則,是開發者發明的,很好用,因此極爲常見。編程
else if
表示else
後跟了一個省略{}
的if
代碼塊。json
因不推薦將if
或else
後面的{}
省略,因此else if
在這個層面上講是不規範的寫法。小程序
if (a) {
} else if (b) {
}
// 規範寫法
if (a) {
} else {
if (b) {
}
}
複製代碼
function foo () {
}
{
foo: foo()
}
複製代碼
上面代碼像是建立了一個對象可是沒有變量接收,可是其實是{}
表明了一個代碼塊,而foo:
在正常代碼中寫法顯得奇怪可是沒有報錯,是由於這裏有個咱們不經常使用的label
代碼標籤。微信小程序
foo
的語句foo()
」break
continue
跳出嵌套循環for (var i = 0; i < 3; i++) {
for (var j = 0; j < 3; j++) {
if (i === j) {
break;
}
console.log(i,j)
}
}
// 1 0
複製代碼
foo: for (var i = 0; i < 2; i++) {
for (var j = 0; j < 2; j++) {
if (i === j) {
break foo; // 表示跳出標籤爲foo的循環,即外層循環
}
console.log(i,j)
}
}
// 沒有打印任何i,j
複製代碼
書中的說法: 如下代碼在控制檯直接輸入會報錯,由於{..}
被解析成代碼塊,foo
被解析成標籤,而標籤不能帶有引號
> {
"a": 20
}
複製代碼
實際的結果:
chrome中會解析成建立了一個對象和{a:20}
相同。
如下兩種{}
的運行結果 報錯:
> ;{
"a": 20
}
複製代碼
不報錯:
> ;{
a: 20
}
< 20
複製代碼
[] + {} // "[object Object]"
{} + [] // 0
複製代碼
{} + []
中{}被視爲代碼塊,空代碼塊被強制類型轉換後的值怎麼肯定的不太明確。 但能夠測試空代碼塊的返回值是undefined
> eval("{}")
< undefined
> ;{}
< undefined
複製代碼