为什么80%的码农都做不了架构师?>>>
弱类型语言
JavaScript是一种弱类型的语言。变量可以根据所赋的值改变类型。原始类型之间也可以进行类型转换。其弱类型的物质为其带来了极大的灵活性。
注意:原始类型使用值传递,复合类型使用引用传递。
原始类型 | Key |
---|---|
布尔型 | bool |
数值型 | number |
字符串型 | string |
空类型 | null |
未定义类型 | undefined |
toString方法可以把数值或布尔值转换为字符串。parseFloat和parseInt函数可以把字符串类型转变为数值。双重非『!!』可以把字符串或数值转变为布尔值。
复合类型 | Key |
---|---|
对象 | object |
函数 | function |
prototype
JavaScript是一种基于原型的语言,所以我们可以通过对JavaScript对象的原型进行操作来达成一些目的。比如:
- 给某个对象添加方法;
- 给某个对象添加属性;
- 实现类似面向对象的功能;
- ...
如果把JavaScript中的所有元素都当成对象来看待的话,我们可以得到一个合理的数据存储方式:JSON。
在JavaScript内部,所有的元素都可以认为是以JSON方式进行存储的。换言之,每一个元素都是有Key以及Value两部分组成。所以以下给对象Anim添加方法的方式都是正确的:
// Anim Classvar Anim = function() { // ...};// Add function to AnimAnim.prototype.start = function() {};Anim.prototype.stop = function() {};// Another Way to add function to a classAnim.prototype = { start: function() { // ... }, stop: function() { // ... }};
我们还可以使用下面的方式给Anim添加方法。这一方式是将prototype.method看作是一个key,将function(name,fn)看作是一个value,然后通过给function(name,fn)传入对应的参数来实现给Anim添加方法的目的。我们还在method中加入了return this,以此来实现链式调用的目的。
// Add a method to the Function object that can be used to declare methods.Function.protype.method = function(name, fn) { this.prototype[name] = fn; return this; // 链式调用};var Anim = function() {};Anim.method('start', function() { // ...});Anim.method('stop', function() { // ...}); // Add a method to the Function object that can be used to declare methods.Function.protype.method = function(name, fn) { this.prototype[name] = fn; return this;};var Anim = function() {};Anim.method('start', function() { // ...});Anim.method('stop', function() { // ...});
链式调用
Anim.method('start', function() { // ...}).method('stop', function() { // ...});
函数是一等对象
在JavaScript中,『函数』被认为是带有可执行代码的复合对象。也就是说,对象所拥有的,函数都拥有,且对象所能做的,函数都可以做。
主要特性:
- 可以存储于变量中;
- 可以作为参数传给其他函数;
- 可以作为返回值从其他函数传出;
- 可以在运行时构造。
由于函数是一种对象,所以我们可以以如下方式来使用函数:
// Function as Object(function() { // ...})()(function(a, b) { // ... return a + b})(1, 2)
对象的易变性
在JavaScript中,所有的元素都可以被当成是对象,而且JavaScript中,所有的对象都是易变的。
我们可以使用如下的方式在程序运行时给JavaScript对象属性:
可以在需要的时候给对象添加属性(包括方法):
function aFunction(){};aFunction.aAttribute = 0;
可以在需要的时候,通过对prototype的操作,给JavaScript对象添加方法:
function person(){ this.name="Aaron"; this.age=14;};person.prototype = { getName: function(){ return this.name; }, getAge: function(){ return this.age; }}
注意:由于JavaScript可以在任何时候为已经存在的对象添加属性、方法,所以我们往往不能保证最终被调用的属性、执行的方法是否是我们最初所编写的。