DNS | Array | Object | Map | Set | iterable ---[廖雪峰老师js教程笔记]

一.DNS协议
1.DNS提供什么服务?——域名与IP地址之间的解析服务(正逆均可)。

2.DNS存在的原因?——对于计算机而言,它更擅长通过一长串数字(IP地址)来访问对方的计算机;而对于人类来说,字母+数字的组合更方便记忆,因此用户使用主机名或域名来访问对方的计算机。

这里写图片描述

【廖雪峰老师的JavaScript教程】
https://www.liaoxuefeng.com/wiki/001434446689867b27157e896e74d51a89c25cc8b43bdb3000

二.基本知识点
1.ECMAScript是一种语言标准,而JavaScript是网景公司对ECMAScript标准的一种实现。

2.为什么不直接将JavaScript作为一种标准?因为JavaScript是网景的注册商标。

3.没有必要显式设置<script>标签的属性:type ="text/javascript"的原因?因为默认的type就是JavaScript。

4.出于浏览器的安全限制,以file://开头的地址无法执行如联网等JavaScript代码;需要架设一个Web服务器,然后以http://开头的地址来正常执行所有JavaScript代码。

5.遇到过多的嵌套,可以将部分代码抽离出来,作为函数来调用,从而减少代码的复杂度。

6.计算机:可以做数学计算的机器。

7.0/0 //NaN(Not a Number)

8.唯一能判断NaN的方法是通过isNaN()函数—-isNaN(NaN); //true

9.浮点数在运算过程中会产生误差,因为计算机无法精确表示无限循环小数。

    1 / 3 === (1 - 2 / 3);    //false
    Math.abs(1 /3 - (1 - 2 /3)) < 0.000001;   //true

10.null表示一个”空”的值 ; 0表示一个数值 ; ''表示长度为0的字符串。undefined表示"未定义"。null适用于大多数情况下,undefined仅仅在判断函数参数是否传递的情况下使用。

11.数组是一组按顺序排列的集合,集合的每个值成为元素。JavaScript的数组可以包括任何数据类型。

12.JavaScript的对象是一组由键-值对组成的无序集合。

13.在JavaScript中,使用等号=对变量进行赋值。可以将任意数据类型赋值给变量,同一个变量可以反复赋值,而且可以是不同类型的变量。

    var a = true;
    a = 'yyc';
    a = null;
    a;//null

14.动态语言:变量本身的数据类型不固定的语言。

15.转义字符存在的原因?因为JavaScript的字符串是由单引号或双引号括起来的字符表示的。如果要呈现出字符串内部的单引号或者双引号,则需要使用转义字符\。”一词多义”—为常规的”字符”赋予特殊的含义。如:

var way1 = "l'm a boy";
var way2 = 'l\'m a boy';
'\u4e2d\u6587';    //"中文"

16.

alert(`
1
2
3
4`);

//反引号
//output:

1
2
3
4

17.模板字符串

var name = 'Gerg';
var age = 21;
var message = '你好,' + name + ',你今年' + age + '岁了!';
console.log(message);//你好,Gerg,你今年21岁了!


var name = 'Gerg';
var age = 21;
var message = `你好,${name},你今年${age}岁了!`;
console.log(message);//你好,Gerg,你今年21岁了!

18.字符串是不可变的:

var s = 'test';
s[0] = 'y';
console.log(s);//"test"

19.JavaScript为字符串提供了一些常用的方法,调用这些方法不会改变原始字符串的内容,而是返回一个新的字符串。

a) toUpperCase()---把一个字符串全部变为大写
b) toLowerCase()---把一个字符串全部变为小写
c) indexOf()---搜素指定字符串出现的首个位置:
    var s = 'Hello world';
    s.indexOf('l');//2
    s.indexOf('L');//-1
d)substring()返回指定索引区间的子串:
    var s = 'Hello world';
    s.substring(0,4);//"hell"----[0,4)
    s.substring(4);//"o world"----[4,end]

三.数组(Array)

1.直接给Array的length赋一个新的值会改变Array:

    var arr = [1,2,3];
    arr.length;//3
    arr.length = 5;
    arr;//[1,2,3,undefined,undefined]
    arr.length = 2;
    arr;//[1,2];

2.Array可以通过索引将对应的元素修改为新的值:

    var arr = [1,2,3];
    arr[1] = 'y';
    arr;//[1,'y',3];
    arr[4] = 'c';
    arr;//[1,'y',3,undefined,'c']

3.但在编写代码的时候,不建议直接修改Array的大小,访问索引时要确保索引不会越界。

4.与String类似,Array也可以通过indexOf()来搜索一个指定的元素出现在数组中的首个位置:

    var arr = ['y','y','c'];
    arr.indexOf('y');//0
    arr.indexOf(1);//-1---因为,数组中不存在数值1这个元素

5.数组的slice()方法就是对象String的substring()方法,截取Array的部分元素,然后返回一个新的Array:

var s1 = 'Hello world';    
var arr;
arr = s1.split('');//["H", "e", "l", "l", "o", " ", "w", "o", "r", "l", "d"]
arr.slice(3,7);
//[3,7)
//(4) ["l", "o", " ", "w"]
arr.slice(7);
//[7,end]
/(4) ["o", "r", "l", "d"]

6.如果不给slice()传递任何参数,它就会从头到尾截取数组中的所有元素。—使用这个特性,可用来复制一个Array。

var arr = [1,2,3,4,5,6];
var aCopy = arr.slice();
aCopy;
//(6) [1, 2, 3, 4, 5, 6]

7.push() | pop()

1.push()向Array末尾添加若干元素:
    var arr = [1,2,3];
    arr.push('y','y','c');//6
    arr;
    //(6) [1, 2, 3, "y", "y", "c"]
2.pop()把Array的最后一个元素删掉:
    var arr = [1,2];
    arr.pop();//2
    arr;//[1]
    arr.pop();//1
    arr;//[]
    arr.pop();//undefined
    arr;//[]

8.unshift() | shift()

1.unshift()向Array头部添加若干元素:
    var arr = [1,2,3];
    var arr2 = arr.unshift('y','y','c');
    arr2;//6
    arr;
    //(6) ["y", "y", "c", 1, 2, 3]

2.shift()将Array的第一个元素删掉:
    var arr = [1,2,3];
    arr.shift();
    arr;
    //[2,3]

9.sort()

1.sort()对当前Array进行排序,它会直接修改当前Array的元素的位置。
var arr = ['b','a','c'];
arr.sort();
arr;//["a", "b", "c"]

10.reverse()

var arr = [1,2,3];
arr.reverse();
arr;//[3, 2, 1]

11.splice()—-修改Array的”万能方法”

1.删除---指定(位置 + 数量)
var arr = [0,1,2,3,4,5];
//删除数组中的三个元素,其索引值为2,3,4
arr.splice(2,3);//[2,3,4]---删除
arr;//[0, 1, 5]

2.不光删除,还能添加若干元素:
var arr = [0,1,2,3,4,5];
arr.splice(2,3,'y',true);//[2, 3, 4]---删除
arr;//[0, 1, "y", true, 5]

3.不删,只加
var arr = [0,1,2,3,4,5];
arr.splice(2,0,'add');//[]
arr;[0, 1, "add", 2, 3, 4, 5]

12.concat()

这里写图片描述

要使当前Array与另一个Array连接起来,使用concat():
var arr1 = [1,2];
var arr2 = [3,4];
var add = arr1.concat(arr2);
add;//[1, 2, 3, 4]

//concat()方法并没有修改arr1,而是返回一个新的Array.
arr1;
//(2) [1, 2]
arr2;
//(2) [3, 4]


concat()方法可以接受任意个元素和Array,并自动把Array拆开,然后全部添加到新的Array里:
var arr = [1,2,3];
arr.concat([true,'y'],null,'string');
//[1, 2, 3, true, "y", null, "string"]
arr;//[1,2,3]

13.join()

1.join()方法将当前Array的每个元素都用指定的字符串连接起来,然后返回连接后的字符串:
var arr = ['y','y','c',1,2,3];
arr.join('--');//"y--y--c--1--2--3"
arr;//["y", "y", "c", 1, 2, 3]---并没有改变原始数组

2.如果Array中的元素不是字符串,将自动转换为字符串后再连接。

14.多维数组—数组中某个元素也是数组

var arr = [[1,2,3],['y','y','c'],'-'];
arr[1][2];//"c"

四. 对象

1.若对象的属性名中存在特殊字符,就必须用单或双引号将其括起来,同时必须用[‘string’]的方式来访问该属性。不过,为了方便起见,属性名尽量使用标准的变量名,直接通过点表示法来访问一个属性。

var Person = {
    name: 'Gerg',
    'nominal-age':22
};
Person.name;//"Gerg"
Person.nominal-age;
//VM239:1 Uncaught ReferenceError: age is not defined
Person['nominal-age'];//22

2.可以用in操作符检测该对象中是否存在某一属性

var Person = {
    name: 'Gerg',
    age: 21
};
'name' in Person;//true
//如果in判断一个属性存在,这个属性不一定就是该对象的,它可能是该对象继承而来的:
'toString' in Person;//true

3.判断一个属性是该对象本身拥有的还是继承而来的,可使用hasOwnProperty()方法:

var Person = {
    name: 'Gerg',
    age: 21
};
Person.hasOwnProperty('age');//true
Person.hasOwnProperty('toString');//false

五. 条件判断

1.if…else…语句执行的特点是二选一.

2.JavaScript将null,undefined,0,NaN和空字符串''视为false,其他值一概为true.

Boolean(null);
//false
Boolean(undefined);
//false
Boolean(0);
//false
Boolean(NaN);
//false
Boolean('');
//false

3.for…in循环,可以把一个对象中的所有属性依次循环出来:

var Person = {
    name: 'Gerg',
    age: 21,
    city: 'Shanghai'
};
for(var key in Person){
    console.log(key);
}
>>>
name
age
city

想要过滤掉对象的继承属性,可用hasOwnProperty()来实现:

var Person = {
    name: 'Gerg',
    age: 21,
    city: 'Shanghai'
};
for(var key in Person){
    if(Person.hasOwnProperty(key)){
        console.log(key);
    }
}
>>>
name
age
city

5.当对象为Array时:

var person = ['Gerg',21,'Shanghai'];
//下列表示方式仅用于理解
var Person ={
    0:'Gerg',
    1:21,
    2:'Shanghai'
};

for(var i in person){
    console.log(i);
}
>>>
"0"
"1"
"2"

for(var i in person){
    console.log(person[i]);
}
>>>
"Gerg"
"21"
"Shanghai"

//for...in对Array的循环得到的是String而不是Number

6.while—条件满足,不断循环; 否则,退出循环。

//从小[1]到大[99]
var sum = 0;
var i = 1;
while(i < 100){
    sum += i;
    i = i + 2;
}
console.log(sum);//2500

//从大[99]到小[1]
var sum = 0;
var i = 99;
while(i > 0){
    sum += i;
    i = i -2;
}
console.log(sum);//2500

//for循环
var sum = 0;
for(var i = 1;i < 100;i = i + 2){
    sum += i;
}
console.log(sum);//2500

var sum = 0;
for(var i = 99;i > 0;i = i - 2){
    sum += i;
}
console.log(sum);//2500

7.do…while—先斩后奏型—先执行一次大括号中的语句,再检测判断条件。

var n = 0;
do{
    n++;
}while(n < 100);
console.log(n);//100

8.

//for---正序
var arr = ['yyc','asan','pangzi'];
for(var i = 0;i < arr.length;i++){
    console.log(arr[i]);
}
>>>
yyc
asan
pangzi


//for---逆序
var arr = ['yyc','asan','pangzi'];
for(var i = arr.length-1;i > -1;i--){
    console.log(arr[i]);
}
>>>
pangzi
asan
yyc


//while---正序
var arr = ['yyc','asan','pangzi'];
var i = 0;
while(arr[i]){
    console.log(arr[i]);
    i++;
}
>>>
yyc
asan
pangzi


//while---逆序
var arr = ['yyc','asan','pangzi'];
var i = arr.length;
while(arr[i-1]){
    console.log(arr[i-1]);
    i--;
}
>>>
pangzi
asan
yyc

六 Map | Set

1.Map

1.是什么?Map是一组键值对的结构,具有极快的查找速度。

2.为什么存在?对象的属性(键)必须是字符串。但是Number或其他数据类型作为键也是合理的。

2.使用Array实现:根据同学的姓名来查找对于的成绩

常规方法:两个Array,一个保存姓名,一个保存成绩。
    var names = ['yyc','asan','tuhao'];
    var scores = [90,95,100];

Map实现
    var m = new Map([['yyc',90],['asan',95],['tuhao',100]]);
    m.get('asan');//95

3.Map拥有的方法:增(set) | 删(delete) | 判(has) | 查(get)

var m = new Map();
m.set('yyc',66);
//Map(1) {"yyc" => 66}
m.set('asan',88);
//Map(2) {"yyc" => 66, "asan" => 88}
m.has('yyc');//true
m.get('yyc');//66
m.delete('yyc');//true
m.get('yyc');//undefined

4.由于一个key只能对应一个value,因此多个value存入一个key,”长江后浪推前浪”

var m = new Map();
m.set('yyc','前浪');
m.set('yyc','后浪');
m.get('yyc');//"后浪"

5.Set与Map类似,也是一组Key的集合,但不存储value。由于Key不能重复,所以可用Set去重。

function dedup(arr){
    return Array.from(new Set(arr));
}
dedup([1,2,3,4,3,2,1]);
//[1, 2, 3, 4]

6.Set对象的方法:

var s = new Set([1,2,3,3,3,'3']);
s;
//Set(4) {1, 2, 3, "3"}

s.add(4);
s;
Set(5) {1, 2, 3, "3", 4}

s.add(4);
s;
Set(5) {1, 2, 3, "3", 4}

s.delete('3');
//true
s;
//Set(4) {1, 2, 3, 4}

七 iterable(迭代的,遍历的)

1.Array | Map | Set 都属于iterable类型。

2.具有iterable类型的集合可以通过新的for…of循环来遍历。

//Array
var a = ['a','b','c'];
for(var i of a){
    console.log(i);
}
>>>
a
b
c


//Map
var m = new Map([['yyc',90],['asan',95],['tuhao',100]]);
for(var i of m){
    console.log(i);
}
>>>
(2) ["yyc", 90]
(2) ["asan", 95]
(2) ["tuhao", 100]


//Set
var s = new Set(['A','B','C']);
for(var i of s){
    console.log(i);
}
>>>
A
B
C

3.for…in | for…of 区别?

var a = ['a','b','c'];
a.name = 'Gerg';
for(var i in a){
    console.log(i);
}
>>>
0
1
2
name

console.log(a.length);//3


***而for...of循环只循环集合本身的元素
var a = ['a','b','c'];
a.name = 'Gerg';
for(var i of a){
    console.log(i);
}
console.log(a.length);
>>>
a
b
c
3

4.更好的方式:使用iterable内置的forEach方法,接收一个函数,每次迭代都自动回调该函数。

//Array
var a = ['a','b','c'];
a.forEach(function(element,index,array){
    console.log(element);
});
>>>
a
b
c

var a = ['a','b','c'];
a.forEach(function(element,index,array){
    console.log(index);
});
>>>
0
1
2

var a = ['a','b','c'];
a.forEach(function(element,index,array){
    console.log(array);
});
>>>
["a", "b", "c"]
["a", "b", "c"]
["a", "b", "c"]


//Set
var s = ['A','B','C'];
s.forEach(function(element,set){
    console.log(element);
});
>>>
A
B
C

var s = ['A','B','C'];
s.forEach(function(element,set){
    console.log(set);
});
>>>
0
1
2


//Map
var m = new Map([['yyc',90],['asan',95],['tuhao',100]]);
m.forEach(function(value,key,map){
    console.log(value);
});
>>>
90
95
100

var m = new Map([['yyc',90],['asan',95],['tuhao',100]]);
m.forEach(function(value,key,map){
    console.log(key);
});
>>>
yyc
asan
tuhao

var m = new Map([['yyc',90],['asan',95],['tuhao',100]]);
m.forEach(function(value,key,map){
    console.log(map);
});
>>>
Map(3) {"yyc" => 90, "asan" => 95, "tuhao" => 100}
Map(3) {"yyc" => 90, "asan" => 95, "tuhao" => 100}
Map(3) {"yyc" => 90, "asan" => 95, "tuhao" => 100}
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值