开启掘金成长之旅!这是我参与「掘金日新计划 · 12 月更文挑战」的第13天,点击查看活动详情
JavaScript中有很多细节小知识,虽然并不是多么难理解,但是如果你疏忽,他们也许会在你开发的过程中给你造成很大困扰,下面就来分享一下我积累的一些关于返回值的小问题:
1. 定时器的返回值是什么?
const timer1 = setTimeout(() => {
console.log('hi');
}, 0);
const timer2 = setTimeout(() => {
console.log('hello');
}, 1000);
const timer3 = setTimeout(() => {
console.log('hey');
}, 0);
clearTimeout(2)
console.log(timer1);
console.log(timer2);
console.log(timer3);
// 打印结果:
// 1
// 2
// 3
// hi
// hey
定时器 / 延时器返回一个唯一的id,这个id与定时器的执行顺序无关,并且此id可被用于clearTimeout / clearInterval 函数来取消定时。
2. 当函数没有返回值时,默认返回什么?
const arr = [1,2,3].map(num => {
if(typeof num === 'number') return
return num*2
})
console.log(arr);
// [underfined, underfined, underfined]
当函数没有返回任何值时,即默认返回underfined。对数组进行映射的时候,num就是当前循环到的元素,在这个例子中,所有的映射都是number类型,所以if中的判断结果都是true,map函数创建了新数组并且将函数的返回值插入数组。但是没有任何值返回,所以返回默认值underfined,对数组中的每一个元素来说,函数块都得到了这个返回值,所以结果中每一个元素都是underfined。
3. 当对象作为另一个对象的键,会发生什么?
const a= {}
const b = {key: 'b'}
const c = {key: 'c'}
a[b] = 123
a[c] = 456
console.log(a[b]);
// 456
对象的键会被自动转换为字符串。然而,当字符串化一个对象时,它会变成“[ object Object]”。 因此这里说的是,a[ " [ object Object ]" ] = 123。然后,我们再一次做了同样的事情,c是另外一个对象,也会发生隐式字符串化,于是 a[ " [ object Object ]" ] = 456。我们打印a[b],其实就是打印a[ " [ object Object ]" ] ,结果为456。
4. 特别的catch块级作用域
(()=>{
let x,y
try {
throw new Error()
} catch (x) {
(x = 1), (y = 2)
console.log(x);
}
console.log(x);
console.log(y);
})()
// 1
// underfined
// 2
catch 代码块接收参数x,当我们传递参数时,这与之前定义的变量x不同,这个x是属于catch块级作用域的。不过也只有这个传递的参数是特别的,变量y不是作为参数传递过来的,所以它仍然表示上面声明的变量y。
5. preseInt()中的进制
const num = parseInt("7*6",10)
console.log(num);
// 7
parseInt 的第二个参数是指定需要解析的数字是什么进制:十进制、十六进制、八进制、二进制等,设定了进制后,parseInt 检查字符串中的字符是否合法,一旦遇到一个在指定进制中不合法的字符后,立即停止解析并且忽略后面所有的字符。
- 就是不合法的数字字符,所以只解析到7,并将其解析为十进制的7,num的值即为7。
6. 对象之间的引用
let person = {name: "Lydia"}
const members = [person]
person = null
console.log(members);
// [{name: "Lydia"}]
当设置两个对象彼此相等时,它们会通过引用进行交互。但是当你将引用从一个变量分配至另一个变量时,其实只是执行了一个复制操作。
End
以上就是我关于JavaScript的返回值这一方面,结合日常的使用,所做的一些思考,一点浅见,希望能对掘友们有所启发,感谢!