刷题记录
隐式类型转换
数学运算符相关
⭐ 所有的 - * \
运算会先把非 Number 值转换为 Number 值
js
1 - true // 0 解释 => Number(true) => 1
1 - null // 1 解释 => Number(null) => 0
1 * undefined // NaN 解释 => Number(undefined) => NaN
2 * ['5'] // 10 解释 => ['5'].toString() => Number('5') => 5
⭐ +
运算符按照从上至下的优先级,满足下列三条规则
- 一侧有 String 类型,另一侧也转换为 String 类型
- 一侧有 Number 类型,另一侧为原始类型,都变为 Number 类型后相加
- 一侧有 Number 类型,另一侧为引用类型,都变为 String 类型后相加
== 相关
一般情况
- Boolean 类型会优先转变为 Number 类型(和任何值比较)
- String 类型和 Number 类型比较,String 类型会转变为 Number 类型
- 原始类型和引用类型比较,引用类型会先
valueOf
后 toString,此时就变成了上面的情况
特殊情况
- 单个变量转换为 Boolean,
null, undefined, '', NaN, 0, false
=> false - NaN 和其他任何值比较都是 false,包括自己
- null == undefined 是 true,这两个值和其他任何值比较都是 false
构造函数
js
'foo' == new function () {
return new String('foo')
}
// 'foo' == new String('foo')
// 'foo' == 'foo'
// true
'foo' == new function () {
return String('foo')
}
// 'foo' == {}
// 'foo' == '[object Object]'
// false
解释
- 如果构造函数未返回对象,则返回空对象
- 如果构造函数返回了对象,则使用此对象
Object 相关属性
defineProperty
描述符
- writable,值是否可以更改
- enumerable,是否会在循环中列出
- configurable,属性是否可被删除,描述符是否可被更改
默认值
- 某个属性如果是通过普通语法创建的,这三个默认值均为 true
- 如果是通过 defineProperty 创建的,这三个默认值均为 false
特殊情况:configurable 是 false 的情况下,支持 writable true → false 单向更改
原型链图示
不是所有的对象都有原型,有一种情况除外:
js
let obj = Object.create(null)
console.log(obj.__proto__) // undefined