补全代码让其执行
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,就要加入空格
(12).toString() // "12"