分享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
  }
}
相关文章
|
机器学习/深度学习 数据采集 监控
如何从零开始构建深度学习项目?这里有一份详细的教程
很多人工智能项目其实并没有那么严肃,做起来还很有趣。2017 年初,我着手启动了一个为日本漫画上色的项目,并作为我对生成对抗网络 ( GAN ) 研究的一部分。这个问题很难解决,但却很吸引人,尤其是对于我这种不会画画的人来说!在寻找项目时,不要局限于增量性改进,去做一款适销对路的产品,或者创建一种学习速度更快、质量更高的新模型。
如何从零开始构建深度学习项目?这里有一份详细的教程
|
Windows
windows server 2012 R2 .NET Runtime Optimization Service CPU占用高
windows server 2012 R2 .NET Runtime Optimization Service CPU占用高
596 0
|
6月前
|
机器学习/深度学习 PyTorch 算法框架/工具
【Pytorch】Expected hidden[0] size (2, 136, 256), got [2, 256, 256]
文章解决了PyTorch中LSTM模型因输入数据的批次大小不一致导致的“Expected hidden[0] size”错误,并提供了两种解决方案:调整批次大小或在DataLoader中设置drop_last=True来丢弃最后一个不足批次大小的数据。
125 1
|
机器学习/深度学习 并行计算 数据可视化
cs224w(图机器学习)2021冬季课程学习笔记13 Colab 3
本colab主要实现: 实现GraphSAGE和GAT模型,应用在Cora数据集上。 使用DeepSNAP包切分图数据集、实现数据集转换,完成边属性预测(链接预测)任务。
cs224w(图机器学习)2021冬季课程学习笔记13 Colab 3
|
9月前
|
Python
攻防世界---misc---适合作为桌面
攻防世界---misc---适合作为桌面
|
Java Maven
Cannot resolve plugin org.apache.tomcat.maven:tomcat7-maven-plugin:<unknown>
Cannot resolve plugin org.apache.tomcat.maven:tomcat7-maven-plugin:<unknown>
1610 0
Cannot resolve plugin org.apache.tomcat.maven:tomcat7-maven-plugin:<unknown>
|
数据安全/隐私保护 网络架构 Ubuntu
使用Orange Pi Zero做小小服务器(配置篇)
1.ssh连接 将Orange Pi Zero插入网线至局域网环境内, 通过路由器的管理页面查看Orange Pi Zero 的 ip, 打开putty 输入ip 连接 20170312155355.
2270 1
> Construction@0.1.0 serve > vue-cli-service serve ‘vue-cli-service‘ 不是内部或外部命令,也不是可运行的程序
> Construction@0.1.0 serve > vue-cli-service serve ‘vue-cli-service‘ 不是内部或外部命令,也不是可运行的程序
154 1
|
Web App开发 监控 网络协议
QUIC 简介及 NodeJs 简单示例
QUIC协议是一个新的通讯协议,基于 UDP 的传输协议并希望最终取代所有基于TCP的HTTP请求。熟悉 UDP 的人都应该清楚为什么要使用 QUIC。UDP 是的特点是不可靠、数据包经常丢失、重新排序、重复等等。UDP 不包括任何更高级别协议(如 HTTP)严格要求的 TCP 的可靠性和顺序保证,这就是 QUIC 的用武之地。
740 0
QUIC 简介及 NodeJs 简单示例
|
JSON Kubernetes 安全
【网络技术】什么是CNI
【网络技术】什么是CNI
623 0

热门文章

最新文章