冷知识,Chrome 控制台console.log()为什么返回undefined

前言

不知道各位有没有在Chrome控制台中,使用console.log()输出数据,例如

console.log('Hello World')

image-20230221162917399

如果你曾经稍微留意,你会发现第二个返回值是undefined。是浏览器控制台出现BUG了嘛?我们期望的输出只有’Hello World’。

其实这是因为Chrome Console 是一个 REPL 环境导致的,

REPL

读取-求值-输出”循环(英语:Read-Eval-Print Loop,简称REPL),也被称做交互式顶层构件(英语:interactive toplevel),是一个简单的,交互式的编程环境。这个词常常用于指代一个Lisp的交互式开发环境,也能指代命令行的模式。

也就是说REPL环境的交互模式是:

  1. 接收你的输入,
  2. 然后运行,
  3. 输出结果,
  4. 继续接收你的输入。

你可以用下面的表达式来描述这种交互模式:

(loop (print (eval (read))))

所以最简单的理解【Chrome 控制台console.log()为什么返回undefined】就是:

当你在Chrome Console输入代码回车后,然后把这段代码作为字符串参数传给 eval 函数然后执行。eval 函数返回字符串代码的返回值。如果返回值为空,则返回 [undefined]。

探究

上面我们简单的说明了输出undefined的原因,现在我们再来仔细的了解!

普通声明

看下面这个例子:

image-20230221164922316

我们给变量进行了复制的操作,返回的结果同样也是undefined。现在我们用REPL来解释:

  1. 控制台读取了var name = "半夏";

  2. 把它作为字符串传递给了eval()函数去执行:

    string = 'var name = "半夏";'
    eval(string)
    
  3. 因为我们只是声明了一个变量,没有任何返回值,所以eval()执行完成之后打印了undefined

无return函数

下面我们来看一个函数的例子:

image-20230221170038544

各位此时应该在想,因为函数都是有返回值的,如果没有显式的return,那么默认的返回值就是undefiend,所以这里输出undefiend真的是这样子的嘛???

有return函数

那再来看看下面这个例子:

image-20230222085829441

我明明给函数增加了返回值,但是为啥还是返回的undefiend,道理其实很简单! 我们在这里其实还只是声明了一个函数,跟第一个例子的效果是一致的。

当我们执行该函数的时候,此时的执行才给出了返回值。

image-20230222085921670

总结

综合上面三个例子,我们是不是对Chrome 控制台执行console.log()为啥输出undefined做出解释!

console.log()本身并不返回任何值,在Chrome中,console.log() 是由开发工具的 Console 面板实现的。当代码中调用 console.log() 时,实际上是将输出内容传递给了 Console 面板,由它来负责显示。所以当我们在控制台使用console.log()时,它只是简单地将我们指定的信息打印到控制台上,而不会返回任何实际的值。因此,console.log()返回undefined是因为它本身没有返回值。

附录

Chrome 的 V8 引擎中,console.log() 被封装成一个 C++ 函数,该函数会将传入的参数转换为字符串并打印到控制台上。

然后,在 ChromeDevTools 中,console.log() 被再次封装成一个 JavaScript 函数,该函数会对传入的参数进行处理,并将其渲染到控制台上。

具体地说,这个 JavaScript 函数会先对传入的参数进行格式化,将其转换为一个可显示的对象。如果传入的参数是一个对象,会对其进行序列化并添加到一个消息队列中;如果传入的参数是一个字符串,会将其包装成一个包含该字符串的对象并添加到消息队列中。然后,这个 JavaScript 函数会将消息队列中的内容进行渲染,并在控制台上显示出来。

  • 20
    点赞
  • 19
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 16
    评论
### 回答1: `console.log` 是一种在 JavaScript 中输出信息到控制台的方法。它可以用于调试代码和输出各种类型的信息,包括字符串、数字、布尔值、对象、数组等。当您在代码中调用 `console.log` 时,它会在浏览器或 Node.js 的控制台中打印出您指定的信息。 例如,在 JavaScript 中,您可以使用以下代码将一条消息打印到控制台中: ``` console.log("Hello World!"); ``` 这将在控制台中输出字符串 "Hello World!"。您还可以将其他类型的值传递给 `console.log`,例如: ``` console.log(42); // 输出数字 42 console.log(true); // 输出布尔值 true console.log({name: "John", age: 30}); // 输出一个对象 console.log([1, 2, 3]); // 输出一个数组 ``` `console.log` 是一种非常有用的调试工具,可以帮助您诊断和解决 JavaScript 中的问题。 ### 回答2: console.log() 是JavaScript中用于向控制台输出信息的内置函数。它可以用于在浏览器控制台或Node.js中打印出我们想要的任何信息。这个函数的主要作用是用于调试代码和查看程序的运行结果。 console.log()函数有很多用法。它可以接受一个或多个参数,这些参数可以是字符串、数值、对象、数组等。例如,我们可以使用console.log("Hello, World!")来在控制台打印出"Hello, World!"这个字符串。 console.log()还可以接受变量作为参数,从而输出该变量的值。通过这种方式,我们可以检查程序中某个变量的取值,以帮助我们调试代码。例如,如果我们想要查看一个变量num的值,我们可以使用console.log(num)来输出该变量的值。 此外,console.log()函数还可以通过格式化字符串的方式输出信息。我们可以使用占位符,例如%s代表字符串、%d代表整数、%f代表浮点数等。通过这种方式,我们可以更加灵活地输出信息,并且能够在同一行中同时输出多个变量的值。 总而言之,console.log()是一个非常实用的函数,它在开发过程中起着重要的作用。它可以用于查看变量的值、调试程序、输出调试信息等。了解如何使用console.log()函数可以帮助我们更好地理解和调试代码,提高开发效率。 ### 回答3: console.log是一个在JavaScript中常用的方法,用于在控制台打印输出信息。它可以用于调试代码,查看变量的值或输出自定义的消息。 console.log的作用很简单,当我们希望在浏览器的开发者工具控制台中输出一些信息时,就可以使用它。使用方法也非常简单,只需在代码中调用console.log()方法,并将要输出的信息作为参数传入即可。 console.log的输出结果包含在控制台中,可以显示在不同的标签页和面板上。我们可以在Chrome浏览器的控制台中看到这些输出,也可以在其他浏览器或集成开发环境中使用。 除了输出简单的消息外,console.log还可以输出复杂的数据类型,如对象和数组。它会将这些数据以易读的方式展示出来,方便我们查看和调试。同时,它还支持格式化输出,可以使用占位符来将变量的值插入到输出消息中。 使用console.log能够提高代码的可读性和调试效率。通过在关键位置插入console.log语句,我们可以查看变量在特定时刻的值,从而找出代码中的问题和错误。在调试过程中,我们可以根据输出结果逐步分析和修复代码,提高开发效率。 总之,console.logJavaScript开发中非常实用的方法,它能够帮助我们输出和查看调试信息,提高代码的质量和效率。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 16
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

程序员半夏

你的打赏,我的动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值