学习JS的第8天

学习JS的第8天

一、JSON

1、什么是JSON?
  • JSON 指的是 JavaScript 对象表示法(JavaScript Object Notation)
  • JSON 是轻量级的文本数据交换格式
  • JSON 独立于语言:JSON 使用 JavaScript语法来描述数据对象,但是 JSON 仍然独立于语言和平台。JSON 解析器和 JSON 库支持许多不同的编程语言。 目前非常多的动态(PHP,JSP,.NET)编程语言都支持JSON。
  • JSON 具有自我描述性,更易理解
2、JSON的特点

JSON 是存储和交换文本信息的语法,类似 XML。

JSON 比 XML 更小、更快,更易解析。

3、JSON的两种结构

JSON有两种表示结构,分别是对象和数组。
对象结构以”{”大括号开始,以”}”大括号结束。中间部分由0或多个以”,”分隔的”key(关键字)/value(值)”对构成,关键字和值之间以”:”分隔,语法结构如代码。

数组是以中括号[]包裹一个或多个对象,即将对象放在数组中,以”[”开始,”]”结束。中间由0或多个以逗号分隔的值列表组成,

{
    key1:value1,
    key2:value2,
    ...
}
    
var shoppingData = [
				{
					"id" : 1,
					"src" : "https://cdn.cnbj1.fds.api.mi-img.com/mi-mall/5a260090e0e08770b0bd865845a4b4ab.jpg?thumb=1&w=200&h=200&f=webp&q=90",
					"name" : "小米11",
					"des" : "骁龙888 | 2K四曲面屏",
					"price" : "200"
				},
				{
					"id" : 2,
					"src" : "https://cdn.cnbj1.fds.api.mi-img.com/mi-mall/4e75e528fb468aee107f551179aa0799.jpg?thumb=1&w=200&h=200&f=webp&q=90",
					"name" : "小米11",
					"des" : "骁龙888 | 2K四曲面屏",
					"price" : "3999"
				}];
3、JSON.parse()

JSON 通常用于与服务端交换数据。

在接收服务器数据时一般是字符串。

我们可以使用 JSON.parse() 方法将数据转换为 JavaScript 对象。

语法:JSON.parse(text[, reviver])

**text:**必需, 一个有效的 JSON 字符串。

reviver: 可选,一个转换结果的函数, 将为对象的每个成员调用此函数。

例如我们从服务器接收了以下数据:
{ "name":"runoob", "alexa":10000, "site":"www.runoob.com" }
我们使用 JSON.parse() 方法处理以上数据,将其转换为 JavaScript 对象:
var obj = JSON.parse('{ "name":"runoob", "alexa":10000, "site":"www.runoob.com" }');
4、JSON.stringify()

JSON 通常用于与服务端交换数据。

在向服务器发送数据时一般是字符串。

我们可以使用 JSON.stringify() 方法将 JavaScript 对象转换为字符串。

语法:JSON.stringify(value[, replacer[, space]])

**value:**必需, 要转换的 JavaScript 值(通常为对象或数组)。

replacer: 可选。用于转换结果的函数或数组。

如果 replacer 为函数,则 JSON.stringify 将调用该函数,并传入每个成员的键和值。使用返回值而不是原始值。如果此函数返回 undefined,则排除成员。根对象的键是一个空字符串:""。

如果 replacer 是一个数组,则仅转换该数组中具有键值的成员。成员的转换顺序与键在数组中的顺序一样。当 value 参数也为数组时,将忽略 replacer 数组。

space: 可选,文本添加缩进、空格和换行符,如果 space 是一个数字,则返回值文本在每个级别缩进指定数目的空格,如果 space 大于 10,则文本缩进 10 个空格。space 也可以使用非数字,如:\t。

例如我们向服务器发送以下数据:
var obj = { "name":"runoob", "alexa":10000, "site":"www.runoob.com"};
//我们使用 JSON.stringify() 方法处理以上数据,将其转换为字符串:

var myJSON = JSON.stringify(obj);
 myJSON 为字符串。
我们可以将 myJSON 发送到服务器:

二、ES5的严格模式

1、关于严格模式

1)概念:除了正常运行模式,ECMAscript5添加了第二种运行模式:“严格模式”(strict mode)。顾名思义,这种模式是的Javascript在更严格的条件下运行。

2)严格模式的作用:

a.消除了JS语法的一些不合理、不严谨之处,减少一些怪异行为;

b.消除代码运行的一些不安全之处,保证代码运行的安全;

c.提高编译器效率,增加运行速度;

d.为未来新版本的JS做好铺垫

注意点:同样的代码,在“严格模式”中,可能会有不一样的运行结果,一些在“正常模式”下可以正常运行的语句,在“严格模式”下将不能运行,掌握这些内容,有助于更细致深入的理解JS,让你编程一个更好的程序员。

2、严格模式的调用
1、如何进入严格模式?
进入严格模式的标志,书写这一行语句 "use strict"
老的浏览器会把他当成一串普通的字符串,加以忽略

2、“严格模式”有两种调用方式,适用于不同的场合;
针对整个脚本文件:将 "use strict" 放在脚本文件的第一行,则整个脚本文件都将以“严格模式”运行,
如果这行语句不在第一行,则无效,整个脚本以“正常模式”运行。
如果不同模式的代码文件合并成一个文件,这一点需要特别注意。

针对单个函数:将 "use strict" 放在函数的第一行,则整个函数以“严格模式”运行。

脚本文件的变通写法:因为第一种调用方式不利于文件合并,所以更好的做法是,借用第二种方法,将整个脚本文件放在一个立即执行的匿名函数中

3、严格模式下的改变
进入严格模式之后,需要进行哪些行为变更:

1.全局变量声明时,必须加关键字(var)
正常模式:a = 10;    console.log(a)    //10
严格模式:a = 10;    console.log(a)    //a is not defined

2.this无法指向全局对象
正常模式:function fn(){ console.log(this) }        //window
严格模式:function fn(){ console.log(this) }        //undefined

3.函数内不允许出现重名参数
正常模式:function fn( a,b,b ){ console.log(a,b) }
fn(1,2,3)        //1,3
严格模式:function fn( a,b,b ){ }
//报错:Duplicate parameter name not allowed in this context    在此上下文中不允许出现重复的参数名

4.arguments对象
4.1 arguments对象不允许被动态改变
正常模式:
function fn(a){
    a=20;
    console.log(a);                //20
    console.log(arguments[0]);     //20
}
fn(10);

严格模式:
function fn(a){
    a=20;
    console.log(a);                //20
    console.log(arguments[0]);     //10
}
fn(10);

5、不允许使用arguments.callee


6.新增的保留字:implementsinterfaceletpackageprivateprotectedpublicstaticyield

三、ES5新增的数组方法

1、indexOf(data,start)接收两个参数:要查找的项和(可选的)表示查找起点位置的索引 

2、forEach() 循环  对数组进行遍历循环,对数组中的每一项运行给定函数。这个方法没有返回值

3、map(callback) ; 会遍历当前数组,然后调用参数中的方法,返回当前方法的返回值。
map可以改变当前循环的值,返回一个新的被改变过值之后的数组(map需return),一般用来处理需要修改某一个数组的值。映射
 
4、filter() 遍历和过滤。返回符合条件的元素的数组。filter需要在循环的时候判断一下是true还是false,是true才会返回这个元素。 
//1、indexOf(data,start)接收两个参数:要查找的项和(可选的)表示查找起点位置的索引 
//注意点:
//a、如果没有找到,就返回-1
//b、indexOf查找到的是第一次数组元素出现的位置
//c、indexOf也可以给字符串使用
			var arr = ['张三', '李四', '王麻子', '张三', '张姨', '张小帅', '张三'];
			//返回的是数组元素的下标的位置
			var res = arr.indexOf('张三', 1);
              console.log(res); // 3
//2、forEach() 循环  对数组进行遍历循环,对数组中的每一项运行给定函数。这个方法没有返回值
//注意点:forEach()没有返回值
//不支持 continue,用 return  代替。
//不支持 break,用 try catch/every/some 代替:

	var arr = ['a', 'b', 'c', 'd'];
	//参数1表示数组元素,参数2表示下标  参数3表示当前元素所属的数组对象(arr)。
	arr.forEach(function(items, index, arr){
		console.log(items);
	});
//continue 的实现 用return来实现该效果
var arr = [1, 2, 3, 4, 5];

arr.forEach(function (item) {
    if (item === 3) {
        return; //不能为false 否则返回false
    }
    console.log(item);
});

//break的实现
var arr = [1, 2, 3, 4, 5];

arr.every(function (item) {
        console.log(item);
        return item !== 3;
});
结果: 1 2 3 false
//map() 方法返回一个新数组,数组中的元素为原始数组元素调用函数处理后的值。
//map() 方法按照原始数组元素顺序依次处理元素。
注意: map() 不会对空数组进行检测。
	  map() 不会改变原始数组 	
var arr = [1, 2, 3, 6, 8, 10, 12];
			//参数1表示数组元素,参数2表示下标
			var res = arr.map(function(items, index){
				return items *= (1+0.3);
			})
			console.log(res);
			console.log(arr);
//map() 不会改变原始数组 仅针对基本数据类型!!! 引用数据类型会发生改变!!!
var infoArr = [
				{name : '', age : 46, sex : '男', like : '抹茶'},
				{name : 'jack马', age : 52, sex : '男', like : '福报'},
				{name : 'pony马', age : 48, sex : '男', like : '钱'}
			];
			var res = infoArr.map(function(items, index){
				return items.age += 10;
				// return items.like;  也不会发生改变,数据上处理会改变
			})
			console.log(res);
			console.log(infoArr); //打印会发现 age 已经被改变了
// filter() 遍历和过滤。返回符合条件的元素的数组。filter需要在循环的时候判断一下是true还是false,是true才会返回这个元素。 不改变原数组
var arr = [10, 20, 22, 36, 71];
var res = arr.filter(function(items, index){
	return items > 20;
		//return items == 20;
			})
console.log(res); // 22 36 71
console.log(arr);//10, 20, 22, 36, 71

//数组去重

var arr = ['a', 'a', 'a', 'c', 'b', 'c', 2, 3, 2, 2, 6, 6];
var res = arr.filter(function(items, index){
    console.log(index, items);
	return arr.indexOf(items) == index;
    });
   console.log(res);

四、this对象

​ 解析器在调用函数每次都会向函数内部传递进一个隐含的参数,这个隐含的参数就是this,this指向的是一个对象。
这个对象我们称为函数执行的上下文对象,
根据函数的调用方式的不同,this会指向不同的对象
​ 1.以函数的形式调用时,this永远都是window 例如 fn();
​ 2.以方法的形式调用时,this就是调用方法的那个对象

//练习
function fn(){
 console.log(this);
 }
 //当函数名+括号调用函数的时候,this指向window
 fn();
//this 指向了接收事件的 HTML 元素:		 
 var box = document.getElementById('box');
 box.onclick = function(){
	 console.log(this);  //id为box的标记
     
  //严格模式下函数是没有绑定到 this 上,这时候 this 是 undefined。
"use strict";
function myFunction() {
  return this;
}

<!--在 HTML 事件句柄中,this 指向了接收事件的 HTML 元素:-->
 <button onclick="this.style.display='none'">
点我后我就消失了
</button>

五、字符串

1、字符串的对象概念:

字符串就是一串字符,由双(单)引号括起来。字符串是 JavaScript 的一种基本的数据类型。字符串不能进行算术运算,只能进行“连接”运算。

JS中的任何数据类型都可以当作对象来看。所以string既是基本数据类型,又是对象。

2、字符串的创建
1, 直接使用字符串字面量去创建

   var str1 = “亲, 包邮哦!;

   alert(typeof str1);

2, 通过new创建字符串对象, 通过new创建的都为object类型

   var str2 = new String(“hello world!);

   alert(typeof str2);

3, 省略new, 这种方式创建的不是object类型, 而是string类型

   var str3 = String(“hello world”);  包装类

   alert(typeof str3);
3、字符串的属性和方法
1)length:获取字符串的长度。如:var len=strObj.length;

2)toLowerCase():将字符串中的字母转成全小写。如:strObj.toLowerCase();

3)toUpperCase():将字符串中的字母转成全大写。如:strObj.toUpperCase()4)charAt(index):返回指定下标位置的一个字符。如果没有找到,则返回空字符串; 参数是下标

//关于charAt(index) 和 通过名字[下标]访问的影响
//4)charAt(index):返回指定下标位置的一个字符。如果没有找到,则返回空字符串; 参数是下标
//[]中括号加下标的形式,在低版本的浏览器里面是不支持的 --- 没错就是IE
			var str = 'hello';
			console.log(str.charAt(0));
			console.log(str[0]);
5)indexOf:返回一个字符串在原始字符串中的索引值(查找顺序从左往右查找)。如果没有找到,则返回-1;

例子:判断用户输入的邮箱地址是否有@符号

6)lastIndexOf:在原始字符串中,从右往左查找。如果没有找到,则返回-18)substring():在原字符串,返回一个字符串;不取结束位置,不能给负值会转成0 

注点意:参数是下标 
9)split():将一个字符串切割成若干段,返回一个数组。也就是说将一个字符串转成数组;括号里面可以给空字符串, 会把字符串切割成几份
var res = str.split("");

10)slice():提取字符串的片断,并在新的字符串中返回被提取的部分;不包括结束位置。给负值时,可以返回倒数第几个
var res = str.slice(0, 3);

11)trim():移除字符串首尾空白;

12)concat():连接两个或多个字符串,返回连接后的字符串

13)replace() 替换与正则表达式匹配的子串。不改变原数组   //可用于敏感字符替换

14)substr()	从起始索引号提取字符串中指定数目的字符。参数1表示起始位置  、值2表示截取的项数

15)charAt() 方法可返回指定位置的字符。 
五、编码介绍
ASCII:American Standard Code for Information Interchange,美国信息交换标准代码。

在这里插入图片描述

百度

Unicode(统一码、万国码、单一码)是计算机科学领域里的一项业界标准,包括字符集、编码方案等。Unicode 是为了解决传统的字符编码方案的局限而产生的,它为每种语言中的每个字符设定了统一并且唯一的二进制编码,以满足跨语言、跨平台进行文本转换、处理的要求。 Unicode目前普遍采用的是UCS-2,它用两个字节来编码一个字符。 如汉字”经”的编码是0x7ECF,注意字符码一般用十六进制来 表示,为了与十进制区分,十六进制以0x开头,0x7ECF转换成十进制 就是32463,UCS-2用两个字节来编码字符,两个字节就是16位二进制, 2的16次方等于65536,所以UCS-2最多能编码65536个字符。

GBK全称《汉字内码扩展规范》(GBK即“国标”、“扩展”汉语拼音的第一个字母,英文名称:Chinese Internal Code Specification)。

GBK 向下与GB2312编码兼容,向上支持 ISO 10646.1国际标准,是前者向后者过渡过程中的一个承上启下的产物。

UTF-8(8-bit Unicode Transformation Format)是一种针对Unicode的可变长度字符编码,又称万国码。 UTF-8用1到4个字节编码UNICODE字符。用在网页上可以同一页面显示中文简体繁体及其它语言(如英文,日文,韩文)。

知识补充:

回调函数:如果把函数的指针(地址)作为参数传递给另一个函数,当这个指针被用来调用其所指的函数时,我们就说这是回调函数。

//回调函数:把函数自己当成一个参数给另一个函数使用,称之为回调函数,当函数执行完毕后再去执行回调
function add(num1, num2){
	return num1 + num2;
}
function sub(num1, num2){
	return num1 - num2;
}
function mul(num1, num2){
	return num1 * num2;
}
function div(num1, num2){
	return num1 / num2; 
}
//总的方法  callback表示回调函数
function calc(num1, num2, callback){
	// function add(){
	// 	return num1 + num2;
	// }
	return callback(num1, num2);
}
var res = calc(10, 20, mul);
console.log(res);

练习:

1、敏感字符的替换    
   var str = '色哈哈';
   var res = str.replace('色', '*');
   console.log(res);

2、已知字符串 str =I hate BeiJing!,提取第3个字符到第5个字符
    var  str = "I hate BeiJing!";
	console.log(str.slice(3,6)); //ate
	console.log(str.substr(3,3)); //ate
3、统计含有a或A的字符串个数  
 
    var countryList=["America","Greece","Britain","Canada","China","Egypt"];
		 var c = 0 ;
		 for(var i  in  countryList){
			 if(countryList[i].indexOf("a")!=-1 || countryList[i].indexOf("A") != -1){
				 console.log(countryList[i]);
				 c++;
			 }
		 }
		 console.log("含有a或A的字符串有"+c+"个");

4统计字符串字符串个数
var str = 'aabbcddeeettccc';
			//使用一个对象去统计字符串的个数,可以把字符串元素当成对象的属性,个数当成属性的值
			var obj = {};
			//遍历字符串元素
			for(var i=0; i<str.length; i++){
				//判断下空的对象里面有没有这个字符串元素,如果有就把它的值++
				//如果没有这个字符串元素,把它添加到空对象里面并给其赋值
				//str[i] ---> str[0]---> a
				//obj['a'] 表示判断这个空对象里面有没有a这个字符串元素
				
				//str[0] a
				//obj['a']
				// ''
				//obj['a'] = 1 ---> 1++  --->2
				
				if(obj[str[i]]){
					obj[str[i]]++;
				}else{
					//obj['a'] = 1
					//obj['b'] = 1
					obj[str[i]] = 1;
				}
			}
			console.log(obj);
  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值