Явно говоря, this.foo
означает (как вы поняли хорошо), что вас интересует свойство foo
текущего объекта, на которое ссылается this
. Поэтому, если вы используете: this.foo = 'bar';
, вы собираетесь установить свойство foo
текущего объекта, на которое ссылается this
, равное bar
.
Ключевое слово this
в JavaScript не " t всегда означает то же самое, что и в C ++. Здесь я могу привести пример:
function Person(name) {
this.name = name;
console.log(this); //Developer {language: "js", name: "foo"} if called by Developer
}
function Developer(name, language) {
this.language = language;
Person.call(this, name);
}
var dev = new Developer('foo', 'js');
В приведенном выше примере мы вызываем функцию Person
с контекстом функции Developer
, поэтому this
ссылается на объект, который будет создан Developer
. Как вы можете видеть из результата console.log
, результат this
исходит из Developer
. С первым аргументом метода call
мы укажем контекст, с которым будет вызываться функция.
Если вы не используете this
, просто созданное вами свойство будет локальной переменной , Поскольку вы, возможно, знаете, что JavaScript имеет функциональную область, поэтому переменная будет локальной, видимой только для функции, где она объявлена (и, конечно же, все это дочерние функции, объявленные внутри родителя). Вот пример:
function foo() {
var bar = 'foobar';
this.getBar = function () {
return bar;
}
}
var f = new foo();
console.log(f.getBar()); //'foobar'
Это верно, если вы используете ключевое слово var
. Это означает, что вы определяете bar
как локальную переменную, если вы забудете var
, к сожалению bar
станет глобальным.
function foo() {
bar = 'foobar';
this.getBar = function () {
return bar;
}
}
var f = new foo();
console.log(window.bar); //'foobar'
Именно локальная область может помочь вам добиться конфиденциальности и инкапсуляции, которая являются одним из самых больших преимуществ ООП.
Пример реального мира:
function ShoppingCart() {
var items = [];
this.getPrice = function () {
var total = 0;
for (var i = 0; i < items.length; i += 1) {
total += items[i].price;
}
return total;
}
this.addItem = function (item) {
items.push(item);
}
this.checkOut = function () {
var serializedItems = JSON.strigify(items);
//send request to the server...
}
}
var cart = new ShoppingCart();
cart.addItem({ price: 10, type: 'T-shirt' });
cart.addItem({ price: 20, type: 'Pants' });
console.log(cart.getPrice()); //30
Еще один пример преимуществ области JavaScript - это шаблон модуля . В шаблоне модуля вы можете имитировать конфиденциальность, используя локальную функциональную область JavaScript. При таком подходе вы можете иметь как частные свойства, так и методы. Вот пример:
var module = (function {
var privateProperty = 42;
function privateMethod() {
console.log('I\'m private');
}
return {
publicMethod: function () {
console.log('I\'m public!');
console.log('I\'ll call a private method!');
privateMethod();
},
publicProperty: 1.68,
getPrivateProperty: function () {
return privateProperty;
},
usePublicProperty: function () {
console.log('I\'ll get a public property...' + this.publicProperty);
}
}
}());
module.privateMethod(); //TypeError
module.publicProperty(); //1.68
module.usePublicProperty(); //I'll get a public property...1.68
module.getPrivateProperty(); //42
module.publicMethod();
/*
* I'm public!
* I'll call a private method!
* I'm private
*/
Есть немного странный синтаксис с отключением безпользовательских анонимных функций, но забудьте об этом на данный момент (он просто выполняет функцию после ее инициализации). Функциональность можно увидеть на примере использования, но преимущества связаны главным образом с предоставлением простого публичного интерфейса, который не включает в себя все детали реализации. Для более подробного объяснения шаблона вы можете увидеть ссылку, которую я поставил выше.
Надеюсь, что с информацией this
:-) я помог вам понять несколько основных тем JavaScript.
Вы можете использовать Series.str.strip
с Series.str.split
:
df['new'] = df[0].str.strip('[]').str.split()
print (df)
0 new
0 ["A" "B" "C" "D"] ["A", "B", "C", "D"]
1 [8 3 6 11] [8, 3, 6, 11]
2 [5 7 4 3] [5, 7, 4, 3]
3 14 [14]
Если необходимы смешанные данные - list
со скалярами добавить Series.mask
для применимого решения только для значений, начинающихся с [
, проверенных Series.str.startswith
:
df['new'] = df[0].mask(df[0].str.startswith('['), df[0].str.strip('[]').str.split())
print (df)
0 new
0 ["A" "B" "C" "D"] ["A", "B", "C", "D"]
1 [8 3 6 11] [8, 3, 6, 11]
2 [5 7 4 3] [5, 7, 4, 3]
3 14 14