为啥 console.log 从日志中排除我的零?

Posted

技术标签:

【中文标题】为啥 console.log 从日志中排除我的零?【英文标题】:Why does console.log exclude my zero from logging?为什么 console.log 从日志中排除我的零? 【发布时间】:2019-12-13 18:39:57 【问题描述】:
class Person 
  constructor(name, address, phone) 
    this.name = name;
    this.address = address;
    this.phone = phone;
  

  call() 
    console.log(`Calling $this.phone...`)
  


const tom = new Person('Tom', 'Uden', 0619616);
tom.call();

调用它时,控制台只显示“619616”。当我添加console.log(tom.phone) 时,它会记录整个数字。为什么调用方法时会排除零?

【问题讨论】:

因为没有人提到它:这是不严格的代码,当你删除九个时事情会变得有趣。 @ASDFGerte 我试过这个,从来不知道我的电话号码这么有趣。还有,现在很迷茫。谢谢! 只要记住“使用严格”;除非你非常清楚自己在做什么。在这种情况下,前导零是八进制数的传统表示法。您的代码甚至会进入严格模式。不过,这只是一个旁注,主要问题已在答案和相关 cmets 中进行了描述。 【参考方案1】:

您将其用作整数。

如果要保留零,请将其用作字符串。

class Person 
  constructor(name, address, phone) 
    this.name = name;
    this.address = address;
    this.phone = phone;
  

  call() 
    console.log(`Calling $this.phone...`)
  


const tom = new Person('Tom', 'Uden', '0619616');
tom.call();

解释请查看 cmets 或this link

另一个值得阅读的参考:https://***.com/a/37004175/10473393(感谢@Amy 在 cmets 中的分享)

【讨论】:

感谢您的解决方案。您能否解释一下为什么使用整数时零会消失?是否与 javascript 将其读取为“假”并因此为空有关? @tomdevisser 不,它只是不跟踪前导零,因为它们没有任何数学意义。如果您尝试使用“123.00”作为数字,它会出于同样的原因删除尾随零。如果要保留格式而不仅仅是数字的值,则必须将其设为字符串。 @tomdevisser 012341234 相同。它们在二进制中具有相同的文字表示,并且没有区别。区分它们的唯一方法是强制存储前导零:使用字符串。 @tomdevisser 我想我应该对我所说的添加一个警告。在 JS 中(这可能适用于其他语言),带前导零的数字可能会被错误地视为 八进制。见***.com/questions/37003770/… @tom 如果我可以再添加一件事,虽然电话号码是一个“数字”,但它不是您要在数学中使用的那种数字。所以,虽然它是一个“数字”,但它不是一个“数字”,如果你明白我的意思的话。电话号码前导零在技术上是有效的,需要保留,而且由于您不打算对电话号码使用数学,因此字符串可能是存储它的更合适的方式。同样的逻辑适用于邮政编码、街道号码和其他从不“数学”的“数字”。【参考方案2】:

您可以将其转换为字符串,并填充开头的前导零。例如,我假设您需要一个 7 位数的电话号码。

class Person 
  constructor(name, address, phone) 
    this.name = name;
    this.address = address;
    this.phone = phone;
  

  call() 
    console.log(`Calling $this.phone.toString().padStart(7, 0)...`)
  


const tom = new Person('Tom', 'Uden', 0619616);
tom.call();

【讨论】:

感谢另一个解决方案,从未听说过 padStart。 :)【参考方案3】:

您在 Number 类型中传递的值。如果您想保持整个值不变,则需要使用String,如下所示:

const valueNumber = 0619616;
const valueString = '0619616';

console.log(valueNumber, valueString);

希望对你有帮助!

【讨论】:

谢谢!我只是想了解为什么这是必要的,是否有零不记录的原因? @tomdevisser 根据我的其他评论,前导零没有任何表示,无法与数字“实际值”区分开来【参考方案4】:

要在左侧包含零,您应该将其用作字符串

  constructor(name, address, phone) 
    this.name = name;
    this.address = address;
    this.phone = phone;
  

  call() 
    console.log(`Calling $this.phone...`)
  


const tom = new Person('Tom', 'Uden', '0619616');
tom.call();

【讨论】:

以上是关于为啥 console.log 从日志中排除我的零?的主要内容,如果未能解决你的问题,请参考以下文章

Parse Cloud 函数中的零返回

为啥我的 console.log 没有在这里输出任何东西? [复制]

为啥 Google Chrome 将相同的 console.log 消息分组?

打包优化去掉console.log,webpack.js配置排除打包瘦身

为啥console.log in react 运行两次

如何在heroku中显示node.js中的所有console.log?