haizlin / fe-interview

前端面试每日 3+1,以面试题来驱动学习,提倡每日学习与思考,每天进步一点!每天早上5点纯手工发布面试题(死磕自己,愉悦大家),6000+道前端面试题全面覆盖,HTML/CSS/JavaScript/Vue/React/Nodejs/TypeScript/ECMAScritpt/Webpack/Jquery/小程序/软技能……
http://www.h-camel.com
MIT License
25.41k stars 3.26k forks source link

[js] 第128天 说说你对js包装对象的理解 #1098

Open haizhilin2013 opened 5 years ago

haizhilin2013 commented 5 years ago

第128天 说说你对js包装对象的理解

DarthVaderrr commented 5 years ago

包装对象是用来处理基础类型数据的对象,使得字符串、布尔值等变量可以直接调用方法,在对字符串、布尔值进行方法调用的时候,js引擎会自动创建一个包装对象,将操作的值作为原始值,这一过程是隐式的。但是数字类型除外,想要调用数字对象的方法必须显示创建一个Number对象,否则报类型错误。 例如 "a".slice(0) 可以,但是 10.toString(2) 不可以,应该写成 new Number(10).toString(2)

Gerhut commented 5 years ago

10..toString(2) works, which is just a syntax issue.

EmiyaYang commented 5 years ago

@DarthVaderrr 10.toString(2)报的是Uncaught SyntaxError: Invalid or unexpected token,这是词法分析出错而不是类型错误。错误原因在于js编译器将.视为小数点而非点运算符,由于小数点后出现了非数字字符故而被视为无效的token。

更深层的原因在于js中只存在IEEE 754规范的双精度数字,并没有整数这一类型,出现在数字之后的第一个.会被看作是小数点。

Workaround

  1. 10..toString(2)
  2. 10 .toString(2)
  3. (10).toString(2) // recommended
xiaoqiangz commented 2 years ago

对象是JavaScript语言最主要的数据类型,三种原始类型的值――数值、字符串、布尔值――在一定条件下,也会自动转为对象,也就是原始类型的“包装对象”(wrapper)。 所谓“包装对象”,指的是与数值、字符串、布尔值分别相对应的Number、String、Boolean三个原生对象。这三个原生对象可以把原始类型的值变成(包装成)对象