javascript
分享JS一题
說答案
結(jié)果 :200
原因:
因?yàn)樗饕?key 為數(shù)字或字符串,對(duì)象會(huì)被轉(zhuǎn)為字符串 "[object Object]",所以obj[a],obj[b]訪問的都是同一個(gè)key
let a={n:100 } let b= {n:200 }中間 這段代碼無意義。
const 聲明
const 的行為與 let 基本相同,唯一一個(gè)重要的區(qū)別是用它聲明變量時(shí)必須同時(shí)初始化變量,且
嘗試修改 const 聲明的變量會(huì)導(dǎo)致運(yùn)行時(shí)錯(cuò)誤。
但是!
const 聲明的限制只適用于它指向的變量的引用。換句話說,如果 const 變量引用的是一個(gè)對(duì)象,
那么修改這個(gè)對(duì)象內(nèi)部的屬性并不違反 const 的限制。
Null 類型同樣只有一個(gè)值,即特殊值 null。邏輯上講,null 值表示一個(gè)空對(duì)象指針,這也是給typeof 傳一個(gè) null 會(huì)返回"object"的原因:
let car = null; console.log(typeof car); // "object"存儲(chǔ)浮點(diǎn)值使用的內(nèi)存空間是存儲(chǔ)整數(shù)值的兩倍, 所以 ECMAScript 總是想方設(shè)法把值轉(zhuǎn)換為整數(shù)
浮點(diǎn)值的精確度最高可達(dá) 17 位小數(shù),但在算術(shù)計(jì)算中遠(yuǎn)不如整數(shù)精確。例如,0.1 加 0.2 得到的不是 0.3,而是 0.300 000 000 000 000 04
NaN 不等于包括 NaN 在內(nèi)的任何值。例如,下面的比較操作會(huì)返回 false:
console.log(NaN == NaN); // false
8/27 又來一題
一:
let p = new Promise(function(resolve,reject){reject();resolve(); }) p.then(function(){console.log('成功') },function(){console.log('失敗') }) 不要試圖敲代碼輸出答案: console.log('失敗')
解析: promise最重要的特性就是狀態(tài)一經(jīng)改變就無法更改, 首先初始化狀態(tài)為pending,執(zhí)行reject后狀態(tài)變?yōu)閞ejected,變?yōu)槭≈?即使后面是resolve, 也不執(zhí)行了
二:
Promise.resolve(1) .then(res => 2) .catch(err => 3) .then(res => 5). then(res=> console.log(res))答案: 5
解析:除了第一個(gè) then ,以后的所有的 then 都是上一個(gè) then 中的返回結(jié)果,首先是promise具有鏈?zhǔn)秸{(diào)用的特性, then接收兩個(gè)函數(shù)一個(gè)成功,一個(gè)是失敗函數(shù), 第一個(gè)resolve(1), 不管括號(hào)里是什么。 其實(shí)就是返回一個(gè)成功的狀態(tài)
三:
Promise.resolve(1) .then((x) => x + 1) .then((x) => { throw new Error('My Error') }) .catch(() => 1) .then((x) => x + 1) .then((x) => console.log(x)) .catch(console.error)答案: 2
promise為什么能形成鏈?zhǔn)秸{(diào)用? 因?yàn)樗祷氐牟皇潜旧韙his而是創(chuàng)建了一個(gè)新的promisePromise.resolve(1) .then((x) => x + 1) .then((x) => { throw new Error('My Error') }) .catch(() => 1) // 雖然上一個(gè)then拋出錯(cuò)誤,但是這里catch返回的是常量。 就會(huì)繼續(xù)走下一個(gè)then .then((x) => x + 1) // 1 +1 .then((x) => console.log(x)) // 2 .catch(console.error)catch函數(shù)依舊return 的是常量。 就繼續(xù)走then。 沒有返回值,就停止了
鏈?zhǔn)秸{(diào)用只要有返回值就是返回新的promise函數(shù),這樣你就不會(huì)覺得錯(cuò)誤直接就停止
四:
Promise.resolve(1).then((res) => {console.log(res)return 2}).catch((err) => {return 3}).then((res) => {console.log(res)})答案: 1,2
五:
Promise.resolve().then(() => {return new Error('error!!!') }).then((res) => {console.log('then: ', res)}).catch((err) => {console.log('catch: ', err)})答案: console.log('then: ', res)
除了promise.reject或者throw error 。 其他無論返回什么都走外層then函數(shù),第一個(gè) .then(() => {return new Error('error!!!') }) 里面 是return 的一個(gè)錯(cuò)誤, 會(huì)繼續(xù)走下一個(gè)then。 如果第一個(gè) , 修改成這樣 .then(() => {throw error(‘xxx’)})答案就是console.log('catch: ', err)六:
Promise.resolve().then(() => {return Promise.reject('錯(cuò)誤')}).then((res) => {console.log('then: ', res)}).catch((err) => {console.log('catch: ', err)})答案: console.log('catch: ', err)
Promise.resolve(1).then(2).then(Promise.resolve(3)).then(console.log)
答案: 1
解析:
因?yàn)閞esolve后面的then傳遞的是一個(gè)非函數(shù),promise就會(huì)把值傳遞給下一個(gè)then函數(shù),發(fā)現(xiàn)下一個(gè)then函數(shù)還不是函數(shù),就一直傳到最后
.then((x) => x + 1) 這種即是 返回的是函數(shù) .then(2) 這種就是非函數(shù),意思就是個(gè)常量傳進(jìn)去了
這是then函數(shù)里面的實(shí)現(xiàn),throw error他會(huì)用try catch 捕獲,執(zhí)行reject。
而只是單純r(jià)eturn ,你傳的newError這個(gè)實(shí)例,他會(huì)走resolve
就是throw error 其實(shí)和reject 走的相同路線了
var lsg = '笨'let zqh =lsgzqh ='聰明'console.log('lsg', lsg)
打印"笨"。 lsg 是字符串。 zqh = lsg。 現(xiàn)在他倆值相同。 修改各自的值, 別人不會(huì)受影響
var lsg = {zs:'笨' }let zqh =lsgzqh.zs = '聰明'console.log('lsg', lsg.zs)打印“聰明” 說明zs指向了同一個(gè)內(nèi)存地址,所以值相同 . 因?yàn)閘sg是obj類型。 zqh = lsg 也就是淺拷貝了一份lsg的數(shù)據(jù)。修改lsg 或者zqh 。 zs的值, 兩個(gè)都會(huì)被修改。
因?yàn)樗麄兎謱俨煌瑑?nèi)存地址
首先我們看執(zhí)行順序 首先我們命名變量 a,其次開啟一個(gè)空間去儲(chǔ)存n:1,然后變量a指向內(nèi)存地址1。
第二部分 a.x =a = {n:2}, 我們?cè)趦?nèi)存地址1的地方開辟一個(gè)x變量?jī)?chǔ)存a ,而a指向了內(nèi)存2,內(nèi)存2沒有x屬性,所以為 undefined
打印b:
{n: 1,x :{ n: 2} }總結(jié)
- 上一篇: H5实现多语言
- 下一篇: ECMAScript 新提案:JSON模