Skip to content

刷题记录

隐式类型转换

数学运算符相关

⭐ 所有的 - * \ 运算会先把非 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