分享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
  }
}
相关文章
|
前端开发 Java 数据安全/隐私保护
利用Java动态生成 PDF 文档
利用Java动态生成 PDF 文档,则需要开源的API。首先我们先想象需求,在企业应用中,客户会提出一些复杂的需求,比如会针对具体的业务,构建比较典型的具备文档性质的内容,一般会导出PDF进行存档。那么目前最佳的解决方案,你可能会想到 iText ,对没错。。。 iText+(Velocity / Freemarker)可以实现。不过据我熟悉,iText本身提供的HTML解析器还是不够强大,许
4619 0
|
搜索推荐 数据挖掘
优质网络舆情监测系统大盘点
一款出色的网络舆情监测系统,不仅能够助力相关主体迅速捕捉舆情信息,有效应对危机,还能够助力其更好地把握舆论动态,维护自身形象。那么,市场上有哪些比较好的网络舆情监测系统呢?这里,本文有为各位整理了一些好用的舆情检测系统,以供各位参考!
676 0
|
自然语言处理 前端开发 架构师
物联网行业招聘考核要素简析
以一个物联网项目公司的人事结构调整为例,伤经动骨的方式解决企业核心目标、人力资源与技术目标之间的矛盾。最后分享了案例中的一些关于企业招聘和人才自我建设的一些建议。本文十分主观,抛砖引玉,欢迎大家慎重参考。
2675 0
物联网行业招聘考核要素简析
|
Java Maven
springboot依赖分离,本地代码和第三方依赖包分开,减少部署服务时的上传时间
在pom.xml中的<build>标签中的<plugins>标签中添加下面这个插件
|
监控 搜索推荐 UED
301重定向对SEO的影响:全面解析与最佳实践
本文深入探讨了301重定向在SEO中的作用,涵盖基本概念、积极影响(如保留链接权重、避免重复内容)、潜在风险(如权重传递不完全、错误实施)及最佳实践。同时对比了其他重定向类型,提供了技术实现建议和常见应用场景,帮助网站管理员正确使用301重定向以优化用户体验和搜索引擎表现。
651 16
|
数据可视化 API 索引
DOTween教程☀️DOTween的使用教程
DOTween教程☀️DOTween的使用教程
|
存储 缓存 算法
当今面试最高频的10道算法题,拿捏
当今,大厂面试必回的十道题,拿捏
1064 0
|
算法 机器学习/深度学习
简化论述没有免费午餐定理(NFL)
No Free Lunch Theoren 定理 ,没有免费的午餐定理,简称NFL定理,由美国斯坦福大学的Wolpert和Macready教授提出。 在机器学习算法中的体现为在没有实际背景下,没有一种算法比随机胡猜的效果好。 首先,我们假设一个算法为a,而随机胡猜的算法为b,为了简单起见,假设样本空间为χ\chi 和假设空间为HH都是离散的。令 P(h|X,a)P(h|
6648 0
|
消息中间件 大数据 Java
是时候给大家介绍 Spring Boot/Cloud 背后豪华的研发团队了
我们刚开始学习 Spring Boot 的时候肯定都会看到这么一句话: Spring Boot 是由 Pivotal 团队提供的全新框架,其设计目的是用来简化新 Spring 应用的初始搭建以及开发过程。
2531 0
|
数据库 Python
AVEVA Marine中参数化部件建模和出图
Multi-Plate Modeling and Draft in AVEVA Marine AM中多联复板建模和出图 eryar@163.com Shanghai 200136, China   Abstract: Use parametric component method to crea...
3455 0

热门文章

最新文章