溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊(cè)×
其他方式登錄
點(diǎn)擊 登錄注冊(cè) 即表示同意《億速云用戶服務(wù)條款》

ES6變量賦值和基本數(shù)據(jù)類型實(shí)例分析

發(fā)布時(shí)間:2022-07-08 09:46:46 來(lái)源:億速云 閱讀:109 作者:iii 欄目:開(kāi)發(fā)技術(shù)

本篇內(nèi)容介紹了“ES6變量賦值和基本數(shù)據(jù)類型實(shí)例分析”的有關(guān)知識(shí),在實(shí)際案例的操作過(guò)程中,不少人都會(huì)遇到這樣的困境,接下來(lái)就讓小編帶領(lǐng)大家學(xué)習(xí)一下如何處理這些情況吧!希望大家仔細(xì)閱讀,能夠?qū)W有所成!

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ì)覆蓋舊值,導(dǎo)致最后輸出的是最后一輪的i的值。

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

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

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

只要塊級(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ù)聲明語(yǔ)句的行為類似于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] = {};

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

事實(shí)上,只要某種數(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ì)象的屬性沒(méi)有次序,變量必須與屬性同名,才能取到正確的值。

對(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}); // 正確寫(xiě)法

字符串的解構(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種常見(jiàn)用法

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)部再寫(xiě)var foo = config.foo || 'default foo';這樣的語(yǔ)句。

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中超過(guò)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()能返回給定位置的字符串,允許超過(guò)FFFF的字符被返回,es5中對(duì)應(yīng)的是charAt
5.includes() 判斷字符串中是否包含傳入的字符
6.startsWith() 判斷字符串的起點(diǎn)是否是傳入的字符
7.endsWith() 判斷字符串的終點(diǎn)是否是傳入的字符
8.repeate() 重復(fù)某字符
9.padStart() 補(bǔ)全開(kāi)頭
10.padEnd() 補(bǔ)全結(jié)尾

模板字符串

嵌入變量${}
空格、縮進(jìn)、換行會(huì)在輸出是保留,可以trim消除
字符串模板嵌套

Number

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

二進(jìn)制 0b開(kāi)頭
八進(jìn)制 0o開(kāi)頭

新增方法

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)),超過(guò)這個(gè)范圍,無(wú)法精確表示這個(gè)值。

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

新增函數(shù)

trunc 化零為整

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

cbrt 計(jì)算平方根

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

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

“ES6變量賦值和基本數(shù)據(jù)類型實(shí)例分析”的內(nèi)容就介紹到這里了,感謝大家的閱讀。如果想了解更多行業(yè)相關(guān)的知識(shí)可以關(guān)注億速云網(wǎng)站,小編將為大家輸出更多高質(zhì)量的實(shí)用文章!

向AI問(wèn)一下細(xì)節(jié)

免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如果涉及侵權(quán)請(qǐng)聯(lián)系站長(zhǎng)郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。

es6
AI