網(wǎng)站首頁 編程語言 正文
let和const
let和const不存在變量提升
變量一定要在聲明后使用,否則報錯。
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值都會覆蓋舊值,導(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其實都是一個新的變量,所以最后輸出的是6。
暫時性死區(qū)(temporal dead zone,簡稱TDZ)
只要塊級作用域內(nèi)存在let或const命令,則變量會被綁定在這個區(qū)域內(nèi),不受外層作用域的變量影響。凡在聲明之前使用了變量,則會報錯。
注意,如果使用了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
塊級作用域與函數(shù)聲明
并且ES6規(guī)定,塊級作用域之中,函數(shù)聲明語句的行為類似于let,在塊級作用域之外不可引用。
const
const只保證變量指向的地址不變,不保證該地址的數(shù)據(jù)不變。
const foo = {};
foo.prop = 123;
console.log(foo.prop); // 123
foo = {}; // TypeError: "foo" is read-only
如果真的想將對象凍結(jié),應(yīng)該使用Object.freeze方法。
const foo = Object.freeze({});
// 常規(guī)模式時,下面一行不起作用;
// 嚴格模式時,該行會報錯
foo.prop = 123; // Can't add property prop, object is not extensible
變量解構(gòu)
解構(gòu)必須左右解構(gòu)相同
1.解構(gòu)失敗則是undefined,如有默認值則取默認值
2.左右解構(gòu)不同則拋error
// 報錯
let [foo] = 1;
let [foo] = false;
let [foo] = NaN;
let [foo] = undefined;
let [foo] = null;
let [foo] = {};
上面的表達式都會報錯,因為等號右邊的值,要么轉(zhuǎn)為對象以后不具備Iterator接口(前五個表達式),要么本身就不具備Iterator接口(最后一個表達式)。
事實上,只要某種數(shù)據(jù)結(jié)構(gòu)具有Iterator接口,都可以采用數(shù)組形式的解構(gòu)賦值。例如set數(shù)據(jù)類型和Generate函數(shù)
默認值
解構(gòu)賦值允許默認值,在定義的時候直接賦值即可
var [x=1]=[,3];
console.log(x) // x = 1
注意,ES6內(nèi)部使用嚴格相等運算符(===),判斷一個位置是否有值。所以,如果一個數(shù)組成員不嚴格等于undefined,默認值是不會生效的。
對象的解構(gòu)賦值
對象的解構(gòu)與數(shù)組有一個重要的不同:數(shù)組的元素是按序排列的,取值由它的位置決定;而對象的屬性沒有次序,變量必須與屬性同名,才能取到正確的值。
對象解構(gòu)賦值的內(nèi)部機制:先找到同名屬性,然后再賦給對應(yīng)的變量。真正被賦值的是后者,而不是前者。
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}); // 正確寫法
字符串的解構(gòu)賦值
字符串也可以解構(gòu)賦值。這是因為此時,字符串被轉(zhuǎn)換成了一個類似數(shù)組的對象。
數(shù)值和布爾值的解構(gòu)賦值
解構(gòu)賦值時,如果等號右邊是數(shù)值和布爾值,則會先轉(zhuǎn)為對象。
函數(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]
注意對比與下面代碼的區(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}這個對象設(shè)置了默認值,而不是給x,y分別設(shè)置了默認值
解構(gòu)賦值的7種常見用法
1.變量交換
[x, y] = [y, x];
2.從函數(shù)返回多個值
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ù)默認值
jQuery.ajax = function (url, {
async = true,
beforeSend = function () {},
cache = true,
complete = function () {},
crossDomain = false,
global = true,
// ... more config
}) {
// ... do stuff
};
// 指定參數(shù)的默認值,就避免了在函數(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字符只能用兩個字節(jié)表示,但是es6增加了大括號方式
es5:
"\uD842\uDFB7"
// "??"
"\u20BB7"
// " 7"
es6:
"\u{20BB7}"
// "??"
還可以在變量中拼接Unicode編碼
let hello = 123;
hell\u{6F} // 123
新增方法
1.codePointAt 獲取字符的碼點,10進制
codePointAt方法是測試一個字符由兩個字節(jié)還是由四個字節(jié)組成的最簡單方法。
function is32Bit(c) {
return c.codePointAt(0) > 0xFFFF;
}
is32Bit("??") // true
is32Bit("a") // false
2.String.fromCodePoint() 返回傳入碼點的對于字符
3.字符串Iterator接口新增,可以用for of遍歷字符串
4..at()能返回給定位置的字符串,允許超過FFFF的字符被返回,es5中對應(yīng)的是charAt
5.includes() 判斷字符串中是否包含傳入的字符
6.startsWith() 判斷字符串的起點是否是傳入的字符
7.endsWith() 判斷字符串的終點是否是傳入的字符
8.repeate() 重復(fù)某字符
9.padStart() 補全開頭
10.padEnd() 補全結(jié)尾
模板字符串
嵌入變量${}
空格、縮進、換行會在輸出是保留,可以trim消除
字符串模板嵌套
Number
八進制和二進制寫法
二進制 0b開頭
八進制 0o開頭
新增方法
Number.isNaN
Number.isFinite
Number.isInteger
在JavaScript內(nèi)部,整數(shù)和浮點數(shù)是同樣的儲存方法,所以3和3.0被視為同一個值。
Number.EPSILON 極小的誤差常量
JavaScript能夠準(zhǔn)確表示的整數(shù)范圍在-253到253之間(不含兩個端點),超過這個范圍,無法精確表示這個值。
Number.isSafeInteger() 安全整數(shù)范圍
新增函數(shù)
trunc 化零為整
sign 判斷正負數(shù)
cbrt 計算平方根
clz32 返回一個32位二進制
**指數(shù)運算
原文鏈接:https://www.cnblogs.com/shuiyi/p/5824107.html
相關(guān)推薦
- 2024-01-06 TCP的三次握手和四次揮手
- 2022-09-25 Idea maven項目報錯:Unable to import maven project: See
- 2022-08-10 Pandas?reindex重置索引的使用_python
- 2024-03-02 【JQuery】Ajax 參數(shù)為數(shù)組 的方法
- 2022-03-31 C語言取模取整的深入理解_C 語言
- 2023-03-19 一文掌握匯編語言?halt?命令_匯編語言
- 2022-12-23 Kubernetes有狀態(tài)應(yīng)用管理StatefulSet使用詳解_云其它
- 2022-12-05 單步調(diào)試?step?into/step?out/step?over?區(qū)別說明_python
- 最近更新
-
- window11 系統(tǒng)安裝 yarn
- 超詳細win安裝深度學(xué)習(xí)環(huán)境2025年最新版(
- Linux 中運行的top命令 怎么退出?
- MySQL 中decimal 的用法? 存儲小
- get 、set 、toString 方法的使
- @Resource和 @Autowired注解
- Java基礎(chǔ)操作-- 運算符,流程控制 Flo
- 1. Int 和Integer 的區(qū)別,Jav
- spring @retryable不生效的一種
- Spring Security之認證信息的處理
- Spring Security之認證過濾器
- Spring Security概述快速入門
- Spring Security之配置體系
- 【SpringBoot】SpringCache
- Spring Security之基于方法配置權(quán)
- redisson分布式鎖中waittime的設(shè)
- maven:解決release錯誤:Artif
- restTemplate使用總結(jié)
- Spring Security之安全異常處理
- MybatisPlus優(yōu)雅實現(xiàn)加密?
- Spring ioc容器與Bean的生命周期。
- 【探索SpringCloud】服務(wù)發(fā)現(xiàn)-Nac
- Spring Security之基于HttpR
- Redis 底層數(shù)據(jù)結(jié)構(gòu)-簡單動態(tài)字符串(SD
- arthas操作spring被代理目標(biāo)對象命令
- Spring中的單例模式應(yīng)用詳解
- 聊聊消息隊列,發(fā)送消息的4種方式
- bootspring第三方資源配置管理
- GIT同步修改后的遠程分支