日本不卡不码高清免费观看,久久国产精品久久w女人spa,黄色aa久久,三上悠亚国产精品一区二区三区

您的位置:首頁技術文章
文章詳情頁

7個令人驚訝的JavaScript特性詳解

瀏覽:316日期:2022-06-10 09:00:54
目錄
  • 從任何一個代碼塊中 break
  • 解構一個已存在的變量
  • 對數值進行解構
  • 類聲明是塊級作用域的
  • 同名參數
  • typeof 不安全
  • 新數組

從任何一個代碼塊中 break

你應該已經知道你可以從任意循環(huán)中 break 和 continue —— 這是一個相當標準的程序設計語言結構。但你可能沒有意識到,你可以給循環(huán)添加一個 label ,然后跳出任意層循環(huán):

outer: for(var i = 0; i < 4; i++) {
    while(true) {
continue outer;
    }
}

label 特性同樣適用于 break 和 continue。你在 switch 語句中肯定見過 break:

switch(i) {
   case 1:
       break;
}

順便說一句,這是為什么 Crockford 建議你的 case 不應該縮進 —— 因為 break 跳出的是 switch 而不是 case,但是我認為縮進 case 的可讀性更好。你也可以給 switch 語句添加 label:

myswitch: switch(i) {
   case 1:
       break myswitch;
}

你可以做的另一件事是創(chuàng)建任意塊(我知道你可以在 C# 里面這么寫,我期望其他語言也可以)。

{
  {
      console.log("I"m in an abritrary block");
  }
}

因此,我們可以把 label 和 break 放在一起,用來從任意代碼塊中跳出。

outer: {
  inner: {
      if (true) {
break outer;
      }
  }
  console.log("I will never be executed");
}

注意到,這只適用于 break —— 因為你只能在一個循環(huán)中 continue。我從未見過 label 被使用在 JavaScript 中,我想知道為什么 —— 我想可能因為如果我需要 break 兩層,說明把這個代碼塊放在一個函數里可能更好,這樣我可以使用一個單層的 break 或者一個提前的 return 來達到同樣的目的。

盡管如此,如果我想要保證每個函數只有一個 return 語句(這不是我的菜),那么我可以使用帶 label 的 brock。例如,看下面這個多個 return 語句的函數:

function(a, b, c) {
  if (a) {
     if (b) {
       return true;
     }
     doSomething();
     if (c) {
       return c;
     }
  }
  return b;
}

而如果使用 label:

function(a, b, c) {
  var returnValue = b;
  myBlock: if (a) {
     if (b) {
       returnValue = true;
       break myBlock;
     }
     doSomething();
     if (c) {
       returnValue = c;
     }
  }
  return returnValue;
}

還有另一種選擇,用更多代碼塊……

function(a, b, c) {
  var returnValue = b;
  if (a) {
     if (b) {
       returnValue = true;
     } else {
       doSomething();
       if (c) {
 returnValue = c;
       }
    }
  }
  return returnValue;
}

我最喜歡原版,然后是使用 else 的版本,最后才是使用 label 的版本 —— 但是,這可能是因為我的寫碼習慣?

解構一個已存在的變量

首先,有個怪異的寫法我無法解釋。貌似 ES3 中你可以添加一個小括號到一個簡單的賦值語句左邊的變量上,而這樣寫不會有問題:

var a;
(a) = 1;
assertTrue(a === 1);

如果你能想到為什么這樣寫可以,請在底下評論!

解構的過程是一個將變量從一個數組或者一個對象中拉取出來的過程。最常見的是以下例子:

function pullOutInParams({a}, [b]) {
  console.log(a, b);
}
function pullOutInLet(obj, arr) {
  let {a} = obj;
  let [b] = arr;
  console.log(a, b);
}
pullOutInParams({a: "Hello" }, ["World"]);
pullOutInLet({a: "Hello" }, ["World"]);

而你可以不使用 var 或 let 或 const。對數組你可以讓下面的代碼如你的期望運行:

var a;
[a] = array;

但是,對于對象,你必須將整個賦值語句用小括號括起來:

var a;
({a} = obj);

必須這樣寫的理由是,不加括號無法區(qū)分代碼是解構賦值還是塊級作用域,因為你可以使用匿名代碼塊而 ASI(automatic semi-colon insertion,自動插入括號)會將變量轉成可以執(zhí)行的表達式(如下面的例子所示,能夠產生副作用……),這樣就產生了歧義。

var a = {
   get b() {
     console.log("Hello!");
   }
};
with(a) {
  {
    b
  }
}

回到原始的例子,我們給我們的賦值語句里的變量加了圓括號 —— 你可能認為它也適用于解構,但它不是。

var a, b, c;
(a) = 1; //這句不是變量解構
[b] = [2];
({c} = { c : 3 });

對數值進行解構

解構的另一個方面你可能也沒有意識到,屬性名不是必須要是不帶引號的字符串,它們也可以是數值:

`var {1 : a} = { 1: true };`

或者帶引號的字符串:

`var {"1" : a} = { "1": true };`

或者你可能想要用一個計算的表達式作為名字:

var myProp = "1";
var {[myProp] : a} = { [myProp]: true };

這會很容易寫出造成困惑的代碼:

var a = "a";
var {[a] : [a]} = { a: [a] };

類聲明是塊級作用域的

函數聲明會被提升,意味著你可以將函數聲明寫在函數調用之后:

func();
function func() {
  console.log("Fine");
}

函數表達式與此相反,因為賦值一個變量的時候,變量聲明被提升,但是具體賦值沒有被提升。

func(); // func 被聲明, 但是值為 undefined, 所以這里拋出異常: "func is not a function"
var func = function func() {
  console.log("Fine");
};

類(Classes)成為 ES6 流行的部分,并且已被廣泛吹捧為函數的語法糖。所以你可能會認為以下代碼是可以工作的:

new func();

class func {
  constructor() {
    console.log("Fine");
  }
}

然而,盡管它基本上是語法糖,但前面的代碼是不能工作的。這實際上等價于:

new func();

let func = function func() {
  console.log("Fine");
}

這意味著我們的 func 調用在暫時性死區(qū)(TDZ),這會導致引用錯誤。

同名參數

我認為不可能指定同名的參數,然而,卻可以!

function func(a, a) {
  console.log(a);
}

func("Hello", "World");
// 輸出 "World"

在嚴格模式下不行:

function func(a, a) {
  "use strict";
  console.log(a);
}

func("Hello", "World");
// 在 chrome 下報錯 - SyntaxError: Strict mode function may not have duplicate parameter names

typeof 不安全

在 ES6 之前,眾所周知使用 typeof 總是能安全地找出某個變量的定義,不管它是否被聲明:

if (typeof Symbol !== "undefined") {
  // Symbol 可用
}
// 下面的代碼拋異常,如果 Symbol 沒有被聲明 
if (Symbol !== "undefined") {
}

但是,現在這個在不使用 let 或者 const 聲明變量的時候才好使。因為有了 TDZ,會導致變量未聲明時產生引用錯誤。從本質上講,變量被提升到塊級作用域的開始,但是在聲明前的任何訪問都會產生引用錯誤。在 JSHint 的作用域管理中,我必須記錄一個變量的用法,如果它使用 let 或者 const 聲明于當前塊級作用域或者它的父級作用域,提前訪問就會有引用錯誤。而如果是使用 var 語句聲明的,那么它就是可用的,但是 JSHint 會給出一個警告,而如果它沒有被聲明,那么它使用全局作用域,JSHint 可能會有另外一種警告。

if (typeof Symbol !== "undefined") {
  // Symbol 不可用,產生 reference error
}
let Symbol = true;

新數組

我總是避免使用 new Array 構造函數,一部分原因是因為它的參數既可以是一個長度又可以是一個元素列表:

new Array(1); // [undefined]
new Array(1, 2); // [1, 2]

但是,一個同事最近使用它遇到了一些我以前沒有見過的東西:

var arr = new Array(10);
for(var i = 0; i < arr.length; i++) {
  arr[i] = i;
}
console.dir(arr);

上面的代碼產生一個 0 到 9 的數組。然而,如果將它重構為使用 map:

var arr = new Array(10);
arr = arr.map(function(item, index) { return index; });
console.dir(arr);

現在我得到了一個數組,第 8 個元素等于 8,但是其他所有的值依然是 undefined。看一下 map 的 polyfill 實現,它循環(huán)每一個元素(這是為什么 index 是正確的),但是它使用的是 in 來檢查一個屬性是否被設置。你如果使用數組直接量,也會得到同樣的結果。

var arr = [];
arr[9] = undefined;
// or
var arr = [];
arr.length = 10;




以上就是7個令人驚訝的JavaScript特性詳解的詳細內容,更多關于JavaScript特性的資料請關注其它相關文章!

標簽: JavaScript
日本不卡不码高清免费观看,久久国产精品久久w女人spa,黄色aa久久,三上悠亚国产精品一区二区三区
亚洲精品**中文毛片| 精品国产三区在线| 欧美日韩视频| 亚洲国内欧美| 日韩精品亚洲aⅴ在线影院| 国产精品夜夜夜| 日本成人中文字幕在线视频| 亚洲精一区二区三区| 亚洲影视一区| 久久亚洲人体| 精品亚洲成人| 国产成人精品亚洲线观看| 亚洲福利国产| 国产亚洲字幕| 亚洲精品综合| 99re国产精品| 欧美一区影院| 国产视频亚洲| 日韩精品免费视频一区二区三区| 国产一区二区三区国产精品| 亚洲欧洲午夜| 亚洲精品麻豆| 久久国产精品成人免费观看的软件| 黄色国产精品| 麻豆国产在线| aa亚洲婷婷| 捆绑调教美女网站视频一区| 精品中文一区| 日韩欧美中文字幕一区二区三区 | 黑人精品一区| 日本久久黄色| 国产精品4hu.www| 9国产精品视频| 久久久成人网| 91精品综合| 99视频一区| 色婷婷亚洲mv天堂mv在影片| 日韩高清不卡一区二区| 亚洲毛片视频| 国产激情精品一区二区三区| 免费国产自线拍一欧美视频| 中国字幕a在线看韩国电影| 日韩欧美二区| 国产乱人伦精品一区| 尤物tv在线精品| 韩国一区二区三区视频| 99精品美女| 国产精品久久久久久久久妇女| 日本aⅴ免费视频一区二区三区| 国产乱码精品一区二区三区亚洲人 | 91成人精品视频| 麻豆国产91在线播放| 伊人精品在线| 久久国产影院| 群体交乱之放荡娇妻一区二区| 亚洲精品进入| 中文字幕亚洲精品乱码| 亚洲精品第一| 日韩欧美三区| 国产一区日韩一区| 久久丁香四色| 久久国产精品色av免费看| 一本色道久久精品| 自由日本语亚洲人高潮| 91成人网在线观看| 老色鬼精品视频在线观看播放| 麻豆精品一区二区综合av| 久久成人av| 亚洲精品日韩久久| 亚洲精品在线国产| 欧美日韩中出| 蜜臀av在线播放一区二区三区 | 香蕉成人av| 伊人久久国产| 91成人精品| 国产精品毛片| 中文字幕成人| 不卡中文字幕| 激情婷婷欧美| 久久av影院| 日韩精品久久理论片| 亚洲久久视频| 日韩精品亚洲专区在线观看| 岛国av免费在线观看| 美女毛片一区二区三区四区| 亚洲伊人影院| 久久精品午夜| 久久99国产精品视频| 亚洲美女91| 国产日本亚洲| 国产精品久久观看| 欧美精品一卡| 亚洲久久在线| 日本国产一区| 国产成人精品一区二区三区视频 | 日韩精品免费视频一区二区三区 | 日韩av不卡一区二区| 国产精品一区二区三区av麻| 亚洲精品一级| 免费人成在线不卡| 欧美日韩亚洲一区二区三区在线| 亚洲免费一区二区| 丝袜美腿高跟呻吟高潮一区| 午夜性色一区二区三区免费视频| 日本午夜精品久久久久| 国产成人精品免费视| 日韩欧美中文| 九九九精品视频| 欧美va亚洲va日韩∨a综合色| 日韩一级精品| 久久久777| 亚洲精品一二三**| 最近高清中文在线字幕在线观看1| 91一区二区三区四区| 久久夜色精品| 国产一区二区三区网| 超碰在线99| 日本伊人久久| 久久伦理在线| 亚洲在线免费| 成人在线免费观看网站| 亚洲精品在线国产| 亚洲精品第一| 91精品国产成人观看| 日韩一二三区在线观看| 青青国产精品| 亚洲免费激情| 国产精品第十页| 日韩在线麻豆| 999精品在线| av不卡在线看| 亚洲精品国产偷自在线观看| 国产精品99一区二区三| 奇米色欧美一区二区三区| 精品少妇一区| 只有精品亚洲| 久久婷婷亚洲| 午夜av成人| 中文在线а√在线8| 日韩视频不卡| 99热国内精品| 欧美国产精品| 蜜臀精品一区二区三区在线观看| 在线精品一区| 亚洲欧美日韩国产一区二区| 国产精品夜夜夜| 国产成年精品| 欧美国产91| 尤物在线精品| 欧美经典一区| 国产精品黑丝在线播放| 午夜欧美巨大性欧美巨大| 国产探花一区在线观看| 国产精品一区三区在线观看| 红杏一区二区三区| 国产午夜精品一区二区三区欧美 | 免费观看久久av| 午夜国产一区二区| av一区二区高清| 国产激情精品一区二区三区| 91麻豆精品| 美女网站视频一区| 精品无人区麻豆乱码久久久| 狂野欧美性猛交xxxx| 日韩一区免费| 亚洲不卡视频| 中文字幕日韩高清在线| 欧美日本精品| 青草国产精品久久久久久| 亚洲美洲欧洲综合国产一区| 欧美一区自拍| 99久久久久国产精品| 亚洲欧美日韩专区| 999久久久免费精品国产| 综合激情五月婷婷| 三级在线看中文字幕完整版| 免费看一区二区三区| 亚洲+小说+欧美+激情+另类| 国产精品毛片在线| 欧美日韩黄网站| 国产精品成人国产| 久久精品国产久精国产| 四季av一区二区凹凸精品| 日韩久久一区二区三区| 91久久国产| 欧美一级网址| 亚洲深深色噜噜狠狠爱网站| 亚洲午夜视频| 亚洲大全视频| 在线亚洲成人| 只有精品亚洲| 视频一区中文字幕| 精品国产乱码久久久久久1区2匹| 麻豆精品蜜桃视频网站| 国产精品久久久久久av公交车| 亚洲精品动态| 私拍精品福利视频在线一区| 桃色av一区二区| 日本午夜精品久久久久| 99久久精品国产亚洲精品|