Что делает предыдущий `+` при определении переменных SVG в D3? [Дубликат]

Использование zip может быть еще более быстрым:

dataframe["period"] = ([''.join(i) for i in 
                        zip(dataframe["Year"].map(str),dataframe["quarter"])])

В наборе данных ниже zip() был наиболее удачным из всех: https://stackoverflow.com/a/50316945/ 7386332

import pandas as pd

data = '''\
ID,Host,Protocol,Port
1,10.0.0.10,tcp,445
1,10.0.0.10,tcp,445
1,10.0.0.10,tcp,445
1,10.0.0.10,tcp,445
1,10.0.0.10,tcp,445
1,10.0.0.10,tcp,445
1,10.0.0.10,tcp,445
1,10.0.0.10,tcp,49707
1,10.0.0.10,tcp,49672
1,10.0.0.10,tcp,49670'''

df = pd.read_csv(pd.compat.StringIO(data)) # Recreates a sample dataframe

df = pd.concat([df]*10000)

%timeit df['Host'] + "/" + df['Protocol'] + "/" + df['Port'].map(str)
%timeit ['/'.join(i) for i in zip(df['Host'],df['Protocol'],df['Port'].map(str))]
%timeit ['/'.join(i) for i in df[['Host','Protocol','Port']].astype(str).values]

10 loops, best of 3: 39.7 ms per loop  
10 loops, best of 3: 35.9 ms per loop  
10 loops, best of 3: 162 ms per loop

11
задан JoeM05 14 February 2013 в 18:34
поделиться

4 ответа

Унарный оператор + может использоваться для преобразования значения в число в JavaScript. Подчеркивание, по-видимому, проверяет, что свойство .length является числом, иначе оно не будет равно самому преобразованному в номер.

7
ответ дан Jeremy 1 September 2018 в 07:06
поделиться

Хороший хак, чтобы проверить, имеет ли obj.length тип number или нет. Вы видите, что оператор + может использоваться для принудительного принуждения строк. Например:

alert(+ "3" + 7); // alerts 10

Это возможно, потому что оператор + принуждает строку "3" к числу 3. Следовательно, результатом является 10, а не "37".

Кроме того, JavaScript имеет два типа операторов равенства и неравенства:

  1. Строгое равенство и неравенство (например, 3 === "3" выражает false).
  2. Нормальное равенство и неравенство (например, 3 == "3" выражает истину).

Строгое равенство и неравенство не заставляют ценность. Следовательно, число 3 не равно строке "3". Нормальное равенство и неравенство действительно ценят ценность. Следовательно, число 3 равно строке "3".

Теперь приведенный выше код просто принуждает obj.length к числу с помощью оператора + и строго проверяет, имеет ли значение до и после принуждения одинаковы (т.е. obj.length типа number). Это логически эквивалентно следующему коду (только более кратким):

if (typeof obj.length === "number") {
    // code
}
2
ответ дан Aadit M Shah 1 September 2018 в 07:06
поделиться

Это способ гарантировать, что obj.length является числом, а не потенциальной строкой. Причиной этого является то, что === не удастся, если длина (по какой-либо причине) является строковой переменной, например. "3".

3
ответ дан Ben Clayton 1 September 2018 в 07:06
поделиться

Согласно MDN :

Оператор унарного плюса предшествует своему операнду и вычисляет его операнд, но пытается преобразовать его в число, если оно не уже. Например, y = + x принимает значение x и присваивает это y; то есть, если x равно 3, y получит значение 3, а x сохранит значение 3; но если x является строкой «3», y также получит значение 3. Хотя унарное отрицание (-) также может конвертировать не числа, унарный плюс является самым быстрым и предпочтительным способом преобразования чего-либо в число, поскольку он не выполнять любые другие операции над номером. Он может преобразовывать строковые представления целых чисел и float, а также значения, отличные от строки, true, false и null. Поддерживаются целые числа в десятичных и шестнадцатеричных форматах («0x» -предоставляемые). Отрицательные числа поддерживаются (хотя и не для hex). Если он не может разобрать определенное значение, он будет оценивать NaN.

4
ответ дан FishBasketGordo 1 September 2018 в 07:06
поделиться
Другие вопросы по тегам:

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