2016-12-22 5 views
1

Я создал объект в JavaScript и по какой-то причине не сохраняет 17-й и 20-й предметы в объекте.Элементы JavaScript, отсутствующие в объекте Я только что создал

Вы можете видеть, что я имею в виду под нижеследующим кодом, 17-й & 20-й элемент не записывается на консоль после того, как я их добавил.

Почему это, я должен упустить что-то очевидное. Я создаю объект, так как значения, которые я в него вставляю, будут использоваться в качестве констант, доступных во всем приложении AngularJS.

var foo = { 
 
    001: { id: 001, name: "foo bar"}, 
 
    002: { id: 002, name: "foo bar"}, 
 
    003: { id: 003, name: "foo bar"}, 
 
    004: { id: 004, name: "foo bar"}, 
 
    005: { id: 005, name: "foo bar"}, 
 
    006: { id: 006, name: "foo bar"}, 
 
    007: { id: 007, name: "foo bar"}, 
 
    008: { id: 008, name: "foo bar"}, 
 
    009: { id: 009, name: "foo bar"}, 
 
    010: { id: 010, name: "foo bar"}, 
 
    011: { id: 011, name: "foo bar"}, 
 
    012: { id: 012, name: "foo bar"}, 
 
    013: { id: 013, name: "foo bar"}, 
 
    014: { id: 014, name: "foo bar"}, 
 
    015: { id: 015, name: "foo bar"}, 
 
    016: { id: 016, name: "foo bar"}, 
 
    017: { id: 017, name: "foo bar"}, 
 
    018: { id: 018, name: "foo bar"}, 
 
    019: { id: 019, name: "foo bar"}, 
 
    020: { id: 020, name: "foo bar"} 
 
    } 
 
    console.log(foo);

ответ

4

Это потому, что не является допустимым форматом для десятичных чисел. Что происходит, вы пишете octal numbers. По существу, они находятся в базе 8 вместо 10.

Если вы хотите их в базе 10, удалите ведущие нули.

var foo = { 
 
    1: { id: 1, name: "foo bar"}, 
 
    2: { id: 2, name: "foo bar"}, 
 
    3: { id: 3, name: "foo bar"}, 
 
    4: { id: 4, name: "foo bar"}, 
 
    5: { id: 5, name: "foo bar"}, 
 
    6: { id: 6, name: "foo bar"}, 
 
    7: { id: 7, name: "foo bar"}, 
 
    8: { id: 8, name: "foo bar"}, 
 
    9: { id: 9, name: "foo bar"}, 
 
    10: { id: 10, name: "foo bar"}, 
 
    11: { id: 11, name: "foo bar"}, 
 
    12: { id: 12, name: "foo bar"}, 
 
    13: { id: 13, name: "foo bar"}, 
 
    14: { id: 14, name: "foo bar"}, 
 
    15: { id: 15, name: "foo bar"}, 
 
    16: { id: 16, name: "foo bar"}, 
 
    17: { id: 17, name: "foo bar"}, 
 
    18: { id: 18, name: "foo bar"}, 
 
    19: { id: 19, name: "foo bar"}, 
 
    20: { id: 20, name: "foo bar"} 
 
    } 
 
    console.log(foo);

Если вы хотите ведущих нулей, вам нужно использовать строки.

var foo = { 
 
    "001": { id: "001", name: "foo bar"}, 
 
    "002": { id: "002", name: "foo bar"}, 
 
    "003": { id: "003", name: "foo bar"}, 
 
    "004": { id: "004", name: "foo bar"}, 
 
    "005": { id: "005", name: "foo bar"}, 
 
    "006": { id: "006", name: "foo bar"}, 
 
    "007": { id: "007", name: "foo bar"}, 
 
    "008": { id: "008", name: "foo bar"}, 
 
    "009": { id: "009", name: "foo bar"}, 
 
    "010": { id: "010", name: "foo bar"}, 
 
    "011": { id: "011", name: "foo bar"}, 
 
    "012": { id: "012", name: "foo bar"}, 
 
    "013": { id: "013", name: "foo bar"}, 
 
    "014": { id: "014", name: "foo bar"}, 
 
    "015": { id: "015", name: "foo bar"}, 
 
    "016": { id: "016", name: "foo bar"}, 
 
    "017": { id: "017", name: "foo bar"}, 
 
    "018": { id: "018", name: "foo bar"}, 
 
    "019": { id: "019", name: "foo bar"}, 
 
    "020": { id: "020", name: "foo bar"} 
 
    } 
 
    console.log(foo);

5

Проблема состоит в том, что число литералы в JavaScript, которые начинаются с 0 рассматриваются как восьмеричные (т.е. базовых 8). Итак, 020 === 16. Если число начинается с 0, но содержит цифры 9 или 8 (т. Е. Это недействительное восьмеричное число), оно рассматривается как нормальное десятичное число.

Поэтому, когда вы делаете 017 и 020, обрабатывается как 15 и 16, так что свойство записывается дважды.

Если вы хотите использовать цифровые клавиши, вам нужно сделать их все на одной базе, поэтому потеряйте ведущий 0. Если вы хотите буквально 020, то вам нужно сделать ключи и значения строк:

"001": { id: "001", name: "foo bar"} 
+1

Не было ли чего-то примерно в восьмеричных, которые менялись в строгом режиме или в ES6? IIRC было что-то, но я не мог его найти. Я могу ошибаться. –

+2

@FelixKling Да, есть новый формат для восьмеричных ('0o020') и новый двоичный формат (' 0b0110'). См. [MDN] (https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Lexical_grammar#Numeric_literals). – lonesomeday

1

Я думаю, что это что-то делать с числами, начиная с 0 интерпретируются как восьмеричные в JavaScript. Итак, 017 = 15, и вы просто перезаписали запись 15.

Если вы поместили свои ключевые имена в явные строки, это сработает. То же самое для внутреннего ключа «id» каждой записи. Вот почему я не использую ключи объектов, которые начинаются с числа, и используйте массив, если каждый ключ является только индексом.

var foo = { 
    '001': { id: '001', name: "foo bar"}, 
    '002': { id: '002', name: "foo bar"}, 
    '003': { id: '003', name: "foo bar"}, 
    '004': { id: '004', name: "foo bar"}, 
    '005': { id: '005', name: "foo bar"}, 
    '006': { id: '006', name: "foo bar"}, 
    '007': { id: '007', name: "foo bar"}, 
    '008': { id: '008', name: "foo bar"}, 
    '009': { id: '009', name: "foo bar"}, 
    '010': { id: '010', name: "foo bar"}, 
    '011': { id: '011', name: "foo bar"}, 
    '012': { id: '012', name: "foo bar"}, 
    '013': { id: '013', name: "foo bar"}, 
    '014': { id: '014', name: "foo bar"}, 
    '015': { id: '015', name: "foo bar"}, 
    '016': { id: '016', name: "foo bar"}, 
    '017': { id: '017', name: "foo bar"}, 
    '018': { id: '018', name: "foo bar"}, 
    '019': { id: '019', name: "foo bar"}, 
    '020': { id: '020', name: "foo bar"} 
    } 
    console.log(JSON.stringify(foo)); 
1

Поскольку префикс числа с 0 указывает компилятору (т.е.браузер), что число восьмеричное и 017 = 15

, так что все ваши показатели и при условии восьмеричное-к-десятичного преобразования, а преобразованное в строку (обратите внимание, что «» в журнале), а некоторые будут переопределять

другие цифры (например, 019) недействительны восьмеричные значения, поэтому их значение хранится в десятичной форме. Думаю