键值对:
概念:
键值对主要是面向对象语言里的字典,或者叫哈希表,它通过键 (key)可以直接访问到值 (value),所以它查找的时间复杂度是O (1),即一次查找即可找到目标;在.net里有Dictionary,而在java里有HashMap等结构来实现,而在NoSQL里也有redis为代表的键值存储数据库;而在js里好像没有一种哈希的数据结构,不过我们可以借助对象的概念来实现,键相当于对象里的属性,而值相当于属性的值
代码演示:
var variable = 67;
var map =
{
key 1 : 'string_val',
key 2 : variable,
'key 3': function(){alert('blah')},
'if the key is not a valid variable name, or is reserved, quote it': true
}
alert(map.key 1);
alert(map['key 2']);
map.key 3();
if( map['if the key is not a valid variable name, or is reserved, quote it'])
alert('OK?');
map对象的使用:
1.map语法:
map() 函数语法:map(function, iterable, …)
简单来说,map()它接收一个函数 f 和一个 可迭代对象(这里理解成 list),并通过把函数 f 依次作用在 list 的每个元素上,得到一个新的 list 并返回。
遍历方法
Map 结构原生提供三个遍历器生成函数和一个遍历方法。
keys()
:返回键名的遍历器。values()
:返回键值的遍历器。entries()
:返回所有成员的遍历器。forEach()
:遍历 Map 的所有成员。
代码:
<script>
// map对象:
//Map对象用来保存键值对
//在Map对象中任何值(对象或者原始值)都可以作为一个键(任何数据类)
//基本Map方法:
//new Map():创建新的Map对象
//set():为Map对象中的键设置值
//get():获取Map对象中键的值
//keys():返回Map对象中键的数组
//values():返回Map对象中值的数组
//entries():返回Map对象中键/值对的数组
//Map()属性
//Map.size:返回Map中元素的数量
//示例:
//创建对象
const blue = {name:'蓝色'};
const green = {name:'绿色'}
const yellow= {name:'黄色'};
//创建新的Map对象(new Map())
const color = new Map();
//向Map对象添加成员(set())
color.set(blue,800);
color.set(green,300);
color.set(yellow,700);
//获取Map对象中键中的值(get())
console.log(color.get(green)); // 300
//获取Map对象中键的数组(keys())
console.log(color.keys()); // MapIterator {{…}, {…}, {…}}
//获取Map对象中值的数组(values())
console.log(color.values()); // {800, 300, 700}
//获取Map对象中键/值对的数组(entries())
console.log(color.entries()) // {{…} => 800, {…} => 300, {…} => 700}
//返回Map中元素的数量(Map.size)
console.log(color.size) //3
// 其他map()方法
// clear()删除map中的所以元素
// delete()删除由键指定的元素
// has()如果键存在,则返回true
</script>
作用域:
<script>
// 作用域:
// 作用域是行时代码中某些特定部分中变量,函数和对象的可访问性
//换句话说,作用域决定了代码中变量和其他资源的可见性
function Fun(){
let a ='内层变量'
console.log(a);
}
Fun();//先执行函数
//console.log(a);
function fun () {
console.log(a);
}
fun()
//console.log(a);//a is not defined
//变量a在全局作用域没有声明,所以在全局作用域下取值会报错
//作用域就是一个独立的地盘,让变量不会外泄、暴露出去
//作用域最大的用处就是隔离变量,不同作用域下同名变量不会有冲突
//ES6之前JavaScript没有块级作用域,只有全局作用域和函数作用域
//ES6的到来,为我们提供了"块级作用域",可通过新增命令let和const来体现
函数作用域:
<script>
//【局部变量/函数作用域】
//声明在函数内部的变量,和全局作用域相反,局部作用域一般只在固定的代码片段内可)
//最常见的例如函数内部,所以在一些地方也会看到有人把这种作用域称为函数作用域,
function outFun() {
var a ='函数内部的变量';
function innerFun(){
console.log(a); //函数内部的变量
}
innerFun();
}
// console.log(a); // a is not defined
innerFun;//innerFun is not defined
outFun()
</script>
全局作用域:
<script>
// 【全局作用域】
// 在代码中任意地方都能访问到的对象拥有全局作用域。
//(即在全局作用域中定义的变量可以在任何地方使用。)
// 全局作用域在页面打开时创建,在页面关闭时销毁。
// 【情况一:所有未定义直接赋值的变量自动声明为拥有全局作用域】
function Fun1(){
a ='未定义直接赋值的变量';
var b ='内层变量';
}
Fun1();
console.log(a);//未定义直接赋值的变量
//console.log(b); //b is not defined
// 【情况二:最外层函数和最外层函数外面定义的变量拥有全局作用域】
var A = '最外层变量';//最外层变量
function outFun(){ //最外层函数
var B ='最外层函数的内层变量'
function innnerFun(){ //内层函数
var c ='内层函数的内部变量'
}
}
console.log(A);//最外层变量
//console.log(B); //B is not defined
outFun()
//innerfun(() //innerfun is not defined
//console.log(c); //c is not defined
// 【情况三:所有window对象的属性拥有全局变量】
// 在全局作用域中有一个全局对象window,他代表的浏览器的窗口,由浏览器创建。
// 一般情况下,window对象的内置属性都拥有全局作用域,例如window.name、window.location
</script>