⚠Важно
Большинство функций, описанных в этом посте, больше не поддерживаются (или даже устарели). Они до сих пор встречаются во многих книгах, так что об этом стоит узнать.
Оператор запятой
,
это оператор, используемый для разделения выражений и возврата последнего выражения в цепочке.
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.
идти последним
-
❤️ Получайте удовольствие, продолжайте учиться и всегда продолжайте программировать. 👨💻
-
Если у вас есть какие-либо вопросы или уникальные идеи, пожалуйста, прокомментируйте или свяжитесь с бутылкой напрямую (общедоступный номер может ответить на 123)! 👀👇
-
👇Приглашаем обратить внимание: джентльмен с бутылкой переднего плана, обновляется ежедневно! 👇