25JSON ES5 ES5新增方法实现去重

25JSON ES5 ES5新增方法实现去重

一、JSON

JSON

JSON 指的是 JavaScript 对象表示法(JavaScript Object Notation)
JSON和JS对象的格式是一样的,只不过JSON字符串中的属性名必须加双引号

特点

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

使用JSON

JS中的对象只有JS自己认识,其他语言都不识别。JSON就是一种特殊的字符串,
这个字符串可以被任意的语言所识别,并且可以转为其他语言中的对象,
JSON主要用于数据交换

JSON的分类

- 对象表示	{}

var obj = '{"name" : "张三", "sex" : "男", "age" : 18}'

- 数组表示	[]

var arr = '[1, 2, 3, 4, 5]'

JSON里面能设置的值的类型有:字符串、数值、布尔值、null、对象、数组,
不能是函数,因为其他语言不能识别

JSON转对象的方法

JSON.parse()	可以将JSON字符串转为JS对象

JS对象转JSON的方法

JSON.stringify()	可以将JS对象转为JSON字符串

二、ES5严格模式

除了正常运行模式,SCMAscript5添加了第二种运行模式:“严格模式”。顾名思义,这种模式是javascript在更严格的条件下运行。

作用

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

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

- 提高编译器效率,增加运行速度

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

注意

同样的代码,在"严格模式"中,可能会有不一样的运行结果,一些在"正常模式"下可以正常运行的语句,在"严格模式"下将不能运行,掌握这些内容,有助于更细致深入的了解JS

三、严格模式的调用

进入严格模式的标志,书写一行语句
"use strict"
但是老的浏览器会把他当做一串普通的字符串,加以忽略

"严格模式"有两种调用方式,适用于不同的场合
- 针对整个脚本文件,将"use strict"放在脚本文件的第一行,
- 则整个脚本文件都将以"严格模式"运行
	如果这行语句不在第一行,则无效,整个脚本以"正常模式"运行

如果不同模式的代码合并成一个文件
- 针对单个函数,将"use strict"放在函数的第一行,则
	整个函数以"严格模式"运行
- 脚本文件的变通写法,因为第一种调用方式不利于文件合并,
	所以更好的做法是,借用第二种方法,
	将整个脚本文件放在一个立即执行的匿名函数中

四、进入严格模式的变化

进入严格模式之后,会发生一些改变

全局变量声明时,必须加关键字var
- 正常模式下不加关键字var不会有影响
- 严格模式下不加关键字var会报错	//is not a defiend

this无法指向全局变量
- 正常模式:function fn(){ console.log(this) }	//window
- 严格模式:function fn(){ console.log(this) }	//undefiend

函数内部允许重名参数
- 正常模式:
	function fn( a,b,b ){ console.log(a,b) }
	fn(1, 2, 3)		//1, 3
- 严格模式:
	function fn( a,b,b ){ console.log(a,b) }
	fn(1, 2, 3)		
	//Duplicate parameter name not allowed in this context

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)

不允许使用arguments.callee
	arguments.callee是所在函数的函数名

新增的保留字:implements,interface,let,package,
	private,protected,public,static,yield

五、ES5新增数组的方法

- indexOf(data,start)
	接收两个参数,要查找的项和表示查找起始位置的索引
    
- forEach()循环
    对数组进行遍历循环,对数组中的每一项运行给定函数,这个方法没有返回值
    
- map(callback)
	会遍历当前数组,然后调用参数中的数组(map和return),
	一般用来处理需要修改某一个数组的值
    
- filter()
	遍历和过滤,返回复合条件的元素的数组,filter需要在循环的时候判断
	是true还是false,是true才会返回这个元素

举例

//创建数组
var arr = [
    {
        name: "张三",
        age: 18,
        sex: "男"
    },
    {
    	name:"李四",
        age: 19,
        sex: "男"
    },
    {
        naem: "王麻子",
        age: 20,
        sex: "男"
    }
]


//遍历
arr.forEach(function(item){
    console.log(item)
})
//{name: '张三', age: 18, sex: '男'}
//{name: '李四', age: 19, sex: '男'}
//{naem: '王麻子', age: 20, sex: '男'}


//遍历,可以使用返回值
res = arr.map(function(item){
    return item
})
console.log(res)
//{name: '张三', age: 18, sex: '男'}
//{name: '李四', age: 19, sex: '男'}
//{naem: '王麻子', age: 20, sex: '男'}


//筛选对象
res = arr.filter(function(item){
    return item.age >=19
})
console.log(res)
//{name: '李四', age: 19, sex: '男'}
//{naem: '王麻子', age: 20, sex: '男'}

六、使用ES5新增数组的方法实现去重

//创建数组
var arr = [1, 1, 2, 3, 1, 2, 5, 5, 2, 1, 3]

//要想筛选,必须使用filter()
res = arr.filter(function (item, index) {
    //当属性的下标与这个属性的起始位置的下标相等,
    //就说明这个数是第一次出现,没有重复,否则就不返回
	return arr.indexOf(item) == index
})
//打印去重后的结果
console.log(res)
//[1, 2, 3, 5]
上一篇:iframe异步加载技术及性能


下一篇:【精品教程】Java开发实例——网络五子棋游戏文档分享