对象转换原始值的规则

本文最后更新于:2022年4月22日 上午

对象转换原始值的规则

对象转换原始值的规则

js 中,当我们把一个对象转换为原始值的时,会按照如下方式转换

  • 调用 [Symbol.toPrimitive] 方法

  • 调用 valueOf 方法

  • 调用 toString 方法

基于该特性可以看以下例子

let obj = {
  [Symbol.toPrimitive]() {
    return '123';
  }
};
console.log(obj == '123');   // true

基于该特性也衍生出一道面试题

面试题

if(a == 1 && a == 2 && a == 3){
  console.log('true')
}

题解一

当理解了对象转原始值的规则后,解这道题就变得简单许多了,该方式可以重写 [Symbol.toPrimitive]valueOftoString 任意方法来实现

let i = 0;
let a = {
  [Symbol.toPrimitive]() {
    return ++i;
  }
};

if (a == 1 && a == 2 && a == 3) {
  console.log('true');  // true
}

题解二

使用 Object.defineProperty() 方式实现

let i = 0;
Object.defineProperty(window, 'a', {
  get() {
    return ++i;
  },
});

if (a == 1 && a == 2 && a == 3) {
  console.log('true');  // true
}

题解三

使用数组来实现

let a = [1, 2, 3];
a.valueOf = a.shift;

if (a == 1 && a == 2 && a == 3) {
  console.log('true');   // true
}

本博客所有文章除特别声明外,均采用 CC BY-SA 4.0 协议,转载请注明出处。