Как отличаться между объектом и договоренностью в языке сценариев JavaScript?

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

Чем было бы рекомендуемое, чтобы отличать между договоренностью и объектом?

Говоря об объекте, который не был бы продуктом функции instanciada.

if (isObject(valor)) {
    /* Código */
} else {
    /* Código */
}
25
задан 31.08.2016, 16:15
7 ответов

В языке сценариев JavaScript (ECMAScript 5) не только есть объекты и arrays, есть в общем количестве 5 примитивных типов:

string, number, undefined, boolean, object

Состоит в том, чтобы использовать общепринятую форму оператор typeof который возвратит цепь, которая соответствует, а именно:

typeof 'hola' === 'string'
typeof true === 'boolean'
typeof 123 === 'number'
typeof undefined === 'undefined'
typeof {} === 'object'
typeof [] === 'object'

Как? Да, arrays - регулярные объекты (где typeof [] === "object") но у которого есть связь между key (нотация: valor[key]) и свойство length. Кроме того они получают в наследство Array.prototype.

Хорошая форма (вынесенная всеми настоящими браузерами) подтверждения, - array ли объект: Array.isArray(valor)

Следовательно, ты не можешь отличаться просто между array и я возражаю, так как существует возможность того, чтобы это не была ни вещь ни другая.

Ты мог бы делать следующее:

if (Array.isArray(valor)) {
  // es un array
} else if (typeof valor === 'object') {
  // es un objeto regular que no es un array
} else {
  // puede ser undefined, string, number o boolean.
}

Но забота!, есть исключение, typeof null === 'object' так что ты также был бы должен санкционировать, если стоимость недействительная или нет, потому что переменная со стоимостью null он дал бы такой фальшивый позитив как объект. Это вирус ECMAScript 5, версия 6 это исправляет и возвращается 'null'.

Я хочу довести до сведения, что переменная могла бы содержать функцию, в случае которой он был бы typeof function(){} === 'function'

Больше info в MDN, к сожалению на английском.

29
ответ дан 01.12.2019, 08:17
  • 1
    Есть форма лучшая, которая предотвращает проблему null, ты можешь проверять мой ответ и включать ее в твою, если ты желаешь – Carlos Muñoz 05.12.2015, 07:23
  • 2
    У ES5 есть 5 примитивных типов: Undefined, Null, Boolean, Number и String. ES6 в и # 241; ade Symbol, примитивный tambi и # 233; n. Другой тип - Object, который не является примитивным. В ES6 typeof null продолжи возвращать "object". – Oriol 17.12.2015, 01:17
  • 3
    @Oriol верное, escrib и # 237; памяти. когда у меня будет немного времени, я буду издавать post и включать informaci и # 243; n обновленная. спасибо за упоминать об этом – rnrneverdies 17.12.2015, 01:33

ВїCГіmo отличаться между объектом и договоренностью?

if( Object.prototype.toString.call( valor ) === '[object Array]' ) {
     alert( 'Arreglo!' );
} else if ( Object.prototype.toString.call( valor ) === '[object Object]' ) {
     alert( 'Objeto!' );
}
6
ответ дан 01.12.2019, 08:17
  • 1
    Не беспокойся, в самом деле я изменил мой ответ, вижу, что тот, что я спрашиваю, реализовал то же самое. Правильный вопрос - и #191; C и # 243; mo отличаться между объектом и договоренностью?. Привет. – Jorgesys♦ 05.12.2015, 07:53
  • 2
    Надеяться на representaci и # 243; n объекта, который дает toString, это очень плохая идея. Ничто не гарантирует тебя, что это функционировало во всех средах, или что оно будет продолжать функционировать в будущих версиях языка. – Darkhogg 07.12.2015, 15:40
  • 3
    @Darkhogg В других языках возможно, в javascript не. Что функционировал равно во всех средах, я это гарантируют Especificaci и # 243; n ECMAScript в secci и # 243; n 15.2.4.2 внутреннее свойство [[Class]] может быть проверенным в secc и # 243; n 8.6.2 и действительно совсем не он гарантирует меня, что оно продолжило функционировать в будущих версиях языка, зависит от того, что он решает comit и # 233; est и # 225; ndares как в любом другом языке, если он состоит в том, что они желают, поддержания совместимости к atr и # 225; в. – Carlos Muñoz 07.12.2015, 17:34

Ты можешь использовать Object.prototype.toString.call(valor), чтобы знать тип объекта valor

switch(Object.prototype.toString.call(valor)) {
    case '[object Array]':
        // Es un arreglo
        break;
    case '[object Object]':
        // Es un object
        break;
    default:
        // Es cualquier otro tipo incluyendo "Null", "Undefined",   
        // "Arguments", "Boolean", "Date", "Error", "Function", "JSON", "Math",
        // "Number", "RegExp" y "String"
}

Заметь : Цепь [object class ] , где class может быть Undefined , Null или класс объекта гарантированы из-за especificaciГіn ECMAScript 5.1, secciГіn 15.2.4.2. Возможная стоимость для class может консультироваться в secciГіn 8.6.2

12
ответ дан 01.12.2019, 08:17
  • 1
    Надеяться на representaci и # 243; n объекта, который дает toString, это очень плохая идея. Ничто не гарантирует тебя, что это функционировало во всех средах, или что оно будет продолжать функционировать в будущих версиях языка. – Darkhogg 07.12.2015, 15:40
  • 2
    @Darkhogg В других языках возможно, в javascript не. Что функционировал равно во всех средах, я это гарантируют Especificaci и # 243; n ECMAScript в secci и # 243; n 15.2.4.2 внутреннее свойство [[Class]] может быть проверенным в secc и # 243; n 8.6.2 и действительно совсем не он гарантирует меня, что оно продолжило функционировать в будущих версиях языка, зависит от того, что он решает comit и # 233; est и # 225; ndares как в любом другом языке, если он состоит в том, что они желают, поддержания совместимости к atr и # 225; в. – Carlos Muñoz 07.12.2015, 17:23
  • 3
    @CarlosMu и # 241; oz Проблема приходит, когда ты начинаешь работать с инстанциями классов, определенными пользователем, в случае которого каждый может определять стоимость, которую каждый хочет. Кроме того, что sobreescribamos вышеупомянутая стоимость, этот тип классов они неразличимые нормальных объектов, которым мы можем начинать иметь проблемы немедленно... – Darkhogg 07.12.2015, 17:40
  • 4
    especificaci и # 243; n не определяет никакой оператор или способ изменять свойство помещает [[Class]], пожалуйста проверяет хорошо secci и # 243; n 8.6.2 Классы, определенные пользователем возвращать и # 225; n всегда [object Object] – Carlos Muñoz 07.12.2015, 17:52
  • 5
    N и # 243; tese Object.prototype.toString может быть использованным, чтобы знать " clase" стоимости, не Вашего типа. ES5 определяет класс объекта как стоимость внутреннего свойства [[Class]]. Эта концепция исчезает в ES6, но Object.prototype.toString contin и # 250; в функционируя равно. – Oriol 17.12.2015, 01:23

Лучшая форма, чтобы санкционировать, что объект - типа JSON или Array, я рекомендую следующее, принимая во внимание, что:

var a = [],
    j = {};

Решение 1

toString.call(o) === '[object Object]'; // true
toString.call(a) === '[object Array]'; // true

Решение 2

a.constructor.name === 'Array'; // true
o.constructor.name === 'Object'; // true

Но строго говоря, договоренность - часть синтаксиса JSON. Выражение это два следующих примера - действительная часть вышеупомянутой структуры.

Пример 1:

console.log(response); // {"message": "success"}
console.log(response); // {"user": "bart", "id":3}

Пример 2:

console.log(response); // [{"user":"chofoteddy"}, {"user":"bart"}]
console.log(response); // ["chofoteddy", "bart"]

В случае когда оно считало бы с переменной типа текст (String), который хотел бы санкционировать Вашу структуру, чтобы знать, совпадает ли он с каким-либо из обоих упомянутых типов, рекомендуемое состояло бы в том, чтобы использовать следующую функцию:

function isJSON (valor) {
    if (typeof valor !== 'string')
        valor = JSON.stringify(valor);

    try {
        JSON.parse(valor);
        return true;
    } catch (e) {
        return false;
    }
}
4
ответ дан 01.12.2019, 08:17
  • 1
    isJSON(null), isJSON(1) и isJSON(true) возвращают true, что не остается в definici и # 243; n " он считает структурой договоренность или objeto" – Carlangueitor 05.12.2015, 02:10
  • 2
    Не только это не ни договоренности ни объекты но даже это JSON v и # 225; lido – Carlos Muñoz 05.12.2015, 02:30

Простой метод состоял бы в том, чтобы применять функцию JSON.stringify() в переменную и подтверждать, каков первый символ вытекающей цепи:

  • Если это крючок ([), переменная была array.
  • Если это ключ ({), переменная была объектом.
  • В любом другом случае, переменная была чем-то различным.

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

function arrayuobjeto(variable) {
  var aux = JSON.stringify(variable); 
  switch(aux[0]) {
    case "[": return "array";  break;
    case "{": return "objeto"; break;
    default:  return "otro";   break;
  }
}

Здесь я оставляю серию примеров:

function arrayuobjeto(variable) {
  //Si JSON.stringify lanza una excepción, entonces no era ni array ni objeto
  try {
    var aux = JSON.stringify(variable);
    switch(aux[0]) {
      case "[": return "array";  break;
      case "{": return "objeto"; break;
      default:  return "otro";   break;
    }
  } catch(ex) {
    return "otro";
  }
}
var ejemplos=[
  //Arrays
  [1,2] ,
  [] ,

  //Objetos
  {valor: 1} ,
  {} ,
  
  //Otros
  "[1,2]" ,
  "{ valor: 1}" ,
  "" ,
  " " ,
  1 ,
  0 ,
  true ,
  false ,
  null ,
  function(){} ,
  undefined
]
for(var i in ejemplos)
{
  console.log(
    arrayuobjeto(ejemplos[i]),
    typeof ejemplos[i]!="function"?
      JSON.stringify(ejemplos[i])
    :ejemplos[i]+""
  )
}
5
ответ дан 01.12.2019, 08:17
  • 1
    Она хорошая solució n, но есть случаи, в которые он бросает ошибку, пример, для window или this дай SecurityError: Permission denied to access property "toJSON" on cross-origin object, и для (()=>(a={},a.a=a,a))() отпусти TypeError: cyclic object value. – ArtEze 02.05.2019, 17:45

Давно у меня была сходная проблема, и я encontrГ© со следующей soluciГіn, где type распределяет ему array или object завися, что тип было тебя json, в этом примере это объект.

var myJson = {"name":"juan"};

var type = Object.prototype.toString.call(myJson).match(/\s([a-z|A-Z]+)/)[1].toLowerCase();

if (type == "array") {                 

} else if (type == "object") {

}

надеялся, что оно ты функционирует.

1
ответ дан 01.12.2019, 08:17

Ты мог бы использовать, чтобы обнаруживать json один

try{
    JSON.parse(valor);
    tipo = "JSON";
 }catch (Exception e){
    tipo =  typeof(valor) 
    //retornara undefined, number, boolean, string, object,null,function

  }

Ты можешь видеть больше info typeof здесь

2
ответ дан 01.12.2019, 08:17
  • 1
    typeof это не funci и # 243; n – Carlangueitor 05.12.2015, 02:17
  • 2
    но ты можешь призывать ее так... можешь выравнивать ее в переменную, чтобы читать после... – jpganz18 05.12.2015, 02:19

Теги

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