Функция, которая может быть объектом в JavaScript? [Дубликат]

Чтобы изменить массив необязательных / необязательных строк

//Array of optional Strings
let array : [String?] = ["1",nil,"2","3","4"]

//Separator String
let separator = ","

//flatMap skips the nil values and then joined combines the non nil elements with the separator
let joinedString = array.flatMap{ $0 }.joined(separator: separator)


//Use Compact map in case of **Swift 4**
    let joinedString = array.compactMap{ $0 }.joined(separator: separator

print(joinedString)

Здесь flatMap, compactMap пропускает значения nil в массиве и добавляет другие значения, чтобы создать объединенную строку.

38
задан san.chez 16 March 2014 в 02:31
поделиться

4 ответа

Правильно, в javascript почти все является объектом. Но эти объекты немного отличаются от того, что мы видим на Java, C ++ или других традиционных языках. Объект в JS - это просто хэш-карта с парами ключ-значение. Ключ всегда является строкой, а значение может быть любым, включая строки, целые числа, логические значения, функции, другие объекты и т. Д. Поэтому я могу создать новый объект следующим образом:

var obj = {}; // this is not the only way to create an object in JS

и добавить новый ключ -значные пары в него:

obj['message'] = 'Hello'; // you can always attach new properties to an object externally

или

obj.message = 'Hello';

Точно так же, если я хочу добавить новую функцию к этому объекту:

obj['showMessage'] = function(){
    alert(this['message']);
}

или

obj.showMessage = function() {
    alert(this.message);
}

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

obj.showMessage();

Массивы - это просто те объекты, которые способны содержать списки значений:

var arr = [32, 33, 34, 35]; // one way of creating arrays in JS

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

alert(arr[1]); // this would show 33

Объект массива, как и любой другой объект в JS, имеет свои свойства, такие как:

alert(arr.length); // this would show 4

Для я подробно рекомендую Pro Javascript Techniques Джона Ресига .

27
ответ дан craftsman 21 August 2018 в 06:58
поделиться
  • 1
    +1 приятное описание! – Meysam 2 February 2012 в 10:20
  • 2
    Просто добавление, не относящееся к данной теме, свойство length не возвращает количество элементов в массиве. Он возвращает lastIndex + 1 для этого массива. Например, в var x = []; x[100] = 5; alert(x.length) выдается предупреждение 101. – Rohan Prabhu 2 February 2012 в 11:19
  • 3
    Нет, не все в JavaScript является объектом. Строки, числа, булевы не являются, хотя у них есть объектные копии. – Tim Down 2 February 2012 в 12:06
  • 4
    Соблазнен на downvote из-за & quot; Правильно, в javascript, все является объектом. & Quot; ... – David Winiecki 13 September 2014 в 19:43
  • 5
    "Ключ всегда представляет собой строку" - или символ (ES6). – Xufox 10 October 2016 в 08:34

Предложение «В JavaScript, ALMOST all - это объект» является правильным, потому что MAIN-коды (объекты, функции, массивы) являются объектами JavaScript. Код JavaScript использует 9 разных единиц плюс 1 (несколько): - 01. array - 02. boolean - 03. function - 04. null - 05. number - 06. object - 07. regexp - 08. string - 09. undefined - 10. multiple

НО JavaScript-объекты: - НЕ являются теми же существами, что и «объекты» на других объектно-ориентированных языках. - они представляют собой набор пар имен-значений. - у всех есть функция создания (его конструктор). - все INHERIT являются членами прототипа-объекта его конструктора, и это его прототип. - все функции являются объектами, но не все объекты являются функциями. - функции имеют область, объекты НЕ (дефект дизайна, на мой взгляд). - Объект, функция, массив, строка, ... с первым CAPITAL - это функции !!! - важнее различия в объектах и ​​функциях JS, чем его общие черты. - имя «экземпляр» в JS имеет разное значение с именем «экземпляр» в теории знаний, где экземпляр наследует атрибуты его общей концепции. В JS обозначается только его конструктор. JavaScript получил имя «экземпляр» из класса «наследование на основе класса» ool (java), где это подходящее имя, потому что эти объекты наследуют атрибуты классов.

JS-функции ARE JS-объекты, потому что: 1) они могут иметь такие элементы, как JS-объекты:

    > function f(){}
    undefined
    > f.s = "a string"
    "a string"
    > f.s
    "a string"

2) у них есть конструктор-функция, как и все JS-объекты, функция Function:

    > (function f(){}) instanceof Function
    true

3) как все JS-объекты, их прототип-объект совпадает с его конструктором прототип:

    > (function f(){}).__proto__ === Function.prototype
    true
    > ({}).__proto__ === Object.prototype
    true
    > (new Object).__proto__ === Object.prototype
    true

4), конечно, JS-функции как СПЕЦИФИЧЕСКИЕ JS-объекты имеют и дополнительные атрибуты, как и все функции в языках программирования, что JS-объекты не имеют, как вы можете звонить ( выполнить) их с информацией ввода и вывода.

ВСЕ НЕ является объектом, потому что, например, мы НЕ можем добавлять членов в литеральную строку:

    > var s = "string"
    undefined
    > s.s2 = "s2string"
    "s2string"
    > s.s2
    undefined
8
ответ дан synagonism 21 August 2018 в 06:58
поделиться
  • 1
    Что много? Я не нахожу ссылки на многопользовательский тип googling. – David Winiecki 12 September 2014 в 00:17
  • 2
    «multiple» - это единица, которая может содержать различные типы, например переменную, в которой мы храним строку, число, массив, ... – synagonism 13 September 2014 в 18:40
  • 3
    Что вы подразумеваете под «единицей»? – Will 19 August 2015 в 18:45
  • 4
    Код, как и текст, состоит из более простых объектов для более сложных. В текстах есть буквы, слова, имена, предложения, параграфы, ... Это текстовые единицы. Точно так же мы имеем кодовые единицы. – synagonism 21 August 2015 в 05:55

Нет, не все это объект в JavaScript. Многие вещи, с которыми вы регулярно взаимодействуете (строки, числа, булевы), являются примитивами, а не объектами. В отличие от объектов, примитивные значения неизменяемы. Ситуация осложняется тем, что эти примитивы имеют обертки объектов (String, Number и Boolean); эти объекты имеют методы и свойства, а примитивы - нет, но у примитивов, как представляется, есть методы, потому что JavaScript молча создает объект-оболочку, когда код пытается получить доступ к любому свойству примитива.

Например, рассмотрим следующее Код:

var s = "foo";
var sub = s.substring(1, 2); // sub is now the string "o"

За кулисами s.substring(1, 2) ведет себя так, как если он выполняет следующие (приблизительные) шаги:

  1. Создает обертку String объект из s, эквивалентный использованию new String(s)
  2. Вызвать метод substring() с соответствующими параметрами объекта String, возвращенного на шаг 1
  3. Утилизировать String object
  4. Вернуть строку (примитив) из шага 2.

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

var s = "foo";
s.bar = "cheese";
alert(s.bar); // undefined

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

Номера и булевы также ведут себя таким образом. Функции, однако, являются полностью реализованными объектами и наследуются от Object (фактически Object.prototype, но это еще одна тема). Таким образом, функции могут выполнять любые объекты, включая наличие свойств:

function foo() {}
foo.bar = "tea";
alert(foo.bar); // tea
130
ответ дан Tim Down 21 August 2018 в 06:58
поделиться
  • 1
    Этот ответ должен быть сверху: пока выбранный ответ достаточно хорош для практических целей, этот способ более тщательный (и интересный!) Спасибо! – theabraham 31 August 2012 в 00:34
  • 2
    Это правильный ответ. Не все - объект. Почти все является объектом. Посмотрите developer.mozilla.org/en-US/docs/JavaScript/… для типов в javascript. – Srinivas 9 March 2013 в 16:49
  • 3
    Хороший ответ. Интересно, однако, если вы используете var s = new String('foo');, тогда s.bar сохранит значение cheese. – user75525 15 March 2014 в 21:58
  • 4
    @SteveFenton: Да, потому что new String('foo') создает объект String, который ведет себя как любой другой объект, потому что он наследует от Object.prototype. – Tim Down 16 March 2014 в 12:04
  • 5
    Отличное объяснение! Практически все является объектом, кроме примитивных типов. – Fillip Peyton 10 March 2015 в 18:06

Не все - объект в javaScript. JavaScript имеет примитивы и объекты. Существует шесть примитивов: null, undefined, string, number, boolean и symbol. Может показаться, что все действует как объект из-за свойств и функций, к которым можно получить доступ. Например,

var stringvar="this string";
typeof stringvar; // "string"
stringvar.length; //11

теперь, поскольку «stringvar» является строковым типом, который является примитивным типом, он не должен иметь доступ к длине свойства. Это может быть сделано из-за чего-то, называемого Boxing.Boxing - это процесс, в котором любой примитивный тип преобразуется в тип объекта, а обратный называется Unboxing. Эти типы объектов или обертки объектов создаются с помощью представление о том, что существуют некоторые общие операции, которые могут потребоваться для выполнения с примитивными значениями. Они содержат полезные методы и свойства и являются прототипами, связанными с примитивами. Что касается объектов, пары ключевых значений могут быть добавлены к каждому объекту, даже к массивам.

var arr=[1,2,3];
arr.name="my array";
arr;  //[1,2,3,name:'my array']

это не означает, что четвертый элемент массива - это «имя:» мой array '"." name "- это свойство, которое может быть вызвано с помощью точечной нотации (arr.name) или в виде скобок (arr [" name "]).

4
ответ дан viery365 21 August 2018 в 06:58
поделиться
Другие вопросы по тегам:

Похожие вопросы: