Skip to content

Latest commit

 

History

History
80 lines (48 loc) · 5.5 KB

README.md

File metadata and controls

80 lines (48 loc) · 5.5 KB

javascript study

  • javascript以map(或者像oc的dictionary)的方式来定义一个对象,这个对象就显得非常灵活,也天然适合和json结合

  • javascript允许在对象声明后任何时刻新增/删除属性,非常灵活

  • javascript使用了单线程模型,这一点与大部分原生的系统不一样,这意味着不再需要考虑线程安全的问题

  • javascript的promise有点像rxjava,当然,最核心的转换没有

  • javascript的作用域很特别

  • javascript并没有“私有”这个概念,要靠模拟来实现。所以像单例这种模式,js实现起来比其它语言会麻烦一点

  • javascript是事件驱动的,而很多其它的语言的事件驱动依赖于平台,而不是语言本身,或者可以理解为javascript本身就 部分平台特性,这个平台就是V8或者浏览器

  • javascript是弱类型变量,解释器运行时检查数据类型,而Java/C++采用强类型变量检查,即所有变量在编译之前必须做声明, 声明后变量类型就固定下来。这一点在函数声明时让javascript特别灵活。

比如说有个函数,它第一个参数可以是int类型,也可以是string类型,或者其他object类型,第二个参数也可以是多种类型,而且 这个参数还是可选的。

在c++可以通过overloading和default参数来实现,但是仍然要写好几个函数。

在Java里面通过overloading实现,但是java没有缺省参数这个特性,所以要写更多个函数。或者使用不太友好的arguments的map作为参数。

但是神奇的javascript,只要一个函数,搞定一切。充分利用了参数运行时检查类型的特性。

  • 可以给原型增加方法,Java没有这个特性,只能用继承overriding来实现,碰到String这种final类,就没有招了,而继承只能改变自 己的类,不能修改程序中使用到基类的地方。Object-C通过Categories可以实现往基类添加新成员,通过Posing来修改基类的方法, 但是Posing已经被Deprecated了,相比之下,Javascript显然灵活很多。

  • 因为是解释语言,所以没有C++那种预编译的特性,而预编译特性在多平台差异化的时候比较常用,对Javascript来说,大多情况下可以 认为只有一个平台,所以一般情况下制作运行时开关,不做编译时开关。这个特性Java也没有。

  • javascript没有模板类(Template)的概念,也许是javascript太灵活了,根本不需要再通过模板类来提高灵活性以及代码的复用性。或 者本质上可以认为javascript一切都是泛型的,根本不再需要泛型的概念。

  • javascript里面,函数就是对象,经常会出现一个对象的函数被赋值给一个变量的情况,这个时候如果函数里面使用到了this,它的指向会 发生变化

比如说有个函数,它第一个参数可以是int类型,也可以是string类型,或者其他object类型,第二个参数也可以是多种类型,而且 这个参数还是可选的。

在c++可以通过overloading和default参数来实现,但是仍然要写好几个函数。

在Java里面通过overloading实现,但是java没有缺省参数这个特性,所以要写更多个函数。或者使用不太友好的arguments的map作为参数。

但是神奇的javascript,只要一个函数,搞定一切。充分利用了参数运行时检查类型的特性。

弱类型检查是把双刃剑,它提供了灵活的同时,安全性会打折扣。比如静态语言,一个契约/接口原来可以通过类型检查(比如函数参数转化)在编译期暴露错误,而动态语言,则只有运行时才暴露错误,接口的约定更 依赖于注释这种不可靠、非强制性的东西。

  • 可以给原型增加方法,Java没有这个特性,只能用继承overriding来实现,碰到String这种final类,就没有招了,而继承只能改变自 己的类,不能修改程序中使用到基类的地方。Object-C通过Categories可以实现往基类添加新成员,通过Posing来修改基类的方法, 但是Posing已经被Deprecated了,相比之下,Javascript显然灵活很多。

  • 因为是解释语言,所以没有C++那种预编译的特性,而预编译特性在多平台差异化的时候比较常用,对Javascript来说,大多情况下可以 认为只有一个平台,所以一般情况下制作运行时开关,不做编译时开关。这个特性Java也没有。

  • javascript没有模板类(Template)的概念,也许是javascript太灵活了,根本不需要再通过模板类来提高灵活性以及代码的复用性。或 者本质上可以认为javascript一切都是泛型的,根本不再需要泛型的概念。

  • 本质上不支持多重继承和interface,但是因其灵活性,可以模拟出这两个特性来

  • js弱化了类的概念,一切皆函数,一切皆对象。同时因为类被弱化,this依赖于上下文环境,可能是 顶层对象,可能是模块,可能是对象。

  • 闭包很像加了命名空间的全局变量,或者说像C语言函数里面的static变量,但是加了函数名命名空间

  • javascript弱化了类的概念,继承的时候使用原型继承,且函数也是一个对象

  • 不同于java语言的import或者c++的include,js引用require指令可以动态化,就是require后面可以是 变量,这给程序设计带来了很大的灵活性。在C++或者java里面,可能需要引入code generator才能实现 同样的工作。

  • ES6引入了生成器