一、ES7規範有一項"do表達式"提案,相似下面這樣。do{}表達式執行一個代碼塊(包含一個或多個語句),而且返回其中最後一個語句的返回值
,而後賦值給變量a。算法
var a,b;
a = do{
if(true){
b = 4 + 32;
}
}
a // 42
複製代碼
二、可使用,語句系列逗號運算符
將多個獨立的表達式語句串聯成一個語句。(a++,a中第二個表達式a在a++以後執行,結果爲43,並被賦值給b)數組
var a = 42,b;
b = (a++,a)
a // 43
b // 43
複製代碼
三、delete運算符能夠刪除對象中的屬性和數組中的單元。(若是操做成功,delete返回true,不然返回false)bash
var obj = {
a:42
}
obj.a // 42
delete obj.a // true
obj.a //undefined
複製代碼
四、使用var a = b = 42,不會對變量進行聲明,在嚴格模式中這樣會產生錯誤,或者會無心中建立一個全局變量(b)。函數
五、代碼塊ui
[] + {} // "[object Object]"
{} + [] // 0
複製代碼
第一行代碼中,[]被強制類型轉換爲"",而{}會被強制類型轉換爲"[object Object]"spa
第二行代碼中,{}被當作一個獨立的空代碼塊,代碼塊結尾不須要分號,最後+[]將[]顯示強制類型轉換爲0。code
六、事實上Javascript沒有else if,但if和else只包含單條語句的時候能夠省略代碼塊的{}對象
一、,
運算符的優先級比=
低,用,來鏈接一系列語句的時候,它的優先級最低
,其餘操做數的優先級都比它高。ip
var a = 42,b;
b = (a++,a)
a // 43
b // 43
var a = 42,b;
b = a++,a;
a // 43
b // 42
複製代碼
二、&&運算符的優先級高於=
。若是不加括號的話,就會執行做(str && matches)= str.match。這樣會出錯,因爲(str && matches)的結果是一個undefined,所以它不能出如今=運算符的左邊。回調函數
if(str && (matches = str.match(/[aeiou]/g))){
}
複製代碼
三、&&運算符先於||執行
,並且執行順序並不是咱們所設想的從左到右。
false && true || true // true
(false && true) || true // true
true || false && false // true
(true || false) && false // false
true || (false && false) // true
複製代碼
四、&&運算符的優先級高於||,而||的優先級又高於?:
a && b || c ? c || b ? a : c && b : a
等於
(a && b || c) ? (c || b) ? a : (c && b) : a
複製代碼
五、?:是右關聯的。
a ? b : c ? d : e
等於
a ? b : (c ? d : e)
複製代碼
六、暫時性死區
{
a = 2; // ReferenceError 變量a初始化以前賦值會拋出錯誤
let a;
}
// 對未聲明的變量使用typeof不會產生錯誤
{
typeof a; // undefined
typeof b; // ReferenceError
let b;
}
複製代碼
一、在ES6中,若是參數被省略
或者值爲undefined
,則取該參數的默認值。
function foo(a = 42,b = a+1){
console.log(a,b)
}
foo() // 42 43
foo(undefined) // 42 43
foo(5) // 5 6
foo(void 0,7) // 42 7
foo(null) // null 1
複製代碼
二、若是向函數傳遞undefined,則arguments數組中會出現一個值爲undefined的單元,而不是默認值。
function foo(a = 42,b = a + 1) {
console.log(
arguments.length,a,b,
arguments[0],arguments[1]
)
}
foo() // 0 42 43 undefined undefined
foo(10) // 1 10 11 10 undefined
foo(10,undefined) // 2 10 11 10 undefined
foo(10,null) // 2 10 null 10 null
複製代碼
三、向函數傳遞參數時,arguments數組中的對應單元會和命名參數創建關聯以獲得相同的值,不傳遞不創建關聯(嚴格模式沒有創建關聯)
function foo(a){
a = 42;
console.log(arguments[0])
}
foo(2) // 42 (linked)
foo() // undefined(not linked)
function foo(a){
"use strict"
a = 42;
console.log(arguments[0])
}
foo(2) // 2 (not linked)
foo() // undefined(not linked)
複製代碼
一、finally中的代碼老是會在try以後執行,若是有catch的話則在catch以後執行,也能夠將finally中的代碼看做是一個回調函數,最後必定被調用。
function foo() {
try{
return 42
}
finally {
console.log('Hello')
}
console.log('never runs')
}
console.log(foo())
// Hello
// 42
function foo() {
try{
throw 42
}
finally {
console.log('Hello')
}
console.log('never runs')
}
console.log(foo())
// Hello
// Uncaught Exception:42
function foo() {
try{
return 42
}
finally {
throw "Oops"
}
console.log('never runs')
}
console.log(foo())
// Uncaught Exception:Oops
複製代碼
二、finally中的return會覆蓋try和catch中的return的返回值。
function foo(){
try{
return 42;
}
finally{
// 沒有返回語句,因此沒有覆蓋
}
}
function bar() {
try{
return 42;
}
finally{
return;
}
}
function baz() {
try{
return 42;
}
finally{
return "Hello";
}
}
foo() // 42
bar() // undefined
baz() // Hello
複製代碼
一、a和case表達式的匹配算法與===相同。
var a = '42'
switch(true){
case a == 10 :
break;
case a == 42:
break;
default:
}
複製代碼
二、儘管可使用==,但switch中true和true之間仍然是嚴格相等比較。即若是case表達式的結果爲真值,但不是嚴格意義上的true,則條件不成立。
var a = 'hello world'
var b = 10;
switch(true){
case (a || b == 10): // 結果爲'hello world' 不會執行這裏
break; // 永遠執行不到這裏
default:
}
複製代碼