成人国产在线小视频_日韩寡妇人妻调教在线播放_色成人www永久在线观看_2018国产精品久久_亚洲欧美高清在线30p_亚洲少妇综合一区_黄色在线播放国产_亚洲另类技巧小说校园_国产主播xx日韩_a级毛片在线免费

資訊專欄INFORMATION COLUMN

解析ES6變量賦值和基本數(shù)據(jù)類型

3403771864 / 582人閱讀

  let和const

  let和const兩者并不存在變量提升

  這里要說明的是變量一定要在聲明后使用,否則報(bào)錯(cuò)。

  var a = [];
  for (var i = 0; i < 10; i++) {
  a[i] = function () {
  console.log(i);
  };
  }
  a[6](); // 10

  變量i是var聲明的,我們要知道這里在全局范圍內(nèi)都有效。我們要知道在每一次循環(huán)中,新的i值都會(huì)覆蓋舊值,這樣就可以在最后輸出的是最后一輪的i的值。

  var a = [];
  for (let i = 0; i < 10; i++) {
  a[i] = function () {
  console.log(i);
  };
  }
  a[6](); // 6

  我們可以看到在上面代碼中,變量i是let聲明的,要知道這個(gè)只有當(dāng)前的i只在本輪循環(huán)有效,所以每一次循環(huán)的i其實(shí)都是一個(gè)新的變量,所以最后輸出的是6。

  暫時(shí)性死區(qū)(temporal dead zone,簡(jiǎn)稱TDZ)

  這里要說的是當(dāng)在塊級(jí)作用域內(nèi)存在let或const命令,則變量會(huì)被綁定在這個(gè)區(qū)域內(nèi),不受外層作用域的變量影響。凡在聲明之前使用了變量,則會(huì)報(bào)錯(cuò)。

  注意,如果使用了let或const,typeof 就不安全了

  var tmp = 123;
  if (true) {
  tmp = 'abc'; // ReferenceError
  let tmp;
  }

  不允許重復(fù)聲明

  let a = 10;
  var a = 1; //Uncaught SyntaxError: Identifier 'a' has already been declared

  或

  let a = 10;
  let a = 1; //Uncaught SyntaxError: Identifier 'a' has already been declared

  塊級(jí)作用域與函數(shù)聲明

  并且ES6規(guī)定,塊級(jí)作用域之中,函數(shù)聲明語句的行為類似于let,在塊級(jí)作用域之外不可引用。

  const

  const只保證變量指向的地址不變,不保證該地址的數(shù)據(jù)不變。

  const foo = {};
  foo.prop = 123;
  console.log(foo.prop); // 123
  foo = {}; // TypeError: "foo" is read-only

  如果真的想將對(duì)象凍結(jié),應(yīng)該使用Object.freeze方法。

  const foo = Object.freeze({});
  // 常規(guī)模式時(shí),下面一行不起作用;
  // 嚴(yán)格模式時(shí),該行會(huì)報(bào)錯(cuò)
  foo.prop = 123; // Can't add property prop, object is not extensible

  變量解構(gòu)

  解構(gòu)必須左右解構(gòu)相同

  1.解構(gòu)失敗則是undefined,如有默認(rèn)值則取默認(rèn)值

  2.左右解構(gòu)不同則拋error

  // 報(bào)錯(cuò)
  let [foo] = 1;
  let [foo] = false;
  let [foo] = NaN;
  let [foo] = undefined;
  let [foo] = null;
  let [foo] = {};

  我們看到上面是報(bào)錯(cuò),因?yàn)榈忍?hào)右邊的值,要么轉(zhuǎn)為對(duì)象以后不具備Iterator接口(前五個(gè)表達(dá)式),要么本身就不具備Iterator接口(最后一個(gè)表達(dá)式)。

  這里要說明的是只有當(dāng)某種數(shù)據(jù)結(jié)構(gòu)具有Iterator接口,由此在采用數(shù)組形式的解構(gòu)賦值。例如set數(shù)據(jù)類型和Generate函數(shù)

  默認(rèn)值

  解構(gòu)賦值允許默認(rèn)值,在定義的時(shí)候直接賦值即可

  var [x=1]=[,3];
  console.log(x) // x = 1

  注意,ES6內(nèi)部使用嚴(yán)格相等運(yùn)算符(===),判斷一個(gè)位置是否有值。所以,如果一個(gè)數(shù)組成員不嚴(yán)格等于undefined,默認(rèn)值是不會(huì)生效的。

  對(duì)象的解構(gòu)賦值

  對(duì)象的解構(gòu)與數(shù)組有一個(gè)重要的不同:數(shù)組的元素是按序排列的,取值由它的位置決定;而對(duì)象的屬性沒有次序,變量必須與屬性同名,才能取到正確的值。

  對(duì)象解構(gòu)賦值的內(nèi)部機(jī)制:先找到同名屬性,然后再賦給對(duì)應(yīng)的變量。真正被賦值的是后者,而不是前者。

  var {foo,bar} = {foo:'aaa',bar:'bbb'}
  等價(jià)于
  var {foo:foo,bar:bar} = {foo:'aaa',bar:'bbb'}

  默認(rèn)值生效的條件同樣是,對(duì)象的屬性值嚴(yán)格等于undefined。

  注意賦值時(shí)不能讓大括號(hào)在行首

  var x;
  {x} = {x: 1}; // 會(huì)報(bào)錯(cuò),因?yàn)镴avaScript引擎會(huì)將{x}理解成一個(gè)代碼塊
  var x;
  ({x} = {x:1}); // 正確寫法

  字符串的解構(gòu)賦值

  字符串也可以解構(gòu)賦值。這是因?yàn)榇藭r(shí),字符串被轉(zhuǎn)換成了一個(gè)類似數(shù)組的對(duì)象。

  數(shù)值和布爾值的解構(gòu)賦值

  解構(gòu)賦值時(shí),如果等號(hào)右邊是數(shù)值和布爾值,則會(huì)先轉(zhuǎn)為對(duì)象。

  函數(shù)的解構(gòu)賦值

  function move({x = 0, y = 0} = {}) {
  return [x, y];
  }
  move({x: 3, y: 8}); // [3, 8]
  move({x: 3}); // [3, 0]
  move({}); // [0, 0]
  move(); // [0, 0]
  注意對(duì)比與下面代碼的區(qū)別
  function move({x, y} = { x: 0, y: 0 }) {
  return [x, y];
  }
  move({x: 3, y: 8}); // [3, 8]
  move({x: 3}); // [3, undefined]
  move({}); // [undefined, undefined]
  move(); // [0, 0]

  此處是給{x,y}這個(gè)對(duì)象設(shè)置了默認(rèn)值,而不是給x,y分別設(shè)置了默認(rèn)值

  解構(gòu)賦值的7種常見用法

  1.變量交換

  [x, y] = [y, x];

  2.從函數(shù)返回多個(gè)值

  function example() {
  return [1, 2, 3];
  }
  var [a, b, c] = example();

  3.函數(shù)參數(shù)的定義

  function f([x, y, z]) { ... }
  f([1, 2, 3]);

  4.提取JSON數(shù)據(jù)

  var jsonData = {
  id: 42,
  status: "OK",
  data: [867, 5309]
  };
  let { id, status, data: number } = jsonData;

  5.函數(shù)參數(shù)默認(rèn)值

  jQuery.ajax = function (url, {
  async = true,
  beforeSend = function () {},
  cache = true,
  complete = function () {},
  crossDomain = false,
  global = true,
  // ... more config
  }) {
  // ... do stuff
  };
  // 指定參數(shù)的默認(rèn)值,就避免了在函數(shù)體內(nèi)部再寫var foo = config.foo || 'default foo';這樣的語句。

  6.遍歷Map結(jié)構(gòu)

  var map = new Map();
  map.set('first', 'hello');
  map.set('second', 'world');
  for (let [key, value] of map) {
  console.log(key + " is " + value);
  }
  // first is hello
  // second is world

  7.輸入模塊的指定方法

  const { SourceMapConsumer, SourceNode } = require("source-map");

  String

  字符串編碼{}

  es5中超過ffff值的Unicode字符只能用兩個(gè)字節(jié)表示,但是es6增加了大括號(hào)方式

  es5:
  "\uD842\uDFB7"
  // "????"
  "\u20BB7"
  // " 7"
  es6:
  "\u{20BB7}"
  // "????"

  還可以在變量中拼接Unicode編碼

  let hello = 123;
  hell\u{6F} // 123

  新增方法

  1.codePointAt 獲取字符的碼點(diǎn),10進(jìn)制

  codePointAt方法是測(cè)試一個(gè)字符由兩個(gè)字節(jié)還是由四個(gè)字節(jié)組成的最簡(jiǎn)單方法。

  function is32Bit(c) {
  return c.codePointAt(0) > 0xFFFF;
  }
  is32Bit("????") // true
  is32Bit("a") // false

  2.String.fromCodePoint() 返回傳入碼點(diǎn)的對(duì)于字符

  3.字符串Iterator接口新增,可以用for of遍歷字符串

  4..at()能返回給定位置的字符串,允許超過FFFF的字符被返回,es5中對(duì)應(yīng)的是charAt

  5.includes() 判斷字符串中是否包含傳入的字符

  6.startsWith() 判斷字符串的起點(diǎn)是否是傳入的字符

  7.endsWith() 判斷字符串的終點(diǎn)是否是傳入的字符

  8.repeate() 重復(fù)某字符

  9.padStart() 補(bǔ)全開頭

  10.padEnd() 補(bǔ)全結(jié)尾

  模板字符串

  嵌入變量${}

  空格、縮進(jìn)、換行會(huì)在輸出是保留,可以trim消除

  字符串模板嵌套

  Number

  八進(jìn)制和二進(jìn)制寫法

  二進(jìn)制 0b開頭

  八進(jìn)制 0o開頭

  新增方法

  Number.isNaN

  Number.isFinite

  Number.isInteger

  在JavaScript內(nèi)部,整數(shù)和浮點(diǎn)數(shù)是同樣的儲(chǔ)存方法,所以3和3.0被視為同一個(gè)值。

  Number.EPSILON 極小的誤差常量

  JavaScript能夠準(zhǔn)確表示的整數(shù)范圍在-253到253之間(不含兩個(gè)端點(diǎn)),超過這個(gè)范圍,無法精確表示這個(gè)值。

  Number.isSafeInteger() 安全整數(shù)范圍

  新增函數(shù)

  trunc 化零為整

  sign 判斷正負(fù)數(shù)

  cbrt 計(jì)算平方根

  clz32 返回一個(gè)32位二進(jìn)制

  **指數(shù)運(yùn)算

  本篇文章主要就是為大家講述ES6變量賦值和基本數(shù)據(jù)類型,歡迎大家關(guān)注更多精彩內(nèi)容。


文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。

轉(zhuǎn)載請(qǐng)注明本文地址:http://systransis.cn/yun/128817.html

相關(guān)文章

  • 【Step-By-Step】高頻面試題深入解析 / 周刊07

    摘要:復(fù)雜數(shù)據(jù)類型變量,賦值給之后,只讀引用與關(guān)聯(lián),和中存儲(chǔ)的是同一個(gè)對(duì)象的堆內(nèi)存地址,當(dāng)這個(gè)對(duì)象的值發(fā)生改變時(shí),此時(shí)的值也會(huì)發(fā)生變化。 不積跬步無以至千里。 關(guān)于【Step-By-Step】 Step-By-Step (點(diǎn)擊進(jìn)入項(xiàng)目) 是我于 2019-05-20 開始的一個(gè)項(xiàng)目,每個(gè)工作日發(fā)布一道面試題。每個(gè)周末我會(huì)仔細(xì)閱讀大家的答案,整理最一份較優(yōu)答案出來,因本人水平有限,有誤的地方...

    superw 評(píng)論0 收藏0
  • 前端

    摘要:原理判斷左邊的左操作數(shù)的對(duì)象的原型鏈上是否有右邊這個(gè)構(gòu)造函數(shù)的屬性。每個(gè)對(duì)象都有屬性,但只有函數(shù)對(duì)象才有屬性在默認(rèn)情況下,所有的原型對(duì)象都會(huì)自動(dòng)獲得一個(gè)構(gòu)造函數(shù)屬性,這個(gè)屬性是一個(gè)指針指向?qū)傩运诘暮瘮?shù)原型對(duì)象是構(gòu)造函數(shù)的一個(gè)實(shí)例。 JS JavaScript深入淺出 鏈接描述 數(shù)據(jù)類型 JS變量按照存儲(chǔ)方式區(qū)分為值類型和引用類型,并描述其特點(diǎn)?js值類型和引用類型的區(qū)別 值類型...

    WilsonLiu95 評(píng)論0 收藏0
  • 閑話JavaScript數(shù)據(jù)類型

    摘要:支持的類型的內(nèi)置數(shù)據(jù)類型羅列如下自定義自定義這三種類型的賦值是同類似的。這根不同,這因?yàn)槭菦]有包裝類新增的基本類型,只支持函數(shù)式賦值,不支持字面量和函數(shù)構(gòu)造。 JavaScript支持的類型 JS的內(nèi)置數(shù)據(jù)類型羅列如下: undefined null bool number string function object Function Date ...

    jerryloveemily 評(píng)論0 收藏0
  • javascript --- 數(shù)據(jù)類型

    摘要:其他字符可以是字母下劃線美元符號(hào)或數(shù)字。在使用聲明變量,但沒有對(duì)其初始化時(shí),這個(gè)變量的值就是。從邏輯上思考,他們的值,一個(gè)是,一個(gè)報(bào)錯(cuò)他們的類型,卻都是。這時(shí),可以采用變量的類型進(jìn)行比較。類型有兩個(gè)值字面量和。 javascript 數(shù)據(jù)類型 javascript由于nodejs的出現(xiàn)將觸角延伸至各個(gè)開發(fā)領(lǐng)域, 也由于 ES6等后續(xù)版本的推出對(duì)程序員越來越友好, 收到程序員的強(qiáng)烈推崇,...

    darcrand 評(píng)論0 收藏0

發(fā)表評(píng)論

0條評(píng)論

最新活動(dòng)
閱讀需要支付1元查看
<