分享JS一题

简介: 分享JS一题
let obj ={}
let a={
    n:100
}
let b= {
    n:200
}
obj[a]=100
obj[b]=200
console.log(obj[a])

说答案


结果 :200

原因:


因为索引 key 为数字或字符串,对象会被转为字符串 "[object Object]",所以obj[a],obj[b]访问的都是同一个key

let a={
    n:100
}
let b= {
    n:200
}

中间 这段代码无意义。

image.png


const 声明

const 的行为与 let 基本相同,唯一一个重要的区别是用它声明变量时必须同时初始化变量,且

尝试修改 const 声明的变量会导致运行时错误。


但是!


const 声明的限制只适用于它指向的变量的引用。换句话说,如果 const 变量引用的是一个对象,

那么修改这个对象内部的属性并不违反 const 的限制。

const person = {};
person.name = 'Matt'; // ok 

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而是创建了一个新的promise
Promise.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

解析:

image.png


因为resolve后面的then传递的是一个非函数,promise就会把值传递给下一个then函数,发现下一个then函数还不是函数,就一直传到最后

.then((x) => x + 1)  这种即是 返回的是函数
.then(2)  这种就是非函数,意思就是个常量传进去了

image.png

这是then函数里面的实现,throw error他会用try catch 捕获,执行reject。

而只是单纯return ,你传的newError这个实例,他会走resolve

就是throw error 其实和reject 走的相同路线了

image.png

var lsg = '笨'
let zqh =lsg
zqh ='聪明'
console.log('lsg', lsg)

打印"笨"。 lsg 是字符串。 zqh = lsg。 现在他俩值相同。 修改各自的值, 别人不会受影响

var lsg = {
    zs:'笨'
}
let zqh =lsg
zqh.zs = '聪明'
console.log('lsg', lsg.zs)

打印“聪明” 说明zs指向了同一个内存地址,所以值相同 . 因为lsg是obj类型。 zqh = lsg 也就是浅拷贝了一份lsg的数据。修改lsg 或者zqh 。 zs的值, 两个都会被修改。

因为他们分属不同内存地址

let a = {
    n: 1
}
a.x = a = {
    n: 2
}
let b = a
console.log(a.x)
console.log(b)

首先我们看执行顺序 首先我们命名变量 a,其次开启一个空间去储存n:1,然后变量a指向内存地址1。

第二部分 a.x =a = {n:2}, 我们在内存地址1的地方开辟一个x变量储存a ,而a指向了内存2,内存2没有x属性,所以为 undefined

image.pngimage.pngimage.png




let a = {
    n: 1
}
let b = a
a.x = a = {
    n: 2
}
console.log(a.x)
console.log(b)

image.png

打印b:

{
    n: 1,
    x :{ 
    n: 2
  }
}
相关文章
|
JavaScript
js题解(三)
js题解(三)
58 1
|
JavaScript 数据安全/隐私保护
js练习题
js练习题
|
JavaScript
js实现二分查找
js实现二分查找
48 0
|
JavaScript
js题解(二)
js相关题目
36 0
|
6月前
|
存储 算法 JavaScript
|
4月前
|
JavaScript
JS 实现动态规划
JS 实现动态规划
26 0
|
JavaScript 前端开发
Js数组常见的题目,你能做对几个
Js数组常见的题目,你能做对几个
64 0
|
6月前
|
算法 JavaScript
|
JavaScript
js题解(四)
js题解(四)
39 2
|
JavaScript
js题解(一)
斐波那契数列 邮箱验证 计时器
64 1