javascript
分享JS一题
說答案
結果 :200
原因:
因為索引 key 為數字或字符串,對象會被轉為字符串 "[object Object]",所以obj[a],obj[b]訪問的都是同一個key
let a={n:100 } let b= {n:200 }中間 這段代碼無意義。
const 聲明
const 的行為與 let 基本相同,唯一一個重要的區別是用它聲明變量時必須同時初始化變量,且
嘗試修改 const 聲明的變量會導致運行時錯誤。
但是!
const 聲明的限制只適用于它指向的變量的引用。換句話說,如果 const 變量引用的是一個對象,
那么修改這個對象內部的屬性并不違反 const 的限制。
Null 類型同樣只有一個值,即特殊值 null。邏輯上講,null 值表示一個空對象指針,這也是給typeof 傳一個 null 會返回"object"的原因:
let car = null; console.log(typeof car); // "object"存儲浮點值使用的內存空間是存儲整數值的兩倍, 所以 ECMAScript 總是想方設法把值轉換為整數
浮點值的精確度最高可達 17 位小數,但在算術計算中遠不如整數精確。例如,0.1 加 0.2 得到的不是 0.3,而是 0.300 000 000 000 000 04
NaN 不等于包括 NaN 在內的任何值。例如,下面的比較操作會返回 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最重要的特性就是狀態一經改變就無法更改, 首先初始化狀態為pending,執行reject后狀態變為rejected,變為失敗之后 即使后面是resolve, 也不執行了
二:
Promise.resolve(1) .then(res => 2) .catch(err => 3) .then(res => 5). then(res=> console.log(res))答案: 5
解析:除了第一個 then ,以后的所有的 then 都是上一個 then 中的返回結果,首先是promise具有鏈式調用的特性, then接收兩個函數一個成功,一個是失敗函數, 第一個resolve(1), 不管括號里是什么。 其實就是返回一個成功的狀態
三:
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為什么能形成鏈式調用? 因為他返回的不是本身this而是創建了一個新的promisePromise.resolve(1) .then((x) => x + 1) .then((x) => { throw new Error('My Error') }) .catch(() => 1) // 雖然上一個then拋出錯誤,但是這里catch返回的是常量。 就會繼續走下一個then .then((x) => x + 1) // 1 +1 .then((x) => console.log(x)) // 2 .catch(console.error)catch函數依舊return 的是常量。 就繼續走then。 沒有返回值,就停止了
鏈式調用只要有返回值就是返回新的promise函數,這樣你就不會覺得錯誤直接就停止
四:
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函數,第一個 .then(() => {return new Error('error!!!') }) 里面 是return 的一個錯誤, 會繼續走下一個then。 如果第一個 , 修改成這樣 .then(() => {throw error(‘xxx’)})答案就是console.log('catch: ', err)六:
Promise.resolve().then(() => {return Promise.reject('錯誤')}).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
解析:
因為resolve后面的then傳遞的是一個非函數,promise就會把值傳遞給下一個then函數,發現下一個then函數還不是函數,就一直傳到最后
.then((x) => x + 1) 這種即是 返回的是函數 .then(2) 這種就是非函數,意思就是個常量傳進去了
這是then函數里面的實現,throw error他會用try catch 捕獲,執行reject。
而只是單純return ,你傳的newError這個實例,他會走resolve
就是throw error 其實和reject 走的相同路線了
var lsg = '笨'let zqh =lsgzqh ='聰明'console.log('lsg', lsg)
打印"笨"。 lsg 是字符串。 zqh = lsg。 現在他倆值相同。 修改各自的值, 別人不會受影響
var lsg = {zs:'笨' }let zqh =lsgzqh.zs = '聰明'console.log('lsg', lsg.zs)打印“聰明” 說明zs指向了同一個內存地址,所以值相同 . 因為lsg是obj類型。 zqh = lsg 也就是淺拷貝了一份lsg的數據。修改lsg 或者zqh 。 zs的值, 兩個都會被修改。
因為他們分屬不同內存地址
首先我們看執行順序 首先我們命名變量 a,其次開啟一個空間去儲存n:1,然后變量a指向內存地址1。
第二部分 a.x =a = {n:2}, 我們在內存地址1的地方開辟一個x變量儲存a ,而a指向了內存2,內存2沒有x屬性,所以為 undefined
打印b:
{n: 1,x :{ n: 2} }總結
- 上一篇: H5实现多语言
- 下一篇: 如何在手机上破解WIFI密码-手机如何解