JavaScript中的数组和对象
Contents
1 阵列和物件
这是我在YouTube上看到一个台湾哥们讲JavaScript基础时提到的概念,原来他们那边是这么命名这两个术语的。比较有意思,一下子就掌握和记住了这两个之间的最基本区别。数组–阵列,用方括号[],对象–物件,用花括号{}。
当然,再回想一下当初入行时,跟着小布老师学习Oracle的时候,他推荐了一本英文原版书,大名鼎鼎的Tom Kyte的Oracle 9i编程艺术,我跟着小布老师的节奏,尝试着捏着鼻子人模人样的读起英文技术书籍。Tom在书中讲到,RAID[Redundant Array of Independent Disks]技术,业内习惯叫磁盘阵列,完整的翻译,我觉得应该叫冗余独立磁盘阵列。说不定,这个术语就是沿用了台湾那边的叫法。
那个YouTube频道:布鲁斯前端
https://www.youtube.com/watch?v=1pYtVwIAvhY&t=1075s
2 数组的数据类型是object
在JavaScript中,数组本身的数据类型却是对象object。
const cars['BMW','NISSAN','Benz']; console.log(typeof cars); //object
Arrays are a special type of objects. The
typeofoperator in JavaScript returns “object” for arrays.But, JavaScript arrays are best described as arrays.
Arrays use numbers to access its “elements”. In this example,
cars[0]returns BMW。引自w3schools:https://www.w3schools.com/js/js_arrays.asp
3 数组的元素可以是对象
数组的元素可以是对象,在JavaScript中,数组、函数的数据类型都是object。因此,数组的元素可以是一个对象,也可以是一个函数,甚至还可以是其它的一个数组。
<!DOCTYPE html>
<html lang="en">
<head>
<!--@Author:asher
@Date:2021/7/9 08:01 -->
<meta charset="UTF-8">
<title>Title</title>
</head>
<body>
<h2>JavaScript Arrays</h2>
<p>Array.forEach() calls a function for each array element.</p>
<p id="demo"></p>
<p id="demo2"></p>
<script>
const fruits = ['apple', 'orange', 'grape', 'pear'];
let text='<ul>';
fruits.forEach(myFunc);
text+='</ul>';
document.getElementById('demo').innerHTML = text;
const newArray = [myFunc(), fruits];
document.getElementById('demo2').innerHTML = newArray;
function myFunc(value) {
text+='<li>'+value+'</li>';
}
</script>
</body>
</html>4 数组添加元素
语法1:数组名.push(‘新元素’); 数组名.push(‘新元素1′,’新元素2’);
语法灵活,可以一次添加1个,也可以添加多个。如果添加的元素是对象的话,则直接写对象名,不需要单引号或者是双引号。
语法2: 数组名[数组名.length]=’新元素’;
语法3:数组名[100]=’新元素’; 当索引下标超出数组现有长度时,添加不会失败,也不会像Java那样抛出IndexOutOfArrayLenth的错误。只是,此时该新添加的元素被放到一个undefined ‘hole’ in the array.
WARNING !
Adding elements with high indexes can create undefined “holes” in an array:
4.5补充(2021.07.10) 数组头、尾部操作
a 头部删除/添加元素shift()/unshift()
unshift()添加新的元素之后,原有的元素依次向后移动1个位置;返回值是头部添加元素之后,新数组的长度。
shift()删除数组头部元素之后,原有的元素依次向前移动1个位置;返回值是头部元素;
b 尾部添加/删除元素push()/pop()
尾部添加元素push(),返回值是新数组的长度;
数组尾部元素删除pop(),返回值是尾部的元素;
5 避免使用new Array()来创建数组
The new keyword only complicates the code. It can also produce some unexpected results:
// This creates an array with two elements (40 and 100): const points = new Array(40, 100); // This creates an array with 40 undefined elements !! const points = new Array(40);
6 数组和对象的区别
In JavaScript, arrays use numbered indexes.
In JavaScript, objects use named indexes.
Arrays are a special kind of objects, with numbered indexes.
Arrays use numbers to access its “elements”.数组使用基于数字的索引下标来访问元素:
const person=['John','Kate']; let name = person[0];
Objects use names to access its “members”. 对象使用基于key值的下标来访问数据:
const person={firstName:"John",lastName:'Kate',age:40};
let name=person.firstName;7 When to Use Arrays. When to use Objects.
- You should use objects when you want the element names to be strings (text).
- You should use arrays when you want the element names to be numbers.
8 How to Recognize an Array
怎么判断一个对象是不是一个数组?
由于JavaScript认为数组的数据类型是object,那么我改如何判断一个数组的数据类型是数组呢?
const cars = ['BMW','Benz']; typeof cars ;//结果是object,这时怎么判断它是数组呢?
方法1:To solve this problem ECMAScript 5 defines a new method Array.isArray():
// To solve this problem ECMAScript 5 defines a new method Array.isArray(): Array.isArray(cars); //返回结果是true,说明是数组
方法2:The instanceof operator returns true if an object is created by a given constructor:
//The instanceof operator returns true if an object is created by a given constructor: cars instanceof Array;// return true.
方法3:利用constructor property来判断
2021年7月11日补充,看官网https://www.w3schools.com/js/js_typeof.asp学习到的。
const fruits = ['apple','mongo'];
let isArray = isArray(fruits);
function isArray(array){
return array.constructor.toString().indexOf("Array") > -1;
}或者利用constructor property的一种更简单的判断方式:
const fruits = [1,2,3];
let x = isArray(fruits);
function isArray(array){
return array.constructor === Array;
}9 数组的自动toString
JavaScript automatically converts an array to a comma separated string when a primitive value is expected.
This is always the case when you try to output an array.
These two examples produce the same result:
All JavaScript objects have a toString() method.
这一点儿,跟Java有异曲同工之妙。我们在Java中,有时为了输出打印对象,我们就得重写@Override该对象所在类的toString()方法。当然,该方法来自于Object类。