Skip to content

类型与转换

来源:js/基础/1基础.html,对 JS 类型系统、隐式转换、类型判断、this 绑定进行实例化验证。


一、基本类型与包装对象

基本类型在访问属性和方法时,JS 引擎会自动生成一个临时包装对象,调用结束后立即销毁。

js

注意:

  • 数字直接量调用属性会被误判为小数点,如 123.toString() 报错,需 (123).toString()
  • {} instanceof Object 不允许,因为 {} 被识别为代码块

二、隐式转换

2.1 转 Boolean

if (any) {} 本质上就是类型转 Boolean 的过程。引用类型全部为 true

js

2.2 转 String

大部分返回自己的字符串形态,Object 返回 [object Object]

js

2.3 转 Number

引用类型转 Number 一般为 NaN,数组是例外。

js

WARNING

Symbol() 不能转 Number,会抛出 TypeError。


三、类型判断

原文件用 20+ 种类型的数组,分别用 typeofconstructorinstanceofObject.prototype.toString 遍历对比。

js

结论:

  • typeof:引用类型统一返回 "object"null 也被判为 "object"
  • constructor:重写 prototype 对象时会影响指向;null/undefined 无 constructor
  • instanceof:跨 iframe 场景失效,pageB 的数组到 pageAinstanceof Arrayfalse
  • Object.prototype.toString:最准确的类型判断方式,返回 [object Xxx] 格式

四、手写 call / apply / bind

4.1 手写 call

js

4.2 手写 apply

js

4.3 手写 bind

js

五、手写 new

js

两种实现方式的区别

  • obj.__proto__ = fn.prototype:直接赋值,原型链顶端为 Object.prototype
  • Object.create(fn.prototype):创建干净的空对象,__proto__ 正确指向