0%

JavaScript核心概念

函数

函数即是一种特殊的对象——函数对象,初始化一个Function如下:

1
2
var funName = new Function( [argname1, [...argnameN]], body );
var add = new Function( "x", "y", "retruen x + y" );

通过new关键字创建了一个Function对象,和使用new String("test")创建String对象是一个道理。现在的语法糖,通过字面量来创建函数,如:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
function add(x, y) {
return x + y;
}

const add = function(x, y) {
return x + y;
}

const add = (x, y) => x + y;//这种Function创建方式的add没有prototype属性

add.test = "test";

console.log(add.test)//"test", 表明函数其实也是一种对象可以添加属性

原型

对象拥有__proto__constructor属性,__proto__属性表示的就是它的父原型,其中包含了父原型的所有属性,如果在当前对象中找不到某个属性,就会沿着原型链查找父原型中是否有某个属性,如果到了最上层(Object的上层是null)也找不到,则返回undefine

函数是一种特殊对象,不仅拥有上述两种属性,还拥有一种prototype属性。在通过new创建一个类的实例对象的时候,prototype属性的成员都成为实例化对象的成员。

函数作用域

JavaScript的函数是在局部作用域内运行的,在局部作用域内运行的函数可以访问外层的变量和函数。Javascript的作用域为词法作用域,其作用域是在定义时(词法分析时)就确定下来的,而并非在执行时确定,如:

1
2
3
4
5
6
7
var str = "global";
function test () {
console.log(str);
var str = "local";
console.log(str);
}
test();//undefine,"local"

词法分析结束后,构建作用域链的时候,会将函数内定义的str变量放入该链,因此在整个test函数内可见。

数组

特性

在JavaScript中,length并非只读属性,可以手动改变,如:

1
2
3
4
var array = [1,2,3,4,5]
console.log(array.length)
array.length = 3
console.log(array)//5, [1,2,3]

手动减小length会使得数组部分元素变得不可用。

以字符串可以作为数组的下标,就采用访问JavaScript对象的属性的方式进行,但是数组本身的length属性不会发生变化,如:

1
2
3
4
5
6
7
var stack = [];
stack["first"] = "1";
stack["second"] = 2;
stack["third"] = new Date();
console.log(stack.length);
stack[0] = 1;
console.log(stack.length);//0, 1
排序

数组的sort方法不关注数组内容是数字还是字母,只会按照字母的字典顺序来进行排序,如:

1
2
3
var array = [0, 1, 2, 3, 23, 12];
array.sort();
console.log(array);//0, 1, 12, 2, 23, 3

可以通过给sort传递一个函数对象,按照函数规则排序。

new 操作符

在JavaScript中使用new操作符并不是直接新建一个函数对象,如:

1
2
3
4
5
6
7
8
9
10
11
function Shape(type) {
this.type = type;
this.calc = function() {
return `calc, ${this.type}`
}
}

var triangle = new Shape("type");
//类似
var triangle = {};
Shape.apply(triangle, ["type"])//区别在于: triangle instanceof Shape ,false