Yuanfang-fe / Blog-X

https://yuanfang-fe.github.io/Blog-X/
4 stars 0 forks source link

有趣的number.toString() #2

Open Yuanfang-fe opened 4 years ago

Yuanfang-fe commented 4 years ago

偶然在别人的博客发现了这么一行神秘代码

(46840404742).toString(36)

然后我在console控制台里执行了一下 🤩好有个性的签名啊!!!恩,这确实很前端

image

我也生成一个自己的试试

image

同时也产生了几个疑问: 一、number类型调用toString()为啥要加括号呢?如果不加会怎样?

image

然后去查了下明白了,如果不加括号,这个点会被 JavaScript 引擎解释成小数点,从而报错。 放在括号里,后面的点表示调用对象属性。

同理:

image

二、36代表了36进制,那为什么是36呢? 原来英文字母a-z表示10-35,英文字母只有26个加上数字0-9只有36个了,所以只能到36进制,而没有37、38、39、40...进制。那最小是几进制呢? image 所以进制是2~36,默认是10进制。

三、这里的2730329055916是基本类型,基本类型应该没有toString()方法才对。 然后又去google了下, 嗖得寺内,原来在读取基本类型的时候,js后创建一个对应的基本包装类型的对象,从而调用一些方法。如下:

image

还需要注意的是null 和 undefined 是没有包装类型的,所以调用toString()是会报错的。

总结: Number、 String、 Boolean、 Object、Function、Array、 Date、RegExp、Error、Map、Set、Symbol 都可以调用toString()方法。 但也有区别,除了Symbol都是从Object的原型上继承来的,而Symbol是基本数据类型,却没有构造函数。

image

MDN的解释是:Symbol 对象拥有自己的 toString 方法,因而遮蔽了原型链上的 Object.prototype.toString()

参考链接: https://www.cnblogs.com/xiaohuochai/p/5557387.html https://www.cnblogs.com/youhong/p/6837534.html https://javascript.ruanyifeng.com/stdlib/number.html

有不对的地方,请务必指正,万分感谢。