DD Weekly Seven Questions - Выпуск 1
Введение в серию
Ты с нетерпением ждешь мира, надеюсь, у тебя нетbug
. Всем привет! Я Лин Дуан!
Начиная с этой недели, DAIDAI будет каждую неделю делиться со всеми семью предварительными вопросами под названием «DD Seven Questions per Week».
Основная форма серии:3道JavaScript
+ 2道HTML
+ 2道CSS
, чтобы помочь всем нам укрепить переднюю основу.
Все темы также будут интегрированы вLinDaiDai/niubility-coding-jsизissues
, каждый может предложить лучшие идеи решения проблем, спасибо 😁.
основная тема
1. В чем разница между массивом (3) и массивом (3, 4)?
console.log(Array(3))
console.log(Array(3, 4))
console.log(new Array(3))
console.log(new Array(3, 4))
console.log(Array.of(3))
console.log(Array.of(3, 4))
"Контрольные точки знаний:"
-
Array()
а такжеnew Array()
-
Array()
Разная производительность при разном количестве параметров -
Array.of()
роль
"результат:"
console.log(Array(3)) // [empty x 3]
console.log(Array(3, 4)) // [3, 4]
console.log(new Array(3)) // [empty x 3]
console.log(new Array(3, 4)) // [3, 4]
console.log(Array.of(3)) // [3]
console.log(Array.of(3, 4)) // [3, 4]
"Суммировать:"
-
Array
сделать не использоватьnew
эффект такой же -
Array
метод, если параметр является одним битом, этот параметр представляет длину массива и создает пустой массив этой длины -
Array
метод, если параметр многоразрядный, каждый параметр является элементом массива, и массив будет возвращен по порядку -
Array.of()
Принятие любого количества аргументов будет элементами в возвращаемом массиве по порядку, и будет возвращен этот новый массив.
2. Пожалуйста, создайте массив длиной 100 и значением соответствующего индекса
// cool点的写法:
[...Array(100).keys()]
// 其他方法:
Array(100).join(",").split(",").map((v, i) => i)
Array(100).fill().map((v, i) => i)
Я думаю, что последние два метода всем видны и понятны, и тут нечего сказать 😄, давайте рассмотрим это сравнение поближе.cool
записывается как:
-
использовать
Array(100)
Создайте контент, который будет всемempty
массив из:[empty x 100]
-
использовать
keys()
Метод создает итерируемый объект, содержащий ключи массива из массива:Итерируемые объекты заставляли вас думать?
generator
, Да здесьkeys()
даArray.prototype
Метод выше, вы можете сравнить его с тем, который мы использовали раньшеObject.keys()
смущенный.Давайте поговорим о его роли.Он фактически создает итерируемый объект, такой же, как только что представленный, поэтому вы должны знать, что данные, возвращаемые итерируемым объектом, будут такими:
{ value: 0, done: false }
value
Для этого возвращаемого значенияdone
Завершен ли логический блок для текущей итерации.Итак, вы увидите, что следующий код выполняется так:
let it = Array(100).keys() console.log(it.next) // {value: 0, done: false} console.log(it.next) // {value: 1, done: false} console.log(it.next) // {value: 2, done: false} console.log(it.next) // {value: 3, done: false}
-
Что касается
[...arr]
ЭтоES6
Метод записи преобразуется в массив.Конечно, вы также можете использовать его напрямуюArray.from()
. Оба метода поддерживают"повторяемый объект"Преобразовать в массив.
3. Реализовать arr[-1] = arr[arr.length - 1]
Этот вопрос означает: обеспечитьcreateArr()
метод, массив, созданный с помощью этого метода, удовлетворяетarr[-1] = arr[arr.length - 1]
:
function createArr (...elements) {
// ...代码
return arr
}
var arr1 = createArr(1, 2, 3)
console.log(arr1[-1]) // 3
console.log(arr1[-2]) // 2
"Идеи решения проблемы:"
На самом деле, первое, что приходит мне в голову, когда речь заходит об этой теме, этоObject.defineProperty()
илиProxy
.因为这里涉及到了对数组值的获取,显然用Proxy
является более подходящим. Какой? ты спрашиваешь меня, почему нетObject.defineProperty()
? Поскольку этот метод предназначен для определенного свойства объекта, он не подходит для массивов.
Итак, для этого вопроса мы могли бы использоватьProxy
Каждый раз прокси передает входящий индекс, то есть перезаписывает массивget
метод, в этом методе мы разберемся с логикой этого аспекта, давайте посмотрим код вместе😊:
function createArr (...elements) {
let handler = {
get (target, key, receiver) { // 第三个参数传不传都可以
let index = Number(key) // 或者 let index = ~~key
if (index < 0) {
index = String(target.length + index)
}
return Reflect.get(target, index, receiver)
}
}
let target = [...elements] // 创建一个新数组
return new Proxy(target, handler)
}
var arr1 = createArr(1, 2, 3)
console.log(arr1[-1]) // 3
console.log(arr1[-2]) // 2
"будь осторожен:"
-
get
Второй полученный параметрkey
Представляет индекс массива в виде строки, поэтому его необходимо преобразовать вNumber
, конечно, есть много способов использоватьNumber()
Кроме того, используйте~~
Двойной оператор не побитового отрицания также работает. в сравнении сNumber()
Преимущество в том, чтоNumber(undefined)
превратится вNaN
; но используйте~~
Гарантированно всегда будет рядом,~~undefined === 0
. (Что? Вы до сих пор не понимаете разницы? Тогда вам обязательно нужно прочитать эту статью Лин Дуана:Оператор побитового отрицания ~ и другие операторы в JS) -
Далее вам нужно только оценить, меньше ли входящий индекс 0. Если он меньше 0, добавьте длину массива.
-
затем вернуться
index
Этот элемент используетReflect.get(target, index)
. Какой? Почему бы просто не использоватьtarget[index]
? Конечно можно, сравнитеtarget[index]
Разница в том,Reflect.get(target, index)
Если входящийtarget
Не одинObject
Если (массивы также принадлежат объектам), будет сообщено об ошибке типаTypeError
,а такжеtarget[index]
вернетundefined
. Например:var obj = 5 console.log(obj['b']) // undefined console.log(Reflect.get(obj, 'b')) // Uncaught TypeError: Reflect.get called on non-object
"Точки расширения:"
Тупо здесь, я в основном хочу расширитьget
третий параметрreceiver
(получатель), вMDN
Объяснение выше:
еслиtarget
указанный объектgetter
,receiver
тогдаgetter
когда звонятthis
стоимость.
Посмотрите на пример, чтобы понять, что 😊.
Дело номер один
Например, мы начинаем с такого объекта:
var obj = {
fn: function () {
console.log('lindaidai')
}
}
используй сейчасProxy
назначитьobj1
середина:
var obj = {
fn: function () {
console.log('lindaidai')
}
}
var obj1 = new Proxy(obj, {
get (target, key, receiver) {
console.log(receiver === obj1) // true
console.log(receiver === target) // false
return target[key]
}
})
obj1.fn()
можно увидеть,receiver
Значит этоobj1
Этот новый прокси-объект,target
представляет проксируемый объектobj
.
так,receiver
может представлять"Использовать сам прокси-объект".
Случай 2
другая ситуация,receiver
также может быть выражено как"объект, унаследованный от".
var proxy = new Proxy({}, {
get (target, key, receiver) {
return receiver;
}
})
console.log(proxy.getReceiver === proxy) // true
var inherits = Object.create(proxy)
console.log(inherits.getReceiver === inherits) // true
В этом случае я создал новый прокси-объект с пустым объектом.proxy
,использоватьproxy.getReceiver
возьмиreceiver
, обнаружил, что это сам прокси-объект.
И если я использую этот прокси-объект в качестве объекта-прототипа, создайте новый объектinherits
, то есть добиться прототипного наследования, то на этот разreceiver
Значение является унаследованным объектомinherits
.
"Суммировать":
- можно использовать
Proxy
прокси, чтобы изменять значение массива каждый раз, когда он извлекается. -
Proxy
изget
, второй параметр является строкой, даже если передается индекс массива. - в сравнении с
Number()
Преимущество в том, чтоNumber(undefined)
превратится вNaN
; но используйте~~
Гарантированно всегда будет рядом,~~undefined === 0
. - В сравнении
target[index]
Разница в том,Reflect.get(target, index)
Если входящийtarget
Не одинObject
Если (массивы также принадлежат объектам), будет сообщено об ошибке типаTypeError
,а такжеtarget[index]
вернетundefined
. -
Proxy
изget
, Третий параметрreceiver
Обычно используется сам прокси-объект или объект, который от него наследуется.
В-четвертых, в чем разница между addEventListener и attachEvent?
- Первое используется в стандартных браузерах, второе
IE8
последующий -
addEventListener
Может быть бульканье, а может быть захват;attachEvent
Только бульканье, захвата нет. - Прежнее название события не носит
on
, последний сon
- в бывшей функции обратного вызова
this
указывает на текущий элемент, который указывает наwindow
5. Третий параметр функции addEventListener
Третий параметр включает всплытие и захват, иtrue
захват, даfalse
пузырится.
или объект{passive: true}
, дляSafari
Браузер, используемый при отключении/включении прокрутки.
Шесть, текстовый список выходит за пределы отображаемого многоточия.
div {
width: 200px;
overflow: hidden;
white-space: nowrap;
text-overflow: ellipsis;
}
Семь, многострочный текст выходит за пределы отображаемого многоточия.
div {
width: 200px;
display: -webkit-box;
-webkit-box-orient: vertical;
-webkit-line-clamp: 3;
overflow: hidden;
}
Этот метод подходит для браузеров WebKit и мобильных терминалов.
"Кроссбраузерное решение:"
p {
position:relative;
line-height:1.4em;
/* 3 times the line-height to show 3 lines */
height:4.2em;
overflow:hidden;
}
p::after {
content:"...";
font-weight:bold;
position:absolute;
bottom:0;
right:0;
padding:0 20px 1px 45px;
}
послесловие
Ты с нетерпением ждешь мира, надеюсь, у тебя нетbug
. Эта статья представлена здесь.
вы можете проводить каждую неделю48
Часы рабочего времени 💻 будут потрачены49
Часы сна 😴, можно и больше потратить20
Я потратил несколько минут на унылые 7 вопросов, накопившихся со временем, я верю, что мы все можем стать свидетелями роста друг друга😊.
Какой? ты спрашиваешь меня почему сериал называетсяDD
? потому что呆呆
Ага, хаха 😄.
подобно"Лин Дуан"Также парень надеется обратить внимание на паблик Лина.LinDaiDai
Или отсканируйте QR-код ниже👇👇👇.
Время от времени я буду обновлять некоторый внешний контент знаний и свои собственные оригинальные статьи🎉
Ваша поддержка - главная мотивация для меня продолжать творить 😊.
В этой статье используетсяmdniceнабор текста