Хабр Курсы для всех
РЕКЛАМА
Практикум, Хекслет, SkyPro, авторские курсы — собрали всех и попросили скидки. Осталось выбрать!
for (var i = 0; i < 10; i++) {
setTimeout(function () {
console.log(i);
}, 0);
}
function getExt(filename){
return filename.indexOf('.')!=-1?('.' + filename.split('.').pop()):'';
}

function getExtension(filename) {
var fragments = filename.split(".");
return fragments[fragments.length - 1];
}
'some.class.js'.substring('some.class.js'.lastIndexOf('.') + 1)substring('some.class.js'.lastIndexOf('.') + 1)
В Вашем решении на Asp.net слишком мало Asp.net!
'some.class.js'.split(".").pop();
function getExt(filename)
{
return filename.substr((~-filename.lastIndexOf(".") >>> 0) + 2);
}
function getExt(file_path) {
return (/\.([^./]*$)/.exec(file_path) || [,null])[1];
}
function getExt(file_path) {
var ext = (/\.([^./]*$)/.exec(file_path) || [])[1];
// ext может быть undefined или пустой строкой. Следующая строка это разруливает:
// пустая строка (для file_path == 'empty ext.') сохраняется, а undefined (для file_path == 'without ext'), заменяется на более логичный null.
return ext == null ? null : ext;
}
( /(?:\.)([^.]+$)/.exec('jquery.validate.unobtrusive.min.js') || [] )[1]( /(?:\.)([^.]+$)/.exec('justfile') || [] )[1]return filename
.replace(/^\./, '')
.split('.')
.slice(-2)
[1] || ''
function ext(filename){
return filename.split(".").pop();
}
ext('js.ert.txt.gz') //"gz"
'some.class.js'.replace(/.*\./, '');
'filename.min.js'.match(/[^.]+$/)(fn.match(/[^.\s]\.([^.]+)$/)||[])[1]
(fn.match(/\.([^.]+)$/)||[])[1]
(function(name){return name.substr((name.lastIndexOf(".")+1)||name.length, name.length);})("txt.tar.gz");
function getExt(filename){
var parts = filename.split('.');
return (filename.length>1)?('.' + filename.pop()):'';
}function inArray(arr, item) {
return !!~arr.indexOf(item);
}
Каков будет результат выполнения следующего кода:
for (var i = 0; i < 10; i++) { setTimeout(function () { console.log(i); }, 0); }
В дополнение к вопросу хочу сказать, что обычно вторым вопросом идет «Как сделать так, чтобы выводило цифры по порядку?»
for (var i = 0; i < 10; i++) {
(function (i) {
setTimeout(function () {
console.log(i);
}, 0);
})(i)
}
for (var i = 0; i < 10; i++) {
setTimeout(function (i) {
console.log(i)
}.bind(undefined, i), 0)
}
for (var i = 0; i < 10; i++) {
setTimeout(function (i) {
console.log(i)
}, 0, i)
}
for (var i = 0; i < 10; i++) {
(function (i) {
setTimeout(function () {
console.log(i);
}, 0);
})(i)
}
for (var i = 0; i < 10; i++) with({ i: i }) {
setTimeout(function () {
console.log(i);
}, 0);
}
for (var i = 0; i < 10; i++) {
setTimeout('console.log('+i+')', 0);
}
for (var i = 0; i < 10; i++) {
setTimeout(console.log.bind(console, i), 0);
}
for (var i = 0; i < 10; i++) {
let k = i;
setTimeout(function () {
console.log(k);
}, 0);
}
for (var i = 0; i < 10; i++) {
setTimeout(function (i) {
console.log(i)
}, 0, i)
}
var k = 0;
for (var i = 0; i < 10; i++) {
setTimeout(function () {
console.log(k++);
}, 0);
}
new Array(10).join().split(',').forEach(function (item, index) {
console.log(index)
});
for (let i = 0; i < 10; i++) {
setTimeout(function () {
console.log(k);
}, 0);
}
function (s) {
return s.replace(/.*\./, '')
}
Подразумевается, то параметр всегда строка и расширение у файла есть.function getExt(filename){
var res = false;
if (filename) {
var arr = filename.split('.');
res = arr.length > 1 ? arr[arr.length - 1] : false;
}
return res;
}
А объявления переменных, например arr лучше выносить вверх скоупа.
if (getExt(fn) == null) {
а это приведет к плачевным результатамif (filename + "") {
а в случае с JS это и вовсе не объект а массив.
var obj = Class();
var a = [];
toString.apply(a);
[object Array]
Это тоже важно, так как показывает, что мы вызываем функцию конкретного объекта, а не передаем не понятно чьей функции (т.е. функции в глобальной куче)А вот утверждения вида " прототипное программирование, которое входит в понятие ООП" нужно обосновывать
Я утверждение надуманное, ничего там и близкого нет с ООП.
1. ООП использует в качестве базовых элементов объекты, а не алгоритмы
2. Каждый объект является экземпляром какого-либо определенного класса
3. Классы организованны иерархически
Программа будет объектно-ориентированной только при соблюдении всех трех указанных требований
В частности, программирование, не основанное на иерархических отношениях, не относится к ООП, а называется программированием на основе абстрактных типов данных.
obj instanceof ClassExample
if (obj instanceof ClassExample) {
...
}
1. ООП использует в качестве базовых элементов объекты, а не алгоритмы
2. Каждый объект является экземпляром какого-либо определенного класса
3. Классы организованны иерархически
Программа будет объектно-ориентированной только при соблюдении вех трех указанных требований
Ну вы же сами понимаете, что инстанс Object в JS это не объект в понимании классического ООП
Да и не все в жс объекты. 4 instanceof Object === false. Да даже 4 instanceof Number === false.
ООП в жс есть
public class A
{
public virtual void M1()
{ }
}
public class B : A
{
public override void M1()
{
base.M1();
...
}
}
function A() {
this.M1 = function() {
console.log("m1 from A");
}
}
var instanceA = new A();
function B() {
this.M1 = function() {
instanceA.M1();
console.log("m1 from B");
}
}
B.prototype = instanceA;
var instanceB = new B();
instanceB.M1();
something.prototype.someFunction = function(a1, a2, a3)
{
somethingVeryParent.prototype.someFunction.call(this, a1, a2, a3);
}
public class O
{
public object prototype;
}
public class A : O
{
public void M1()
{ }
}
public class B : O
{
public void M1()
{
A a = prototype as A;
if (a != null)
{
a.M1();
}
}
}
4..valueOf(); // 4
-нельзя создать методы или свойства класса (ну, статические)
-нельзя переназначить только геттер или сеттер метода (нужно повторно назначать оба)
class Apple {
get color: function() { ... }
}
class Fruit {}
Fruit.add = function(){}
class Apple extends Fruit {}
Apple.add //=> undefined
class Player {
...
get volume(){return this._volume}
set volume(val){...}
...
}
class MetaPlayer extends Player {
set volume(val){
return; //нужно было заблокировать функционал
}
}
var p = new Player;
p.volume; // => 100
var p = new MetaPlayer;
p.volume; //=> undefined. Геттер для метода отнаследованного класса "потерялся".
Я бы хотел услышать как в JS описать класс :)
function ClassExample() {
this.a = 1;
this.method = function () {
return this.a;
}
}
var obj = new ClassExample();
obj.method();
Я лишь обращаю внимание на неестественность
function ClassExample() {
var a = 1;
this.method = function () {
return a;
}
}
function ClassExample()
{
var a = 1;
this.SetUTC = function SetUTC(argUTC)
{
var rd = new RequestData()
rd.OnJSONProcessing = function (argJSON)
{
a = argJSON;
}
}
}
class Example {
int a;
public:
void SetUTC(utc) {
new RequestData().OnJsonProcessing = [this](json){
this.a = json;
};
}
};
нарушили private область видимости
class Example {
int a;
public:
void SetUTC(utc) {
new RequestData().OnJsonProcessing = [this](json){
this.a = json;
};
}
};
class MyCallback: public IntCallback {
int* target;
public:
MyCallback(int* ptr) {
target = ptr;
},
override void Invoke(int data) {
*target = data;
}
};
class Example {
int a;
public:
void SetUTC(utc) {
new RequestData().OnJsonProcessing = new MyCallback(&a);
}
};
doStuff1().then([](result1){
return doStuff2(result1, 123);
}).then([](result2){
return doStuff3(result2, 456);
});
Поэтому если человек использует лямбы в C# — значит он отказался от ООП.«Он предал веру! Сжечь еретика!»
лямды всякие как раз и нарушают ООП.


function ClassExample() {
this.a = 1;
this.SetUTC = function SetUTC(argUTC) {
var rd = new RequestData()
rd.OnJSONProcessing = function (argJSON) {
this.a = argJSON;
}.bind(this);
}
}
function ClassExample() {
this.a = 1;
this.SetUTC = function SetUTC(argUTC) {
var rd = new RequestData()
rd.OnJSONProcessing = (argJSON) => {
this.a = argJSON;
};
}
}
var a = new Symbol('a"); // visible only to ClassExample
function ClassExample() {
this[a] = 1;
}
ClassExample.prototype.SetUTC = function SetUTC(argUTC) {
var rd = new RequestData()
rd.OnJSONProcessing = (argJSON) => {
this[a] = argJSON;
};
};
class A {
B b;
public:
void DoStuff() {
Http.Send("GET", "/a/b/c").then([](rsp){
b.SetData(rsp);
});
}
}
class B {
Data data;
public:
void SetData(Data) {
...
}
}
Я бы хотел услышать как в JS описать класс :)
А про ООП в JavaScript — надо отвечать — нет ООП в JavaScript. А потом уточнять недореализация. Если вопрошающий не соглашается — вставать и уходить — с такими людьми не сработаетесь.
Почему перед исходным кодом jQuery стоит восклицательный знак?
void function(){
}()
/*!
* jQuery JavaScript Library v2.1.1
* jquery.com/
*…
*/
(function () {}).call({})
(function () {}).call({})
new function () {}
class Person {
name: string;
constructor(name: string) {
this.name = name;
}
getName() {
return this.name;
}
}
function Person(name) {
this.name = name;
}
Person.prototype.getName = function () {
return this.name;
};
Язык это и есть синтаксис
с этой оберткой еще терпимо можно программировать, и то потому что альтернативы нет
Основные недостатки JavaScript
ArrayList отличается от LinkedList или чем абстрактный класс отличается от интерфейса. Ценность[1] ответа на оба вопроса была минимальной уже тогда, а сегодня тем более.new Date() вообще ничего не показывает. Гораздо интереснее спросить про время высокого разрешения, потому что если человек знает про window.performance.now(), то может и про другие аспекты Performance API ему что-то известно.obj.handler = function () {}.bind(this)
GetData(argPageName:string)
{
this.CreateXMLHttpRequest();
xmlhttp.open('GET', argPageName, true);
xmlhttp.onreadystatechange = () =>
{
if (xmlhttp.readyState == 4)
{
if (xmlhttp.status == 200)
{
var serverResponse = JSON.parse(xmlhttp.responseText);
this.OnJSONProcessing(serverResponse);
}
}
}
xmlhttp.send(null);
}
ООП язык должен именно, что ЗАСТАВЛЯТЬ
А так же наличие в языке таких конструкций, в которых я реализуя ядро системы именно, что заставлю разработчиков писать код с лучшим качеством.
delegate() { System.Console.WriteLine("Copy #:{0}", ++n); }


В дополнение к вопросу хочу сказать, что обычно вторым вопросом идет «Как сделать так, чтобы выводило цифры по порядку?»
Собеседование на должность JavaScript разработчика