本文是我学习《你所不知道的javaScript上卷》的读书笔记的整理。
更多详细内容,请微信搜索“前端爱好者
、for...in 语句
1.1 遍历对象属性名称
for...in 语句常用于遍历特定对象的属性,包括字段名称属性及函数名称属性。在JavaScript语言中,它们均称为属性 (property)。
let obj={
name: 'obj',
showName() {
console.log(this.name);
}
};
for (const propName in obj) {
console.log(propName, typeof(obj[propName]));
}
显示:
name – "string"
showName – "function"
利用这一点,可方便地查看特定对象的所有属性或方法名称。下面语句打印出console对象所有的属性:
for (const propName in console) {
console.log(propName, typeof(console[propName]));
}
显示:
debug – "function"
error – "function"
log – "function"
info – "function"
warn – "function"
clear – "function"
...
可以看出,这些属性全部均是console的函数名称,因为console没有属性名称。
1.2 遍历数组索引值
for...in 用于数组中,则遍历数组索引值。
let array=['a', 'b', 'c'];
for (const index in array) {
console.log(index, array[index]);
}
显示:
0 – "a"
1 – "b"
2 – "c"
1.3 遍历字符串索引值
由于字符串是由字符组成的数组,因此 for...in 也可用于遍历字符串的索引值。
let str="abc";
for (const index in str) {
console.log(index, str[index]);
}
显示:
0 – "a"
1 – "b"
2 – "c"
2、for...of 语句
for...of 语句用于遍历可遍历对象 (iterable objects)的元素。这些可遍历对象包括字符串、数组、以及类似于数组的对象,这些对象都带有length属性。
2.1 不能用于遍历对象属性名称
for...of 语句不能用于遍历对象的属性名称。因此,下面的代码是错误的:
let obj={
name: 'obj',
showName() {
console.log(this.name);
}
};
for (const propName of obj) {
console.log(propName);
}
显示:
TypeError: undefined is not a function (near '...propName of obj...')
意为,将 for...of 语句用于对象上面,无法提取具体的数值。
2.2 遍历数组元素
for...of 语句经常用于遍历数组中各元素的数值。
let arr=[2, 4, 6, 8, 10];
for (const value of arr) {
console.log(value);
}
显示:
2
4
6
8
10
2.3 遍历字符串中的字符
由于字符串是由字符组成的数组,因此 for...of 也可用于遍历字符串的字符。
let str="abc";
for (const letter of str) {
console.log(letter);
}
显示:
a
b
c
2.4 解包
数组元素如果是带有特定属性名称的对象,可利用解包性质来快速遍历这些属性值。看下面例子。
function Point(x, y) {
return {x:x, y:y};
}
let points=[Point(1, 2), Point(2, 3), Point(4, 5)];
for (const point of points) {
console.log(point.x, point.y);
}
可将Point视为一个构造器 (constructor),每次调用Point(x, y)都会创建并返回该类的一个对象,且含有x及y的属性名称。points则是一个含有多个Point对象的数组。上面的代码遍历出每个Point对象后,赋值于point变量,然后打印出它们的x值及y值。
如果我们不希望每次都通过引用对象属性的方式来访问x及y值,则可编写代码如下:
for (const point of points) {
let x=point.x;
let y=point.y;
console.log(x, y);
}
这一步可利用ES6的const解包特性予以简化:
for (const point of points) {
const {x, y}=point;
console.log(x, y);
}
更进一步,我们可以直接解包:
for (const {x, y} of points) {
console.log(x, y);
}
2.5 遍历Map
let scoreMap=new Map([
['Mike', 75],
['Tom', 80],
['Smith', 90]
]);
for (const [key, value] of scoreMap) {
console.log(key, value);
}
与上一节不同的是,Map需要使用 [key, value] 的方式来解包。
3、forEach 方法
3.1 forEach 常见调用方式
for...in,for...of 均是语句,与它们不同的是,forEach是数组的内嵌方法。这意味着我们可以直接在数组对象上面直接调用该方法。
let arr=[1, 3, 5, 7, 9];
arr.forEach((element)=> {
console.log(element);
});
作为数组方法,forEach有一个参数,该参数的类型是函数,称为回调函数 (callback function)。所谓回调函数,是指一旦程序员提供了这样的函数,JavaScript引擎将负责调用此函数。
回调函数的价值在于回调函数可能存在多个参数,而这些参数将由JavaScript引擎自动提供。在回调函数中,我们可对JavaScript引擎所自动提供的参数进行进一步加工。
在上面的回调函数中,element是由JavaScript引擎自动提供的,代表每个数组元素。
上面的代码采用了lambda匿名表达式。它等同于:
let arr=[1, 3, 5, 7, 9];
function callback(element) {
console.log(element);
}
arr.forEach(callback);
可见,lambda表达式更加简练。
3.2 forEach 的参数
forEach共有3个参数 (上面例子只用了第1个),它们的排列顺序如下:
arr.forEach((element, index, array)=> {
console.log(element);
console.log(index);
console.log(array);
});
参数element是数组元素,参数index是数组元素所在数组中的索引值,参数array是整个数组。
一般情况下,我们仅需用到element及index参数就足够了。由于是每次迭代,因此,forEach方法中的array参数较少用到。
index每次遍历时都会加1,且每次都会与array的长度比较。一旦超出array的界限,就会终止遍历。如果遍历过程中,修改了array的长度,则需特别注意这一点。
3.2 forEach 遍历的终止
如何中止forEach的遍历?JavaScript并未提供这样的机制,但我们可以用一个双重嵌套的异常来终止遍历。
let arr=[1, 3, 5, 7, 9];
try {
arr.forEach((element, index, array)=> {
try {
console.log(index);
if (index >=3) {
throw new Error('forEach termination signal');
}
} catch (error) {
throw error;
}
});
} catch (e) {
if (e.message==='forEach termination signal') {
console.log('forEach terminated.');
}
}
console.log('This line of code should be executed.');
显示:
0
1
2
3
forEach terminated.
This line of code should be executed.
我们设定,当index的值大于等于3时,需要终止遍历。这样,在第7行,当此条件满足时,即抛出"forEach termination signal"的异常。
此时,程序流程转入到第10行至第12行最内层的异常捕获处理代码:
} catch (error) {
throw error;
}
捕获异常后,如果我们不重新抛出异常,JavaScript引擎则会认为我们已正确地处理了异常,因此会恢复中断的遍历进程,继续处理下一个数组元素,这不是我们想要的。因此,我们在此重新抛出该异常,以切实终止遍历。
这时,forEach的遍历因异常而终止,从而达到了我们的最初的目标。但因为有异常,如果我们未作任何处理,则该异常会导致整个程序都终止运行。只有在我们处理了异常后,程序才能往下走。这就是第14行至18行最外层异常捕获代码的作用:
} catch (e) {
if (e.message==='forEach termination signal') {
console.log('forEach terminated');
}
}
先判断它是不是"forEach termination signal"。如果是,则简单地打印一行消息。由于这里未再抛出新的异常,因此JavaScript引擎认为我们已经正确地处理了异常,则继续执行后面的代码。这样,最后一行第20行语句将被执行并打印出"This line of code should be executed."的文本。
一般来讲,如果我们需要在数组的遍历过程中终止遍历,不要使用 forEach 语句,使用最传统的方式即可:
let arr=[1, 3, 5, 7, 9];
for (let i=0; i < arr.length; i++) {
console.log(i, arr[i]);
if (i >=3) {
break;
}
}
console.log('This line of code should be executed.');
这样即可在遍历中访问数组的索引值与数组元素,又可以极为方便地随时终止遍历。
JavaScript中的对象是拥有属性和方法的数据,今天小编将为大家带来大数据编程入门:JavaScript对象。
真实生活中的对象,属性和方法
真实生活中,手机是一个对象,并且有它的属性,如品牌和颜色等,方法有开机关机等。
比如对象为手机(phone),属性有:
phone.name=Redmi
phone.color=black
phone.size=6.67inch
phone.processor=phegda1200
方法有:
phone.start()
phone.working()
phone.call()
phone.stop()
所有的手机都有这些属性,但是每款手机的属性都不一样;以及所有手机都拥有这些方法,但是它们被执行的时间可能会不一样。
JavaScript对象
在JavaScript中,几乎所有的事物都是对象。
注意:在JavaScript中,对象非常重要。理解对象后,就可以理解JavaScript。
在下面的代码中变量为phone,所设置的值为”Redmi”:
var phone=“Redmi”;
一个对象也是一个变量,但是一个对象可以包含多个值(多个变量),并且每个值都以name:value的形式呈现。
var phone={name:”Redmi”,color:”black”};
在上面的示例中,两个值(“Redmi”,”black”)赋予变量phone。
注意:在JavaScript中的对象是变量的容器。
对象定义
可以在JavaScript中使用字符定义和创建对象:
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<title>Miuku</title>
</head>
<body>
<p>创建 JavaScript 对象。</p>
<p id="demo"></p>
<script>
var person={firstName:"路飞", lastName:"梦奇", age:20, eyeColor:"blue"};
document.getElementById("demo").innerHTML=
person.firstName + " 现在 " + person.age + " 岁.";
</script>
</body>
</html>
运行结果:
在JavaScript中定义对象可以跨越多行,不强制要求空格和换行:
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<title>Miuku</title>
</head>
<body>
<p>创建 JavaScript 对象。</p>
<p id="demo"></p>
<script>
var person={
firstName : "路飞",
lastName : "梦奇",
age : 20,
eyeColor : "black"
};
document.getElementById("demo").innerHTML=
person.firstName + " 现在 " + person.age + " 岁。";
</script>
</body>
</html>
运行结果:
对象属性
可以说“JavaScript对象是变量的容器”。
然而,我们通常认为“JavaScript对象是键值对的容器”。
键值对通常写为name:value(键和值用冒号分隔)。
键值对在JavaScript对象中通常称为对象属性。
注意:在JavaScript中的对象是属性变量的容器。
对象键值对的写法类似于:
PHP 中的关联数组
Python 中的字典
C 语言中的哈希表
Java 中的哈希映射
Ruby 和 Perl 中的哈希表
访问对象属性
在JavaScript中可以通过两种方式来访问对象属性:
示例1:
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<title>Miuku</title>
</head>
<body>
<p>
有两种方式可以访问对象属性:
</p>
<p>
你可以使用 .property 或 ["property"].
</p>
<p id="demo"></p>
<script>
var person={
firstName : "索隆",
lastName : "罗罗诺亚",
id : 1
};
document.getElementById("demo").innerHTML=
person.firstName + " " + person.lastName;
</script>
</body>
</html>
运行结果:
示例2:
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<title>Miuku</title>
</head>
<body>
<p>
有两种方式可以访问对象属性:
</p>
<p>
你可以使用 .property 或 ["property"]。
</p>
<p id="demo"></p>
<script>
var person={
firstName: "索隆",
lastName : "罗罗诺亚",
id : 5566
};
document.getElementById("demo").innerHTML=
person["firstName"] + " " + person["lastName"];
</script>
</body>
</html>
运行结果:
对象方法
对象的方法定义函数并作为对象的属性存储。
通过添加()调用对象方法(作为函数)。
此实例访问person对象的fullname()方法:
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<title>Miuku</title>
</head>
<body>
<p>创建和使用对象方法。</p>
<p>对象方法作为一个函数定义存储在对象属性中。</p>
<p id="demo"></p>
<script>
var person={
firstName: "索隆",
lastName : "罗罗诺亚",
id : 5566,
fullName : function()
{
return this.firstName + " " + this.lastName;
}
};
document.getElementById("demo").innerHTML=person.fullName();
</script>
</body>
</html>
运行结果:
如果要访问person对象的fullname属性,它将作为定义函数的字符串返回:
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<title>Miuku</title>
</head>
<body>
<p>创建和使用对象方法。</p>
<p>对象方法是一个函数定义,并作为一个属性值存储。</p>
<p id="demo1"></p>
<p id="demo2"></p>
<script>
var person={
firstName: "路飞",
lastName : "梦奇",
id : 9,
fullName : function()
{
return this.firstName + " " + this.lastName;
}
};
document.getElementById("demo1").innerHTML="不加括号输出函数表达式:" + person.fullName;
document.getElementById("demo2").innerHTML="加括号输出函数执行结果:" + person.fullName();
</script>
</body>
</html>
运行结果:
访问对象方法
可以使用以下语法创建对象方法:
methodName : function() {
// 代码
}
可以使用下面的语法访问对象:
objectName.methodName()
通常,fullname()是作为person对象的方法,而fullname是一个属性。
如果使用fullname属性,而不添加(),它将返回函数的定义:
objectName.methodName
有许多方法可以创建、使用和修改JavaScript对象。
同样的,还有许多方法可以创建、使用和修改属性和方法。
以上就是关于大数据编程入门:JavaScript对象的全部内容了,希望这篇文章可以帮助到大家~
*请认真填写需求信息,我们会在24小时内与您取得联系。