- Автор: Чен Даютоу
- гитхаб:KRISACHAN
- Связь:GitHub.com/Yvette LA U/S…
- Предыстория: Недавно старший инженер по фронтендуЛю СяосисуществуетgithubЯ открывал вопрос, связанный с интерфейсом, каждый рабочий деньrepo, Я также участвовал в этом с отношением обучения.Следующее мой ответ.Если что-то не так, я приветствую вас, чтобы указать на это.
Ответы на этот вопрос можно разделить на три категории:
1. Перехват во время преобразования типов
Прежде всего, нам нужно знать, что в JS всего три случая преобразования типов, а именно:
- преобразовать в логическое значение
- преобразовать в число
- преобразовать в строку
Преобразовать в примитивный тип
Когда объект преобразует тип, он выполнит собственный методToPrimitive.
Его алгоритм следующий:
- если ужепримитивный тип, возвращается текущее значение;
- Поверните, если необходимонитьтогда сначала позвони
toStingметод, если это времяпримитивный типВернитесь напрямую, иначе позвоните еще разvalueOfМетод и вернуть результат; - если ненить, то звоните сначала
valueOfметод, если это времяпримитивный типВернитесь напрямую, иначе позвоните еще разtoStringМетод и возвращает результат; - если нетпримитивный типвернуть, бросить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 ( )определение:
- определение
arrayдляToObject(this value)(собственный метод, преобразует текущий массив в объект); - определение
funcдляGet(array, 'join')(Собственный метод, вызываемый на этом шагеjoinметод); - если
IsCallble(func)(Собственный метод, судя по тому, есть ли внутренняя вызываемая функция)false, затем установитеfuncродная функция%ObjProto_toString%(родная функция,toStringконкретная реализация); - вернуть
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 Вы также можете отсканировать код, чтобы подписаться на официальный аккаунт и подписаться на более интересный контент.