没有合适的资源?快使用搜索试试~ 我知道了~
1_前端学习资料1
需积分: 0 1 下载量 142 浏览量
2022-08-04
11:46:13
上传
评论
收藏 7.98MB PDF 举报
温馨提示
试读
241页
1. 如果是对象,就通过 toPrimitive 转换对象 2. 如果是字符串,就通过 unicode 字符索引来较 1. 新成了个对象 2. 链接到原型 4.
资源详情
资源评论
资源推荐
JS 章节
内置类型
JS 中分为七种内置类型,七种内置类型⼜分为两⼤类型:基本类型和对象(Object)。
基本类型有六种: null , undefined , boolean , number , string , symbol 。
其中 JS 的数字类型是浮点类型的,没有整型。并且浮点类型基于 IEEE 754标准实现,在使
⽤中会遇到某些 Bug。 NaN 也属于 number 类型,并且 NaN 不等于⾃身。
对于基本类型来说,如果使⽤字⾯量的⽅式,那么这个变量只是个字⾯量,只有在必要的时
候才会转换为对应的类型
对象(Object)是引⽤类型,在使⽤过程中会遇到浅拷⻉和深拷⻉的问题。
Typeof
typeof 对于基本类型,除了 null 都可以显示正确的类型
let a = 111 // 这只是字⾯量,不是 number 类型
a.toString() // 使⽤时候才会转换为对象类型
let a = { name: 'FE' }
let b = a
b.name = 'EF'
console.log(a.name) // EF
typeof 对于对象,除了函数都会显示 object
对于 null 来说,虽然它是基本类型,但是会显示 object ,这是⼀个存在很久了的 Bug
PS:为什么会出现这种情况呢?因为在 JS 的最初版本中,使⽤的是 32 位系统,为了性能考
虑使⽤低位存储了变量的类型信息, 000 开头代表是对象,然⽽ null 表示为全零,所以将
它错误的判断为 object 。虽然现在的内部类型判断代码已经改变了,但是对于这个 Bug 却
是⼀直流传下来。
如果我们想获得⼀个变量的正确类型,可以通过 Object.prototype.toString.call(xx) 。
这样我们就可以获得类似 [object Type] 的字符串。
typeof 1 // 'number'
typeof '1' // 'string'
typeof undefined // 'undefined'
typeof true // 'boolean'
typeof Symbol() // 'symbol'
typeof b // b 没有声明,但是还会显示 undefined
typeof [] // 'object'
typeof {} // 'object'
typeof console.log // 'function'
typeof null // 'object'
类型转换
转Boolean
在条件判断时,除了 undefined , null , false , NaN , '' , 0 , -0 ,其他所有
值都转为 true ,包括所有对象。
对象转基本类型
对象在转换基本类型时,⾸先会调⽤ valueOf 然后调⽤ toString 。并且这两个⽅法你是
可以重写的。
当然你也可以重写 Symbol.toPrimitive ,该⽅法在转基本类型时调⽤优先级最⾼。
let a
// 我们也可以这样判断 undefined
a === undefined
// 但是 undefined 不是保留字,能够在低版本浏览器被赋值
let undefined = 1
// 这样判断就会出错
// 所以可以⽤下⾯的⽅式来判断,并且代码量更少
// 因为 void 后⾯随便跟上⼀个组成表达式
// 返回就是 undefined
a === void 0
let a = {
valueOf() {
return 0
}
}
四则运算符
只有当加法运算时,其中⼀⽅是字符串类型,就会把另⼀个也转为字符串类型。其他运算只
要其中⼀⽅是数字,那么另⼀⽅就转为数字。并且加法运算会触发三种类型转换:将值转换
为原始值,转换为数字,转换为字符串。
对于加号需要注意这个表达式 'a' + + 'b'
let a = {
valueOf() {
return 0;
},
toString() {
return '1';
},
[Symbol.toPrimitive]() {
return 2;
}
}
1 + a // => 3
'1' + a // => '12'
1 + '1' // '11'
2 * '2' // 4
[1, 2] + [2, 1] // '1,22,1'
// [1, 2].toString() -> '1,2'
// [2, 1].toString() -> '2,1'
// '1,2' + '2,1' = '1,22,1'
'a' + + 'b' // -> "aNaN"
// 因为 + 'b' -> NaN
// 你也许在⼀些代码中看到过 + '1' -> 1
==== 操作符
上图中的 toPrimitive 就是对象转基本类型。
这⾥来解析⼀道题⽬ [] == ![] // -> true ,下⾯是这个表达式为何为 true 的步骤
剩余240页未读,继续阅读
好运爆棚
- 粉丝: 30
- 资源: 342
上传资源 快速赚钱
- 我的内容管理 展开
- 我的资源 快来上传第一个资源
- 我的收益 登录查看自己的收益
- 我的积分 登录查看自己的积分
- 我的C币 登录后查看C币余额
- 我的收藏
- 我的下载
- 下载帮助
安全验证
文档复制为VIP权益,开通VIP直接复制
信息提交成功
评论0