JavaScript里的一些奇怪的返回值

79 阅读3分钟

开启掘金成长之旅!这是我参与「掘金日新计划 · 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的返回值这一方面,结合日常的使用,所做的一些思考,一点浅见,希望能对掘友们有所启发,感谢!