let和const
let和const兩者并不存在變量提升
這里要說明的是變量一定要在聲明后使用,否則報錯。
var a = []; for (var i = 0; i < 10; i++) { a[i] = function () { console.log(i); }; } a[6](); // 10
變量i是var聲明的,我們要知道這里在全局范圍內都有效。我們要知道在每一次循環中,新的i值都會覆蓋舊值,這樣就可以在最后輸出的是最后一輪的i的值。
var a = []; for (let i = 0; i < 10; i++) { a[i] = function () { console.log(i); }; } a[6](); // 6
我們可以看到在上面代碼中,變量i是let聲明的,要知道這個只有當前的i只在本輪循環有效,所以每一次循環的i其實都是一個新的變量,所以最后輸出的是6。
暫時性死區(temporal dead zone,簡稱TDZ)
這里要說的是當在塊級作用域內存在let或const命令,則變量會被綁定在這個區域內,不受外層作用域的變量影響。凡在聲明之前使用了變量,則會報錯。
注意,如果使用了let或const,typeof 就不安全了
var tmp = 123; if (true) { tmp = 'abc'; // ReferenceError let tmp; }
不允許重復聲明
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
塊級作用域與函數聲明
并且ES6規定,塊級作用域之中,函數聲明語句的行為類似于let,在塊級作用域之外不可引用。
const
const只保證變量指向的地址不變,不保證該地址的數據不變。
const foo = {}; foo.prop = 123; console.log(foo.prop); // 123 foo = {}; // TypeError: "foo" is read-only
如果真的想將對象凍結,應該使用Object.freeze方法。
const foo = Object.freeze({}); // 常規模式時,下面一行不起作用; // 嚴格模式時,該行會報錯 foo.prop = 123; // Can't add property prop, object is not extensible
變量解構
解構必須左右解構相同
1.解構失敗則是undefined,如有默認值則取默認值
2.左右解構不同則拋error
// 報錯 let [foo] = 1; let [foo] = false; let [foo] = NaN; let [foo] = undefined; let [foo] = null; let [foo] = {};
我們看到上面是報錯,因為等號右邊的值,要么轉為對象以后不具備Iterator接口(前五個表達式),要么本身就不具備Iterator接口(最后一個表達式)。
這里要說明的是只有當某種數據結構具有Iterator接口,由此在采用數組形式的解構賦值。例如set數據類型和Generate函數
默認值
解構賦值允許默認值,在定義的時候直接賦值即可
var [x=1]=[,3]; console.log(x) // x = 1
注意,ES6內部使用嚴格相等運算符(===),判斷一個位置是否有值。所以,如果一個數組成員不嚴格等于undefined,默認值是不會生效的。
對象的解構賦值
對象的解構與數組有一個重要的不同:數組的元素是按序排列的,取值由它的位置決定;而對象的屬性沒有次序,變量必須與屬性同名,才能取到正確的值。
對象解構賦值的內部機制:先找到同名屬性,然后再賦給對應的變量。真正被賦值的是后者,而不是前者。
var {foo,bar} = {foo:'aaa',bar:'bbb'} 等價于 var {foo:foo,bar:bar} = {foo:'aaa',bar:'bbb'}
默認值生效的條件同樣是,對象的屬性值嚴格等于undefined。
注意賦值時不能讓大括號在行首
var x; {x} = {x: 1}; // 會報錯,因為JavaScript引擎會將{x}理解成一個代碼塊 var x; ({x} = {x:1}); // 正確寫法
字符串的解構賦值
字符串也可以解構賦值。這是因為此時,字符串被轉換成了一個類似數組的對象。
數值和布爾值的解構賦值
解構賦值時,如果等號右邊是數值和布爾值,則會先轉為對象。
函數的解構賦值
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] 注意對比與下面代碼的區別 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}這個對象設置了默認值,而不是給x,y分別設置了默認值
解構賦值的7種常見用法
1.變量交換
[x, y] = [y, x];
2.從函數返回多個值
function example() { return [1, 2, 3]; } var [a, b, c] = example();
3.函數參數的定義
function f([x, y, z]) { ... } f([1, 2, 3]);
4.提取JSON數據
var jsonData = { id: 42, status: "OK", data: [867, 5309] }; let { id, status, data: number } = jsonData;
5.函數參數默認值
jQuery.ajax = function (url, { async = true, beforeSend = function () {}, cache = true, complete = function () {}, crossDomain = false, global = true, // ... more config }) { // ... do stuff }; // 指定參數的默認值,就避免了在函數體內部再寫var foo = config.foo || 'default foo';這樣的語句。
6.遍歷Map結構
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字符只能用兩個字節表示,但是es6增加了大括號方式
es5: "\uD842\uDFB7" // "????" "\u20BB7" // " 7" es6: "\u{20BB7}" // "????"
還可以在變量中拼接Unicode編碼
let hello = 123; hell\u{6F} // 123
新增方法
1.codePointAt 獲取字符的碼點,10進制
codePointAt方法是測試一個字符由兩個字節還是由四個字節組成的最簡單方法。
function is32Bit(c) { return c.codePointAt(0) > 0xFFFF; } is32Bit("????") // true is32Bit("a") // false
2.String.fromCodePoint() 返回傳入碼點的對于字符
3.字符串Iterator接口新增,可以用for of遍歷字符串
4..at()能返回給定位置的字符串,允許超過FFFF的字符被返回,es5中對應的是charAt
5.includes() 判斷字符串中是否包含傳入的字符
6.startsWith() 判斷字符串的起點是否是傳入的字符
7.endsWith() 判斷字符串的終點是否是傳入的字符
8.repeate() 重復某字符
9.padStart() 補全開頭
10.padEnd() 補全結尾
模板字符串
嵌入變量${}
空格、縮進、換行會在輸出是保留,可以trim消除
字符串模板嵌套
Number
八進制和二進制寫法
二進制 0b開頭
八進制 0o開頭
新增方法
Number.isNaN
Number.isFinite
Number.isInteger
在JavaScript內部,整數和浮點數是同樣的儲存方法,所以3和3.0被視為同一個值。
Number.EPSILON 極小的誤差常量
JavaScript能夠準確表示的整數范圍在-253到253之間(不含兩個端點),超過這個范圍,無法精確表示這個值。
Number.isSafeInteger() 安全整數范圍
新增函數
trunc 化零為整
sign 判斷正負數
cbrt 計算平方根
clz32 返回一個32位二進制
**指數運算
本篇文章主要就是為大家講述ES6變量賦值和基本數據類型,歡迎大家關注更多精彩內容。
文章版權歸作者所有,未經允許請勿轉載,若此文章存在違規行為,您可以聯系管理員刪除。
轉載請注明本文地址:http://specialneedsforspecialkids.com/yun/128817.html
摘要:復雜數據類型變量,賦值給之后,只讀引用與關聯,和中存儲的是同一個對象的堆內存地址,當這個對象的值發生改變時,此時的值也會發生變化。 不積跬步無以至千里。 關于【Step-By-Step】 Step-By-Step (點擊進入項目) 是我于 2019-05-20 開始的一個項目,每個工作日發布一道面試題。每個周末我會仔細閱讀大家的答案,整理最一份較優答案出來,因本人水平有限,有誤的地方...
摘要:原理判斷左邊的左操作數的對象的原型鏈上是否有右邊這個構造函數的屬性。每個對象都有屬性,但只有函數對象才有屬性在默認情況下,所有的原型對象都會自動獲得一個構造函數屬性,這個屬性是一個指針指向屬性所在的函數原型對象是構造函數的一個實例。 JS JavaScript深入淺出 鏈接描述 數據類型 JS變量按照存儲方式區分為值類型和引用類型,并描述其特點?js值類型和引用類型的區別 值類型...
摘要:支持的類型的內置數據類型羅列如下自定義自定義這三種類型的賦值是同類似的。這根不同,這因為是沒有包裝類新增的基本類型,只支持函數式賦值,不支持字面量和函數構造。 JavaScript支持的類型 JS的內置數據類型羅列如下: undefined null bool number string function object Function Date ...
摘要:其他字符可以是字母下劃線美元符號或數字。在使用聲明變量,但沒有對其初始化時,這個變量的值就是。從邏輯上思考,他們的值,一個是,一個報錯他們的類型,卻都是。這時,可以采用變量的類型進行比較。類型有兩個值字面量和。 javascript 數據類型 javascript由于nodejs的出現將觸角延伸至各個開發領域, 也由于 ES6等后續版本的推出對程序員越來越友好, 收到程序員的強烈推崇,...
閱讀 547·2023-03-27 18:33
閱讀 731·2023-03-26 17:27
閱讀 630·2023-03-26 17:14
閱讀 591·2023-03-17 21:13
閱讀 520·2023-03-17 08:28
閱讀 1800·2023-02-27 22:32
閱讀 1292·2023-02-27 22:27
閱讀 2177·2023-01-20 08:28