JS装箱&拆箱

补全代码让其执行

const a = {
  default:0,
  valueOf:function(){
    return ++this.default
  }
}
if(a==1&&a==2&&a==3){
  console.log('success')
}

判断

'str' == new String('str') // true
'str' === new String('str') // false

装箱

将基本数据类型转换为对应的引用类型的操作。而装箱又分为隐式装箱和显式装箱。

隐式装箱

当读取一个基本类型值时,后台会创建一个该基本类型所对应基本包装类型对象,根据上面判断代码的例子,由于JS在执行到这条语句的时候,内部将'str'包装成了一个String对象,执行完后再把这个对象丢弃

显式装箱

通过基本包装类型对象对基本类型进行显示装箱

let str = new String('str')

与隐式不同的是,显式装箱出来的变量可以进行属性和方法的添加,隐式的就不会添加上,因为通过new操作符创建的引用类型的实例,在执行流离开当前作用于之前一致保留再内存中。

let str = new String('str')
str.fn = ()=>{
  console.log('fn')
}
str.fn() // fn
str.cc = 'cc'
console.log(str)

拆箱

与装箱相反,把引用类型转变成基本数据类型的操作

拆箱流程:默认先检查对象是否有valueOf方法,如果有就走,没有就再检查是否有toString方法,如果有就走,若都没有就产生TypeError错误

const obj = {
    valueOf:()=>{
    console.log('valueOf')
    return []
  },
  toString:()=>{
    console.log('toString')
    return []
  }
}
String(obj)
// toString
// valueOf
// Uncaught TypeError: Cannot convert object to primitive value

总结:装箱是将值类型转换为引用类型 ,拆箱是将引用类型转换为值类型。

参考JavaScript 基本类型的装箱与拆箱谈谈JavaScript中装箱和拆箱

toString()小数点问题

12.toString报错 12 .toString不报错

词法分析

  • WhiteSpace 空白字符

  • LineTerminator换行符

  • Comment注释

  • Token词

  • IdentifierName - 标识符名称,即使用的变量名称

  • Punctuator - 符号,运算符和大括号等符号

  • NumericLiteral - 数字直接量,数字

  • Template - 字符串模板,用反引号 ` 括起来的直接量

在词法中,规定的最小语义单元:token,而JavaScript规范中规定的数字直接量可以支持四种写法:十进制,二进制,八进制,十六进制。十进制的Number可以带小数,小数点前后可以省略,但不能同时省略

.01 // 0.01
12\. // 12
12.01 // 12.01
12\. === 12 // true

在这里,12.会被当成省略小数点后面部分的数字,而单独看成一个整体,所以我们要想让单独成为一个token,就要加入空格

image.png
(12).toString() // "12"
©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

相关阅读更多精彩内容

友情链接更多精彩内容