閉包產(chǎn)生的函數(shù)有各自的作用域
//var 存在變量提升 (not defined => undefined) 變量泄露
for(var i = 0;i<10;i++){}
console.log(i);
const實(shí)際上保證的束凑,并不是變量的值不得改動(dòng),而是變量指向的那個(gè)內(nèi)存地址所保存的數(shù)據(jù)不得改動(dòng)
let 之前存在死區(qū) 并且不允許重復(fù)聲明
ES5 只有全局作用域和函數(shù)作用域文虏,沒(méi)有塊級(jí)作用域
//let存在塊級(jí)作用域
{
let i =10;
}
console.log(i);
在頂層作用域,let不與window掛鉤,var則與window掛鉤 (var)a===window.a
//IIFE(立即執(zhí)行函數(shù)表達(dá)式)
!(function() {
var temp = 0;
})
//塊級(jí)作用域
{
let temp=0;
}
for循環(huán)不存在塊級(jí)作用域戏蔑,因?yàn)閒or循環(huán)不是函數(shù)
var msg = "hello";
for(var i =0 ;i<10 ;i++)
{
var msg = "changed";
}
console.log(msg);//changed
if(true||A){}
//A不執(zhí)行
if(false||A){}
//A執(zhí)行
if(true&&A){}
//A執(zhí)行
if(false&&A){}
//A不執(zhí)行
(1)基本數(shù)據(jù)類型:number,undefined鲁纠,Boolean总棵,null,string
(2)引用數(shù)據(jù)類型:object改含,function情龄,array
//解構(gòu)賦值時(shí),如果等號(hào)右邊是數(shù)值和布爾值捍壤,則會(huì)先轉(zhuǎn)為對(duì)象骤视。
let {toString: s} = 123;
s === Number.prototype.toString // true
let {toString: s} = true;
s === Boolean.prototype.toString // true
ES6 為字符串添加了遍歷器接口
for of 可識(shí)別 大于0xFFFF的unicode碼,而for(; ;) /for in 不行
0xD800 ~0xDFFF不能單獨(dú)使用
(暫未實(shí)現(xiàn))String.prototype.matchAll返回一個(gè)iterator 需要用Array.from或者for循環(huán)
0b/0B二進(jìn)制 0O 0o八進(jìn)制
嚴(yán)格模式不允許使用0開(kāi)頭代表八進(jìn)制
isFinite isNaN和Number.isFinite Number.isNaN的區(qū)別:前者是全局方法鹃觉,將非數(shù)值先用Number()轉(zhuǎn)換专酗,Number上的則不會(huì)
isNaN('NaN')
//true
Number.isNaN('NaN')
//false
JavaScript 內(nèi)部,整數(shù)和浮點(diǎn)數(shù)采用的是同樣的儲(chǔ)存方法
所以 25 和 25.0 被視為同一個(gè)值帜慢。
Js數(shù)字儲(chǔ)存方法 64 位固定長(zhǎng)度 IEEE 754標(biāo)準(zhǔn)
1 符號(hào)位 0正1負(fù)
2~12 指數(shù)位 次方
13~64 尾數(shù) 溢出進(jìn)1舍0
最大表示范圍則為 11111……111 (52)* 2^11
箭頭函數(shù)的this不能被改變笼裳,不存在arguments,不能當(dāng)作構(gòu)造函數(shù)粱玲,不能使用yield
new 的過(guò)程:
創(chuàng)建一個(gè)臨時(shí)對(duì)象 obj;
將新創(chuàng)建的臨時(shí)對(duì)象的隱式原型指向其構(gòu)造函數(shù)的顯示原型躬柬。
使用 call 改變 this 的指向
如果無(wú)返回值或者返回一個(gè)非對(duì)象值,則將 obj 返回作為新對(duì)象抽减;如果返回值是一個(gè)新對(duì)象的話那么直接直接返回該對(duì)象允青。
Object.create(Object.prototype) = {};
Object.create(null)生成的是純粹的空對(duì)象(無(wú)toString等方法)
apply(obj,arr) 在obj為null時(shí),可以用... (spread運(yùn)算符)代替
spread運(yùn)算符可以用于深拷貝數(shù)組第一層
AMD規(guī)范 Asynchronous Module Definition 異步模塊加載規(guī)范
CMD規(guī)范 Common Moudule Definition 通用模塊加載規(guī)范
UMD規(guī)范 Universal Module Definition 通用模塊規(guī)范
在NodeJs中卵沉,內(nèi)置了module對(duì)象颠锉。并且在每個(gè)模塊中法牲,默認(rèn)var exports = module.exports
NodeJs遵從CommonJs規(guī)范
CommonJS規(guī)范加載模塊是同步的
在服務(wù)器端,模塊都在本地琼掠,加載速度快拒垃,無(wú)需考慮異步加載因此CommonJS規(guī)范比較適用。
瀏覽器環(huán)境下瓷蛙,加載模塊耗時(shí)較大悼瓮,必須采用非同步模式,因此一般采用AMD規(guī)范
ES2016 **指數(shù)運(yùn)算符
ES2017 padStart/padEnd
ES2019 trimStart/trimEnd
舉例來(lái)說(shuō)艰猬,腳本/home/user/projects/foo.js執(zhí)行了require('bar.js')命令横堡,Node會(huì)依次搜索以下文件。
/usr/local/lib/node/bar.js
/home/user/projects/node_modules/bar.js
/home/user/node_modules/bar.js
/home/node_modules/bar.js
/node_modules/bar.js
第一次加載某個(gè)模塊時(shí)冠桃,Node會(huì)緩存該模塊命贴。以后再加載該模塊,就直接從緩存取出該模塊的module.exports屬性食听。
// 刪除指定模塊的緩存
delete require.cache[moduleName];
// 刪除所有模塊的緩存
Object.keys(require.cache).forEach(function(key) {
delete require.cache[key];
})
CommonJS模塊的加載機(jī)制是胸蛛,輸入的是被輸出的值的拷貝。也就是說(shuō)碳蛋,一旦輸出一個(gè)值胚泌,模塊內(nèi)部的變化就影響不到這個(gè)值。請(qǐng)看下面這個(gè)例子肃弟。
對(duì)于依賴的模塊玷室,AMD 是提前執(zhí)行,CMD 是延遲執(zhí)行笤受。
CMD 推崇依賴就近穷缤,AMD 推崇依賴前置。
CMD
CMD推崇依賴就近箩兽,可以把依賴寫(xiě)進(jìn)你的代碼中的任意一行津肛, 如
define(function(require, exports, module) {
var a = require('./a');
a.doSomething();
var b = require('./b');
b.doSomething();
});
AMD
AMD是依賴前置的汗贫,換句話說(shuō)身坐,在解析和執(zhí)行當(dāng)前模塊之前,模塊作者必須指明當(dāng)前模塊所依賴的模塊落包。如
define(['./a','./b'],function(a,b) {
a.doSomething()
b.doSomething()
});