Хабр Курсы для всех
РЕКЛАМА
Практикум, Хекслет, SkyPro, авторские курсы — собрали всех и попросили скидки. Осталось выбрать!
С# приложение разрабатывала команда из 12 программистов в течении двух лет, JavaScript — команда из 3 программистов в течение года
Так на ассемблере почти никто не пишет кроме полутора мамонтов. И уж точно я не вспомню статей «ассемблер — это суперязык будущего», «как, вы не любите asm?». Что-то всё больше наоборот.
Сложные системы на js легче писать, чем генерить html
Если б можно было я вообще ты только СУБД и браузер оставил
3+"3" получать TypeError, а не "33"."[object Object]" и совершал долгий путь по коду, прежде чем привести к отложенным, но неприятным последствиям, таким, что даже с неплохим набором тестов далеко не сразу можно понять, в чём дело. А, или вот — случайно загнать строку вместо массива, а потом биться головой о стену, что где-то дальше по коду somevar[0] = ...; не даёт никакого эффекта.С другой стороны, если вы скажете, что в Python'е сильная типизация, вас очень многие поймут неправильно, т.к. многие путают сильную типизацию со статической.
delete Object.prototype.toString;
delete Object.prototype.valueOf;
delete Array.prototype.toString;
...
TypeError.Скажем, вы поделили на нуль, большинство языков выбросит ошибку и завершит работу
Выход из строя одного элемента не выводит из строя всю систему. Конечно, плохо показывать пользователю NaN или undefined, но это гораздо лучше, чем аварийно завершиться, как все мы много раз видели у многих нативных прогамм под Windows (и не только).
Если говорить об Объектно Ориентированном Программировании
Вывод из строя одного элемента обязан обрушить всю систему
Скажем, вы поделили на нуль, большинство языков выбросит ошибку и завершит работу, а JavaScript покажет знакомый нам Not a Number и, возможно, даже выведет его в интерфейс пользователю в виде строки, если так задумана логика программы. Хорошо это или плохо? Я бы сказал, это позволяет создавать программы с высочайшим уровнем стабильности.
в продакшн-коде часто лучше всё-таки умолчать об ошибке.
if(!window.WeakMap){
var id = 0
, has = ({}).hasOwnProperty
, WEAKDATA = Math.random().toString(36).slice(2);
window.WeakMap = function(){
if(!(this instanceof WeakMap))throw TypeError();
this.clear();
}
WeakMap.prototype.clear = function(){
this._id = id++;
}
WeakMap.prototype['delete'] = function(key){
return this.has(key) && delete key[WEAKDATA][this._id];
}
WeakMap.prototype.has = function(key){
return (key === Object(key)) && has.call(key, WEAKDATA) && has.call(key[WEAKDATA], this._id);
}
WeakMap.prototype.get = function(key){
return (key === Object(key)) && has.call(key, WEAKDATA) ? key[WEAKDATA][this._id] : undefined;
}
WeakMap.prototype.set = function(key, value){
if((key !== Object(key)))throw TypeError();
(has.call(key, WEAKDATA) ? key : Object.defineProperty(key, WEAKDATA, {value: {}}))[WEAKDATA][this._id] = value;
return this;
}
}
Порой вы не можете быть уверены даже в том, какие методы имеет тот или иной объект.
JavaScript обладает очень низким порогом входа.и
Это требует высокого уровня концентрации и хорошего понимания архитектуры.убедительно показывают, что количество аргументов здесь решает больше, чем их сочетаемость и актуальность.
Скажем, вы поделили на нуль, большинство языков выбросит ошибку и завершит работу, а JavaScript покажет знакомый нам Not a Number
Большинство языков ставят ограничения, якобы для нашего же блага. JavaScript не признаёт ограничений, вы можете менять код где угодно и когда угодно, в том числе гибко патчить чужой код.
В JavaScript нет защиты от дурака. Мы считаем, что все, кто работают над кодом — профессионалы и доверяем им.
Я бы сказал, это позволяет создавать программы с высочайшим уровнем стабильности. Выход из строя одного элемента не выводит из строя всю систему.
'3' + 2 === '32';
for(var i = 0; i < arr.length; i++){}
for(var i in arr){}
var arr = [1,2,3];
for(var i in arr){}
var arr = [1,2,3];
for(var i in arr){
console.log(typeof i);
}
for (var index in arr) {}эквивалентноfor (var prop in obj) {}my_array.map(...) или my_array.forEach(...)гибкого и кроссплатформенного программного обеспечения с поразительной скоростью.
var daddy = {foo: 'bar'}var son = Object.create(daddy)console.log(son.foo)Object.defineProperty(window,'CONST',{value:1,immutable:true}).но я как обезьяна переписываю "[1].indexOf(1)>0"
for(k in a){ if (a.hasOwnProperty(k)){ // прелесть какая
}}
(function(){
}($)); // лисп отдыхает
function Foo(bar){
this.bar = bar;
}
Foo.prototype.getBar = function(){
return this.bar;
}
var foo1 = new Foo(42);
console.log(foo1.getBar()); // -> 42
var foo2 = Object.create(Foo.prototype, {'bar': {value: 43}});
console.log(foo2.getBar()); // -> 43
var foo3 = {bar: 44};
foo3.__proto__ = Foo.prototype;
console.log(foo3.getBar()); // -> 44
var foo2=Object.create(Foo.prototype); Foo.call(foo2,43);
Подмените __proto__ еще раз для foo1 и foo2 на что-то другое и у foo1 будет метод getBar, а у foo2 — нетДа шо ви такое говорите?
> foo4 = new Array()[]> foo4.__proto__ = Foo.prototypeFoo {getBar: function, hohoho: 1}> foo4.bar = "wow""wow"> foo4.getBar()"wow"> Array.isArray(foo4)trueЕсть ситуации, когда подмена __proto__ не даст вам 100% поведения.Если исключить ошибки в реализации и встроенные типы, то таких вещей нет. И быть не может.
constructor в созданном таким образом объекте — оно особенным не является. Его можно подменить как и любое другое. Но создать таких «особенных» конструкторов на уровне JavaScript'а вы не сможете (в Firefox если выйти на уровень XPCOM'а — сможете, но это другая история), так что в результате вы таки можете эти случаи тоже обработать — используя как раз Array.isArray() и тому подобные вещи. Только нужно не забывать про «дешевизну» и помнить про заботливо разложенные по всему языку грабли. Например если вы сделаете переменную a содержащую, ну скажем, нуль (простой обычный нуль без выкрутасов), то у неё тоже будет поле __proto__ и в нём — функция isPrototypeOf, но вот a.__proto__.isPrototypeOf(a) будет равно false. А конструктор там такой особенный, что дальше некуда:a = 0;b = a.constructor = function () { return "hehe"; }alert(b); // function () { return "hehe"; }alert(a.constructor); // function Number() { [native code] }new Сonstructor(), когда сможете подменить __proto__ у примитива – приходите с решением!Слепили за 10 дней.
У массивов есть [].contains(item)
Стандартный класс URI
нужно уточнить почему
Имел ввиду не класс URI, а класс URL
Записывать «маскировку» ошибок в преимущества языка это не то что бы неадекватно, но очень сильно на любителя, скажем так.
а не для хардварщиков
Здесь будет всего 4 строчки кода и много-много того, что не напишут в учебниках
JavaScript мультипарадигменный язык
JavaScript не признаёт ограничений
Последняя и самая важная вещь, которую нужно понимать о JavaScript, связана с его нетипизованностью
Это может показаться странным, но я хочу задать такой вопрос: а для чего вообще существует система типов?
JavaScript обладает потрясающим уровнем интроспекции
Необходимо было создать настольное приложение на .Net C# и его точную копию в веб на JavaScript. С# приложение разрабатывала команда из 12 программистов в течении двух лет, JavaScript — команда из 3 программистов в течение года. Можно говорить о разнице в квалификации, о том, что возможно влияли другие факторы, но так или иначе разница в 8 раз показательна.
Вы до сих пор не любите JavaScript?