三、数组
1. 创建数组
方式一:new 一个对象
let arr = new Array();
方式二:字面量创建
let arr = []; let arr2 = [1, 2, 'hello', true, undefined];
由于 JS 是动态类型的语言,所以不要求数组中的元素一定是相同类型的。
2. 数组的基本使用
let arr = [1, 2, 'hello', true]; console.log(arr); console.log(arr.length); let i = 0; for(i=0; i<arr.length; i++) { console.log(arr[i]); } console.log(arr[100]);
展示结果:
在 JS 中,若代码中涉及到超出数组范围或不在数组范围内,在浏览器显示的时候并不会报错,但会显示 【undefined】.
3. 为数组新增元素
let arr = [1, 2, 'hello', true]; arr[4] = 100; console.log(arr.length); arr[-1] = 200; console.log(arr.length); arr[10] = 300; console.log(arr.length); arr['hello'] = 'world'; console.log(arr.length); console.log(arr['hello']); console.log(arr.hello); console.log(arr);
展示结果:
注意
① 当我们尝试对 arr 进行尾插的时候,结果成功。
② 当我们尝试往 arr[10] 插入元素的时候,结果成功,并且扩容了数组长度。
③ 当我们尝试往 arr[ ‘hello’ ] 插入元素的时候。即非数字下标,结果成功,但不计入长度。但是,这里我们应该将 “下标” 理解成数组的 “属性”,我们同时可以通过 arr.hello 的方式来访问此属性对应的值。
④ 当我们尝试往 arr[-1] 插入元素的时候,结果成功,但不计入长度。这和上面所说的 “属性” 是一个道理,但又不完全一致。
而造成这些与 Java 数组不同语法的关键,其实就是因为 JS 是一个动态类型的语言,所以才会衍生出这些不同的逻辑。
4. 为数组增删元素
为数组增删元素,推荐使用 push 和 splice 方法,方便且清晰。
在 JS 中,我们可以将数组理解为一个对象,那么我们就可以利用对象对应的方法,这就和 Java 中的 ArrayList 差不多,push 就相当于 ArrayList 的 add 方法。
而下面的 splice(2,3),表示:从数组 2下标开始,删除后三个元素。
let arr = []; for(let i=0; i<10; i++) { arr.push(i); } console.log(arr.length); console.log(arr); arr.splice(2,3); console.log(arr.length); console.log(arr);
展示结果:
四、函数
① 函数的定义和调用的先后顺序没有要求。
② 若函数有返回值,函数定义的时候不需要写返回类型。
③ 实参和形参之间的个数可以不匹配,但实际开发中,要求形参和实参个数要匹配。
④ 函数表达式:可以定义一个函数赋给一个变量,再通过变量来调用当前的函数。
展示1
函数的定义和调用的先后顺序没有要求。
f1(); console.log("-----------------"); function f1() { console.log("hello"); } f1(); console.log("-----------------"); function f2(x, y) { return x + y; } console.log(f2(1, 2)); console.log(f2("hello ", "world"));;
展示结果:
展示2
实参和形参之间的个数可以不匹配。
function f1(x, y) { console.log("x:" + x); console.log("y:" + y); return x + y; } console.log(f1(10)); console.log("----------------------"); console.log(f1(10, 20, 100));
展示结果:
展示3
function add(a, b, c, d) { //若 a 不为0,那么就将 a 的值赋值给 a ;否则,将 0 赋值给 a a = a || 0; b = b || 0; c = c || 0; d = d || 0; return a + b + c + d; } console.log(add(10)); console.log(add(10 + 20)); console.log(add(10 + 20 + 30)); console.log(add(10 + 20 + 30 + 40));
展示结果:
展示4
函数表达式:可以定义一个函数赋给一个变量,再通过变量来调用当前的函数。
函数和一个普通变量的地位相同,可以相互赋值。此外,还可以省略函数名,这是常见的匿名函数写法。
let add = function addFun(x, y) { return x + y; } console.log(add(10, 20)); //常见写法:匿名函数 let add2 = function (x, y) { return x + y; } console.log(add2(10, 20));
展示结果:
作用域
var 关键字的范围可以脱离大括号外,let 关键字的范围只能再大括号内。
for(var i=0; i<10; i++) { } console.log(i); for(let i=0; i<10; i++) { } console.log(i);
展示结果:
五、对象
在 JS 中,字符串、数值、数组、函数都是对象。
创建对象
1. 使用字面量创建对象 (最常用)
let student = { name: 'Jack', age: 20, height: 175, f1:function() { console.log('hello'); } }; console.log(student.name); console.log(student['age']); student.f1();
展示结果:
注意:
① 使用 【. 成员】 来访问运算符来访问属性;. 可以理解成 “的”。
② 使用 [ ] 访问属性,此时属性需要加上引号。
③ 调用方法需要加上 ( )
2. 使用 new Object 创建对象
//和创建数组类似 let student = new Object(); student.name = "Rose"; student.height = 175;
3. 使用构造函数创建对象
function robot(name, type) { this.name = name; this.type = type; this.func = function() { console.log("超级变换形态"); } } let robot1 = new robot("卡布达", "1号机器人"); let robot2 = new robot("金龟次郎", "2号机器人"); let robot3 = new robot("飞翔机器人", "3号机器人");
这种创建对象的方式类似于 Java 中创建实例,但并不完全相似,此外,这种方式用的少。形如这样的函数被称为 “构造函数”,JS 中的构造函数是可以独立存在的,这一点与 Java 不同。
理解 JS 中的对象
① JS 没有 “多态”, JS 本身就是动态类型语言,在使用对象的某个方法时,本身也不需要对对象的类型做出明确区分,因此并不需要在语法层面上支持多态。
② JS 对象不区分 “属性” 和 “方法”。
③ JS 对象没有 private / public 等访问控制机制。
④ JS 对象没有 “继承”,继承本质就是 “让两个对象建立关联”,或者说,是让一个对象能够重用另一个对象的属性 / 方法,JS 中使用 “原型” 机制实现类似的效果。
⑤ 在 ES6 之前,JS 没有 “类” 的概念,对象其实就是 “属性” + “方法”。而类则相当于把一些具有共有的对象的属性和方法单独提取了出来,相当于一个模型一样,那么,通过这个模型就可以实例化对象了。在 JS 中的 “构造函数” 也能起到类似的效果,但并不完全具备类的一些特性。在 ES6 之后,也引入了 class 关键字,就能按照类似于 Java 的方式创建类和对象了,但用 class 的方式还是较少。