11+ функций JavaScript, которые вы, вероятно, никогда не используете

JavaScript

⚠Важно

Большинство функций, описанных в этом посте, больше не поддерживаются (или даже устарели). Они до сих пор встречаются во многих книгах, так что об этом стоит узнать.

Оператор запятой

,это оператор, используемый для разделения выражений и возврата последнего выражения в цепочке.

let oo = (1, 2, 3)
console.log(oo) // 3

Здесь три основных выражения1,2а также3.所有这些表达式均被求值,最后一个赋给 oo。

Мы видим это в цикле for:

for(let i = 0, ii = 1; i< 10; i++, ii--) { ... }

Это удобно, когда мы хотим написать короткие лямбда-функции:

const lb = (a, b, arr) => (arr.push(a*b), a*b)

Здесь есть два оператора: первый помещает результат умножения в массив arr, а второй помещает в массив множители a и b. Второй результат — это то, что возвращается вызывающей стороне.

Это также полезно для тернарных операторов, потому что, как и короткий лямбда-синтаксис, он принимает только выражения, а не операторы.

2. в

in — это ключевое слово, используемое для проверки существования свойства в объекте. мы вfor..inЦиклом пользуюсь, но не осознаю, что на самом делеinТоже ключевое слово :)

Если свойство существует в объекте, тоinвернусьtrue, иначе вернетсяfalse.

const o = {
    prop: 1
}
console.log("prop" in o) // true

Смотреть,inможно использовать самостоятельно, а не вfor..inсередина.

это проверит"prop"Можно ли использовать какoИспользуются свойства объекта. он возвращаетсяtrue, потому что мы вoопределено в"prop"Атрибуты.

Если мы проверим на неопределенные свойства:

const o = {
    prop: 1
}
console.log("prop1" in o) // false

он возвращаетсяfalse,потому что"prop1"существуетoне определяется в .

3. Конструктор массива

Знаете ли вы, что мы можем определять массивы без использования традиционных методов?

const arr = [1, 2, 3]

как насчет этого?

Мы также можем использоватьArray:

const arr = new Array(1, 2, 3)

Перейти кArrayРасположение аргументов конструктора будет основой его индекса.

1— первый параметр и его индекс равен 0;2второй параметр и его индекс равен 1;3является третьим параметром, и его индекс равен 2.

arr[0] // 1
arr[1] // 2
arr[2] // 3

так,

const arr = new Array(1, 2, 3)

а также

const arr = [1, 2, 3]

выражает смысл.

но использоватьnew Array()Есть такой вопрос:

var a = new Array(10, 20);
a[0] // 返回 10
a.length // 返回 2

но:

var a = new Array(10);
a[0] // 返回 undefined
a.length // 返回 10

когда вы только даетеArrayЭто происходит только в том случае, если конструктор является целым числом (целое число больше или равно 0, иначе будет сообщено об ошибке). Почему это грохот?

Фактически, новыйArrayКонструкторы берут идеи из некоторых языков программирования, где нужно указать память для массива, чтобы он не отображалсяArrayIndexOutOfBoundsаномальный.

int *a = (int *) malloc( 10*sizeof(int) ); // ya ol' c
int *a = new int[10]; // c++
int[] a = new int[10]; // java

Да, это фактически создает длину10массив . мы вJavascriptНет вsizeofфункция, ноtoStringдостаточно, чтобы доказать это.

a.toString() // 返回 ",,,,,,,,," 它相当于 [,,,,,,,,,]
a // [empty × 10]

Итак, при передаче параметра вnew Array, приведет к тому, что механизм JS выделит место для переданного массива размера параметра.

И это тоже есть в спецификации EcmaScript:

Видите, это не противоречит. Все описания есть в характеристиках. Мы всегда должны читать спецификацию любого языка, прежде чем делать какие-либо выводы.

4. Конструктор функций

Знаете ли вы, что мы можем использоватьFunctionОпределение конструктораFunction.

Разве ты не понимаешь? Позвольте мне быть более ясным. В JavaScript мы определяем следующую функцию:

const mul = (a, b) => a * b

// 或
function mul(a, b) {
    return a * b
}

// 或
const mul = function(a, b) {
    return a * b
}

Мы также можем сделать это для достижения той же функциональности:

const mul = new Function("a", "b", "return a * b")

Перейти кFunctionАргументы формируют аргументы и тело функции. Переменнаяmulстановится именем функции.

Кроме того, последний параметр будет телом функции, а параметры до последнего параметра станут параметрами функции.

вmulсередина."a"а также"b"параметр, который функция получит,"return a * b"является телом функции. он достигает"a"а также"b"Умножить и вернуть результат.

Мы используемmul(…)Вызовите функцию, передав параметры:

const mul = new Function("a", "b", "return a * b")

console.log(mul(7, 8)) // 56

Согласно МДН:

Конструктор функцийсоздать новыйFunction объект. Вызов этого конструктора напрямую может создавать функции динамически, но приведет к возникновению ошибок изevalпроблемы с безопасностью и относительно незначительные проблемы с производительностью. Однако, в отличие от eval, конструкторы функций работают только в глобальной области видимости.

5. Деструктуризация массива

Мы можем разложить элементы в массиве, используя порядковый номер элемента.

const arr = [1, 2, 3]

элемент1,2,3Индексы равны 0, 1, 2 соответственно:

arr[0] // 1

В ежедневном развитии мы чаще всего используем деструктурирование объекта:

let o = {
    prop: 1
}
o["prop"] // 1

// 解构
const {prop} = o
prop // 1

Итак, мы используем деструктурирование массивов:

const arr = [1, 2, 3]
const { 0: firstA, 1: secA, 2: thirdA  } = arr

firstA // 1
secA // 2
thirdA // 3

Таким образом, мы можем использовать номер индекса для извлечения элемента. Индекс — это свойство, определяющее позицию элемента в массиве.

const arr = [1, 2, 3]

эквивалентно:

const arr = {
    0: 1,
    1: 2,
    2: 3,
    length: 3
}

Массивы также являются объектами, поэтому они уничтожаются объектами, но существует также специальный синтаксис уничтожения массивов:

const [first, second, third] = arr

first // 1
second // 2
third // 3

Примечание. Следует по возможности избегать знания конкретных позиций в массиве (что такое начальный и конечный индексы).

6. Используйте свойство length, чтобы уменьшить содержимое массива

в массивеlengthСвойство представляет количество элементов в массиве.

const arr = [1, 2, 3]
arr.length // 3

уменьшатьlengthстоимость имущества, сделаетJSДвижок уменьшает количество элементов массива доlengthЗначения свойств равны.

const arr = [1, 2, 3]
arr.length // 3
arr.length = 1
arr // [1]

arrизlengthИзменить значение свойства1,следовательноarrУменьшите количество элементов так, чтобы оно было равноlengthстоимость имущества.

если увеличитьlengthсобственность, тоJSДвижок будет добавлять элементы (неопределенные элементы), чтобы довести количество элементов в массиве доlengthСтоимость имущества.

const arr = [1, 2, 3]
arr.length // 3
arr.length = 1
arr // [1]

arr.length = 5
arr // [1, empty × 4]

arrВ , есть только один элемент, и тогда мы увеличиваем длину до 5, поэтому мы увеличиваем длину еще на 4 элемента, доводя количество элементов до 5.

7. Аргументы

мы можем использоватьargumentsОбъекты получают параметры, передаваемые функциям без их явного определения в функции.argumentsПеременная:

function myFunc() {
    console.log(arguments[0]) // 34
    console.log(arguments[1]) // 89
}

myFunc(34,89)

argumentsОбъекты индексируются по массиву. То есть свойства — это числа, поэтому к ним можно получить доступ по ссылке на ключ.

argumentsобъект изArgumentsСоздан экземпляр класса, у этого класса есть несколько интересных свойств.

arguments.callee.nameОтносится к имени функции, которая вызывается в данный момент.

function myFunc() {
    console.log(arguments.callee.name) // myFunc
}

myFunc(34, 89)

arguments.callee.caller.nameОтносится к имени функции, которая вызывает текущую выполняемую функцию.

function myFunc() {
    console.log(arguments.callee.name) // myFunc
    console.log(arguments.callee.caller.name) // myFuncCallee
}

(function myFuncCallee() {
    myFunc(34, 89)
})()

Это особенно полезно в функциях с переменным числом переменных.

8. Пропустить ()

Знаете ли вы, что квадратные скобки можно пропускать при создании экземпляров объектов?()?

Например:

class D {
    logger() {
        console.log("D")
    }
}

// 一般情况下,我们这么做:
(new D()).logger(); // D

// 其实,我们可以跳过 ():
(new D).logger(); // D
// 并且它可以正常运行

Скобки необязательны даже во встроенных классах:

(new Date).getDay();
(new Date).getMonth();
(new Date).getYear();

Девять, пустота

voidэто ключевое слово в JS, которое оценивает оператор и возвращает значение undefined.

Например:

class D {
   logger() {
        return 89
    }
}

const d = new D

console.log(void d.logger()) // undefined

loggerметод должен возвращать89,ноvoidключевое слово сделает его недействительным и вернетundefined.

я прочиталundefinedранее ему могло быть присвоено другое значение, что исказило бы его семантику. Поэтому используйтеvoidоператор гарантирует, что вы получите реальнуюundefined. Также используется в целях минимизации.

10. Пас__proto__наследовать

_proto_ОтJavaScriptМетоды, в которых объекты наследуют свойства.__proto__даObject.prototypeсвойство доступа, которое предоставляет доступ к объекту[[Prototype]].

это__proto__положи это[[Prototype]]Все свойство объекта, установленного в качестве целевого объекта.

Давайте посмотрим пример:

const l = console.log
const obj = {
    method: function() {
        l("method in obj")
    }
}
const obj2 = {}
obj2.__proto__ = obj
obj2.method() // method in obj

У нас есть две объектные константы:objа такжеobj2.objимеютmethodАтрибуты.obj2является константой пустого объекта, т. е. не имеет свойств.

мы посетилиobj2из__proto__и установите его наobj. это пройдетObject.prototypeможно посетитьobjСкопируйте все свойства вobj2. Вот почему мы можемobj2Причина вызова метода без получения ошибки без определения.

obj2наследоватьobjсвойства, поэтомуmethodАтрибут метода будет доступен в его свойствах.

Прототипы могут использоваться для таких объектов, как константы объекта, объекты, массивы, функции, даты, RegEx, числа, логические значения, строки.

Одиннадцать, унарный оператор +

Один юань+Оператор преобразует свой операнд в числовой тип.

+"23" // 23
+{} // NaN
+null // 0
+undefined // NaN
+{ valueOf: () => 67 } // 67
+"nnamdi45" // NaN

Когда мы хотим быстро преобразовать переменную вNumber, это очень удобно.

12. Унарные операторы -

унарный оператор-преобразовать его операнд вNumberтип, затем инвертируется.

Этот оператор будет унарным+Результат оператора инвертируется. Во-первых, он преобразует операнд в егоNumberзначение, а затем инвертировать значение.

-"23" // -23

Здесь бывает, что строка"23"будет преобразован в числовой тип, в результате чего23. Затем это положительное число преобразуется в отрицательную форму.-23.

-{} // NaN
-null // -0
-undefined // NaN
-{ valueOf: () => 67 } // -67
-"nnamdi45" // NaN

Если результат преобразования в числоNaN, отрицание не применяется.

Отрицательный+0производить-0, возьми минус-0производить+0.

- +0 // -0
- -0 // 0

13. Экспоненциальный оператор **

Этот оператор используется для указания степени числа.

В математике 2^3^ означает умножение 2 три раза:

2 * 2 * 2

мы можем использовать**Операторы делают то же самое в JS:

2 ** 3 // 8
9 ** 3 // 729

Суммировать

Эта статья переведена с11+ Особенности JavaScript Вы, вероятно, никогда не использовали

Я хочу увидеть серию статей в прошлом,Нажмите, чтобы перейти на домашнюю страницу блога github.

идти последним

  1. ❤️ Получайте удовольствие, продолжайте учиться и всегда продолжайте программировать. 👨💻

  2. Если у вас есть какие-либо вопросы или уникальные идеи, пожалуйста, прокомментируйте или свяжитесь с бутылкой напрямую (общедоступный номер может ответить на 123)! 👀👇

  3. 👇Приглашаем обратить внимание: джентльмен с бутылкой переднего плана, обновляется ежедневно! 👇