类型系统与V8拆箱装箱机制

目录

  • 1. 类型系统
    • 1.1 强类型语言
    • 1.2 弱类型语言
  • 2. V8拆箱装箱机制
    • 2.1 拆箱机制
    • 2.2 装箱机制
    • 2.3 类型判断

1. 类型系统

类型系统与V8拆箱装箱机制_第1张图片

1.1 强类型语言

强类型语言,即强制数据类型定义的语言。也就是说,一旦一个变量被指定了某个数据类型,如果不经过强制转换,那么它就永远是这个数据类型了。有以下几点需要注意:
①如果你定义了一个整型变量 a,那么程序根本不可能将 a 当作字符串类型处理。
②强类型定义语言是类型安全的语言。
③当你定义一个变量是某个类型,如果不经过代码显式转换(强制转化)过,它就永远都是这个类型,如果把它当做其他类型来用,就会报错。
类型系统与V8拆箱装箱机制_第2张图片

1.2 弱类型语言

弱类型语言,即数据类型可以被忽略的语言。它与强类型定义语言相反, 一个变量可以赋不同数据类型的值。你想把这个变量当做什么类型来用,就当做什么类型来用,语言的解析器会自动(隐式)转换。
类型系统与V8拆箱装箱机制_第3张图片

2. V8拆箱装箱机制

2.1 拆箱机制

如果表达式是其他的(对象) V8 会提供了一个 ToPrimitive 方法,其作用是将 a 和 b 转换为原生数据类型,其转换流程如下:
先检测该对象中是否存在 valueOf 方法,如果有并返回了原始类型,那么就使用该值进行强制类型转换;
如果 valueOf 没有返回原始类型,那么就使用 toString 方法的返回值;
如果 vauleOf 和 toString 两个方法都不返回基本类型值,便会触发一个 TypeError 的错误。

[]+{}    			  // '[object Object]'
({}).toString()     // '[object Object]'
[].valueOf() 		 //  []
[].toString()       //  ''

''+'[object Object]'   // 实质,所以结果就是  '[object Object]'

2.2 装箱机制

加法操作规范
类型系统与V8拆箱装箱机制_第4张图片

1.toString()    //输出 caught SyntaxError: Invalid or unexpected token
1 .toString()  //输出  '1'
(1).toString()  //输出  '1'

2.3 类型判断

toString.call({})  // '[object Object]'
toString.call([])  // '[object Array]'
toString.call(1)   // '[object Number]'
toString.call("")  // '[object String]'
toString.call(true) //'[object Boolean]'
toString.call(function(){})  // '[object Function]'
toString.call(null)  // '[object Null]'
toString.call(undefined) // '[object Undefined]'

你可能感兴趣的:(Google,V8,底层机制和原理,javascript,java,html)