JSON格式
JSON 格式(JavaScript Object Notation 的缩写)是一种用于数据交换的文本格式,2001年由 Douglas Crockford 提出,目的是取代繁琐笨重的 XML 格式。
JavaScript 对象的字面量写法只是长的像 JSON 格式数据,二者属于不同的范畴,JavaScript 对象中很多类型(函数、正则、Date) JSON 格式的规范并不支持,JavaScript 对象的字面量写法更宽松。
一、JSON格式规定
- 复合类型的值只能是数组或对象,不能是函数、正则表达式对象、日期对象。
-
简单类型的值只有四种:字符串、数值(必须以十进制表示)、布尔值和
null
(不能使用NaN
,Infinity
,-Infinity
和undefined
)。 - 字符串必须使用双引号表示,不能使用单引号。
- 对象的键名必须放在双引号里面。
- 数组或对象最后一个成员的后面,不能加逗号。
合格范例如下:
["one", "two", "three"]
{ "one": 1, "two": 2, "three": 3 }
{"names": ["张三", "李四"] }
[ { "name": "张三"}, {"name": "李四"} ]
需要注意的是,空数组和空对象都是合格的 JSON 值。
二、stringify()与parse()
-
JSON.stringify
方法用于将一个值转为字符串。该字符串符合 JSON 格式,并且可以被JSON.parse
方法还原。 - 对于原始类型的字符串,
JSON.stringify
转换结果会带双引号。如果原始对象中,有一个成员的值是undefined
、函数或 XML 对象,这个成员会被过滤;如果数组的成员是undefined
、函数或 XML 对象,则这些值被转成null
;正则对象会被转成空对象。 - 如果传入的字符串不是有效的JSON格式,
JSON.parse
方法将报错。
数组操作
一、基本方法
- 创建数组:
var a = [1,2,3];
- 删除数组:
delete a[2];
二、堆栈方法
pop
和push
能够让我们使用堆栈那样先入后出使用数组:
var a = [1, 2, 3];
a.push(4);
console.log(a);//[1, 2, 3, 4]
console.log(a.length);//4
console.log(a.pop());//4
console.log(a); //[1, 2, 3]
console.log(a.length);//3
三、队列方法
shift
方法可以删除数组index最小元素,并使后面元素index都减一,length也减一,这样使用shift/push就可以模拟队列了,对应的有一个unshift
方法,用于向数组头部添加一个元素:
var a=[1, 2, 3];
a.unshift(4);
console.log(a);//[4, 1, 2, 3]
console.log(a.length);//4
console.log(a.shift());//4
console.log(a); //[1, 2, 3]
console.log(a.length);//3
四、splice方法
JavaScript提供了一个splice
方法用于一次性解决数组添加、删除(这两种方法一结合就可以达到替换效果),方法有三个参数:
- 开始索引
- 删除元素的位移
- 插入的新元素,当然也可以写多个
splice
方法返回一个由删除元素组成的新数组,没有删除则返回空数组。
var a = [1, 2, 3, 4, 5];
console.log(a.splice(1,3));//[2, 3, 4]
console.log(a.length);//2
console.log(a);//[1,5]
var a = [1,2,3,4,5];
a.splice(1,0,9,99,999);
console.log(a.length); //8
console.log(a);//[1, 9, 99, 999, 2, 3, 4, 5]
a.splice(1,3,8,88,888);
console.log(a.length);//8
console.log(a);//[1, 8, 88, 888, 2, 3, 4, 5]
五、常用方法
-
join(char)
:作用是把数组元素(对象调用其toString()方法)使用参数作为连接符连接成一字符串,不会修改原数组内容:
var a = [1,2,3,4,5];
console.log(a.join(',')); //1,2,3,4,5
console.log(a.join(' ')); //1 2 3 4 5
-
slice[start, end]
:用于返回数组中一个片段或子数组,如果只写一个参数返回参数到数组结束部分,如果参数出现负数,则从数组尾部计数(如-3即数组倒第三个),如果start大于end返回空数组,值得注意的一点是slice不会改变原数组,而是返回一个新的数组:
var a = [1,2,3,4,5];
console.log(a); //[1, 2, 3, 4, 5]
console.log(a.slice(1,2));//2
console.log(a.slice(1,-1));//[2, 3, 4]
console.log(a.slice(3,2));//[]
console.log(a); //[1, 2, 3, 4, 5]
-
concat(array)
:用于拼接数组,a.concat(b)
返回一个a
和b
共同组成的新数组,同样不会修改任何一个原始数组,也不会递归连接数组内部数组:
var a = [1,2,3,4,5];
var b = [6,7,8,9];
console.log(a.concat(b));//[1, 2, 3, 4, 5, 6, 7, 8, 9]
console.log(a); //[1, 2, 3, 4, 5]
console.log(b); //[6, 7, 8, 9]
-
reverse()
:用于将数组逆序,与之前不同的是它会修改原数组
var a = [1,2,3,4,5];
a.reverse();
console.log(a); //[5, 4, 3, 2, 1]
-
sort
:用于对数组进行排序,当没有参数的时候会按字母表升序排序,如果含有undefined会被排到最后面,对象元素则会调用其toString方法,如果想按照自己定义方式排序,可以传一个排序方法进去,很典型的策略模式,同样sort会改变原数组。
var a = [7,8,9,10,11]
a.sort(function(v1,v2){
return v1-v2
})
console.log(a) //[7, 8, 9, 10, 11]
var users = [
{
name: 'aaa',
age: 21
},
{
name: 'baa',
age: 18
},
{
name: 'abc',
age: 24
}
]
// 按age 从小到大排序
var sortByAge = users.sort(function(v1, v2){
return v1.age > v2.age
})
// 按name从大到小排序
var sortByName = users.sort(function(v1, v2){
return v1.name > v2.name
})
ES5数组方法
-
Array.isArray(obj)
:用来判断一个对象是不是数组。
var a = [];
var b = new Date();
console.log(Array.isArray(a)); //true
console.log(Array.isArray(b)); //false
-
.indexOf(element)
/.lastIndexOf(element)
:用于查找数组内指定元素位置,查找到第一个后返回其索引,没有查找到返回-1,indexOf从头至尾搜索,lastIndexOf反向搜索。
var a = [1,2,3,3,2,1]
console.log(a.indexOf(2)) //1
console.log(a.lastIndexOf(2)) //4
-
.forEach(element, index, array)
:遍历数组,参数为一个回调函数,回调函数有三个参数:当前元素、当前元素索引值、整个数组
var a = new Array(1,2,3,4,5,6);
a.forEach(function(e,i,array){
array[i]= e + 1;
});
console.log(a); //[2, 3, 4, 5, 6, 7]
-
.every(function(element, index, array))
/.some(function(element, index, array))
:这两个函数类似于离散数学中的逻辑判定,回调函数返回一个布尔值。
every是所有函数的每个回调函数都返回true的时候才会返回true,当遇到false的时候终止执行,返回false;
some函数是“存在”有一个回调函数返回true的时候终止执行并返回true,否则返回false。
在空数组上调用every返回true,some返回false
var a = [1, 2, 3, 4, 5, 6]
console.log(a.every(function(e, i, arr){
return e < 5
}))
console.log(a.some(function(e,i,arr){
return e > 4
-
.map(function(element))
:与forEach类似,遍历数组,回调函数返回值组成一个新数组返回,新数组索引结构和原数组一致,原数组不变
var a = [1, 2, 3, 4, 5, 6]
console.log(a.map(function(e){
return e * e
})) // [1, 4, 9, 16, 25, 36]
console.log(a) //[1, 2, 3, 4, 5, 6]
-
.filter(function(element))
:返回数组的一个子集,回调函数用于逻辑判断是否返回,返回true则把当前元素加入到返回数组中,false则不加。新数组只包含返回true的值,索引缺失的不包括,原数组保持不变
var a = [1, 2, 3, 4, 5, 6]
console.log(a.filter(function(e){
return e % 2 == 0;
})) // [2, 4, 6]
console.log(a) //[1, 2, 3, 4, 5, 6]
-
.reduce(function(v1, v2), value)
/.reduceRight(function(v1, v2), value)
:遍历数组,调用回调函数,将数组元素组合成一个值,reduce从索引最小值开始,reduceRight反向,方法有两个参数:1.回调函数:把两个值合为一个,返回结果;2.value,一个初始值,可选
var a = [1, 2, 3, 4, 5, 6]
var b = a.reduce(function(v1, v2){ return v1 + v2 }) console.log(a) // 21
var b = a.reduceRight(function(v1, v2){ return v1 - v2 }, 100)
console.log(b) // 79
字符串
一、转义
- 如果要在单引号字符串的内部,使用单引号(或者在双引号字符串的内部,使用双引号),就必须在内部的单引号(或者双引号)前面加上反斜杠,用来转义。
'Did she say \'Hello\'?'
// "Did she say 'Hello'?"
"Did she say \"Hello\"?"
// "Did she say "Hello"?"
- 如果字符串的正常内容之中,需要包含反斜杠,则反斜杠前需要再加一个反斜杠,用来对自身转义。
二、多行
- 字符串默认只能写在一行内,分成多行将会报错。因此可用如下方法进行多行编写:
- 可以在每一行的尾部使用反斜杠
/
。反斜杠的后面必须是换行符,而不能有其他字符(比如空格),否则会报错。 - 连接运算符
+
可以连接多个单行字符串,用来模拟多行字符串。 - 使用“``”:
var str = `
你好
这里是饥人谷
jirengu.com
开启你的前端之路
`