Может ли фронтенд продвигать a == 1 && == 2 && == 3 одновременно?

JavaScript
  • Автор: Чен Даютоу
  • гитхаб:KRISACHAN
  • Связь:GitHub.com/Yvette LA U/S…
  • Предыстория: Недавно старший инженер по фронтендуЛю СяосисуществуетgithubЯ открывал вопрос, связанный с интерфейсом, каждый рабочий деньrepo, Я также участвовал в этом с отношением обучения.Следующее мой ответ.Если что-то не так, я приветствую вас, чтобы указать на это.

Ответы на этот вопрос можно разделить на три категории:

1. Перехват во время преобразования типов

Прежде всего, нам нужно знать, что в JS всего три случая преобразования типов, а именно:

  • преобразовать в логическое значение
  • преобразовать в число
  • преобразовать в строку

Преобразовать в примитивный тип

Когда объект преобразует тип, он выполнит собственный методToPrimitive.

Его алгоритм следующий:

  1. если ужепримитивный тип, возвращается текущее значение;
  2. Поверните, если необходимонитьтогда сначала позвониtoStingметод, если это времяпримитивный типВернитесь напрямую, иначе позвоните еще разvalueOfМетод и вернуть результат;
  3. если ненить, то звоните сначалаvalueOfметод, если это времяпримитивный типВернитесь напрямую, иначе позвоните еще разtoStringМетод и возвращает результат;
  4. если нетпримитивный типвернуть, броситьTypeErrorОшибка типа.

Конечно, мы можем переписатьSymbol.toPrimitiveДля формулировки правил преобразования этот метод имеет наивысший приоритет при преобразовании в примитивные типы.

Таким образом, с этим определением мы можем получить следующие четыре ответа:

var a = {
    arr: [3, 2, 1],
    valueOf () {
        console.group('valueOf')
        console.log(this.arr)
        console.groupEnd('valueOf')
        return this.arr.pop()
    }
}
if (a == 1 && a == 2 && a == 3) {
    console.log('biu')
}

var b = {
    arr: [3, 2, 1],
    toString () {
        console.group('toString')
        console.log(this.arr)
        console.groupEnd('toString')
        return this.arr.pop()
    }
}
if (b == 1 && b == 2 && b == 3) {
    console.log('biu')
}

var c = {
    arr: [3, 2, 1],
    [Symbol.toPrimitive] () {
        console.group('Symbol.toPrimitive')
        console.log(this.arr)
        console.groupEnd('Symbol.toPrimitive')
        return this.arr.pop()
    }
}
if (c == 1 && c == 2 && c == 3) {
    console.log('biu')
}

var d = [1, 2, 3]
d.join = d.shift
if (d == 1 && d == 2 && d == 3) {
    console.log('biu')
}

Примечание Рыбьей головы: по сути, эти четыре можно считать одним и тем же. Что касается последнего, мы можем взглянуть на ECMAArray.prototype.toString ( )определение:

  1. определениеarrayдляToObject(this value)(собственный метод, преобразует текущий массив в объект);
  2. определениеfuncдляGet(array, 'join')(Собственный метод, вызываемый на этом шагеjoinметод);
  3. еслиIsCallble(func)(Собственный метод, судя по тому, есть ли внутренняя вызываемая функция)false, затем установитеfuncродная функция%ObjProto_toString%(родная функция,toStringконкретная реализация);
  4. вернутьCall(func, array).

2 парыgetterугон

Так называемыйgetterЭто метод, который будет вызываться при запросе свойства объекта.get, вы также можете использовать эту функцию для достижения функции заголовка.

код показывает, как показано ниже:

window.val = 0
Object.defineProperty(window, 'd', {
    get () {
        return ++this.val
    }
})
if (d == 1 && d == 2 && d == 3) {
    console.log('biu')
}

const e = new Proxy({}, {
  val: 1,
  get ()  {
    return () => this.val++;
  }
});
if (e == 1 && e == 2 && e == 3) {
    console.log('biu')
}

3. Регулярные выражения

JSсерединаRegExp.prototype.exec()Роль состоит в том, чтобы выполнить поиск по указанной строке, возвращая массив результатов илиnull.

Когда регулярное выражение использует "g" флаг, он может выполняться несколько разexecметод для поиска успешных совпадений в пределах одной строки. Когда вы сделаете это, поиск начнется с регулярного выраженияlastIndexНачните с места, указанного свойством. (test()также будет обновлятьlastIndexАтрибуты).

lastIndexДоступный для чтения и записи целочисленный атрибут регулярного выражения, используемый для указания начального индекса следующего совпадения. Только регулярные выражения используют " для глобального поискаg", это свойство будет работать только.

Примечание к рыбу Примечание: только регулярные выражения используют «» для глобального поискаg", это свойство будет работать только.

Подводя итог, мы можем иметь следующую схему:

var f = {
    reg: /\d/g,
    valueOf () {
        return this.reg.exec(123)[0]
    }
}
if (f == 1 && f == 2 && f == 3) {
    console.log('biu')
}

Примечание рыбьей головы: вышеприведенный метод на самом деле использует характеристики преобразования типов. Тогда я пока запишу три приведенных выше ответа.Интересно, достаточно ли вы умны, чтобы иметь другие решения?

Если вам нравится обсуждать технологии или у вас есть какие-либо комментарии или предложения по этой статье, вы можете добавить друзей Yutou в WeChat для совместного обсуждения.Конечно, Yutou также надеется поговорить с вами о жизни, хобби и поболтать. WeChat ID Fish Head: krisChans95 Вы также можете отсканировать код, чтобы подписаться на официальный аккаунт и подписаться на более интересный контент.

https://fish-pond-1253945200.cos.ap-guangzhou.myqcloud.com/img/base/qrcode-all.png