06-标准库

nobility 发布于 2022-10-31 01-ES5 1091 次阅读


标准库

Object

js 中所有对象都继承自 Object 对象,即 js 中所有对象都是 Object 的实例

函数与构造函数

Object() 在不使用 new 关键字的情况下就变成了一个普通函数,功能是将任意原始数据类型的转化为一个对应的包装对象,若是空参、nullundefined 会返回一个空对象

new Object() 使用时与函数功能和用法是一样的,只不过是语义不同,函数代表转化为一个对象,而构造函数代表新生成一个对象

静态方法

遍历属性
方法名 描述
Object.keys(obj) 返回 obj 对象自身的所有属性名的数组(不包括不可枚举的属性)
Object.getOwnPropertyNames(obj) 返回 obj 对象自身的所有属性名的数组(包括不可枚举的属性)
描述对象
注意

通过方法设置的描述对象,对于省略的元属性与直接设置属性方式不同的是 writableenumerableconfigurable 默认都是 false

方法名 描述
Object.getOwnPropertyDescriptor(obj,propertyName) 获取 objpropertyName 属性的描述对象,没有该属性返回 undefined
Object.defineProperty(obj,propertyName,propertyDesc) 通过描述对象,为 obj 对象定义某个属性
Object.defineProperties(obj,propertyDesc) 通过描述对象,为 obj 对象定义多个属性

每个属性都有自己对应的属性描述对象,保存该属性的一些元信息,即元属性,控制属性的属性

属性名 描述
value 属性值,默认 undefined
writable 布尔值,属性值是否可写,默认为 true;若设置为 false,则正常模式下写入默默失效,严格模式下会报错
enumerable 布尔值,属性值是否可枚举,默认为 true
configurable 布尔值,属性值是否可配置,默认为 true;若设置为 false 则无法删除该属性、也不得改变该属性的属性描述对象包括 configurablevalue 属性除外,但是要注意的是writable 只有在 false 改为 true 会报错,true 改为 false 是允许的
get 取值函数,默认为 undefined
set 存值函数,默认为 undefined,必须有一个参数是 value

一旦定义了存取器就必须保证 writabletrue,在进行对属性值存取时就会调用存取器函数,无法绕过存取器,所以设置存取器后就不能同时在设置 writable 属性和 value 的默认值了,否则会报错

/*设置存取器的第一种方式*/
var obj = Object.defineProperty({}, "p", {
  enumerable:true,  //此方法中默认为false
  configurable:true,  //此方法中默认为false
  get:function () {
    return this.value
  },
  set: function (value) {
    this.value = value
  }
});
console.log(Object.getOwnPropertyDescriptor(obj,"p"));

/*设置存取器的第二种方式*/
var obj = { //此方式enumerable、configurable默认都是true
  set p(value){
    this.value = value;
  },
  get p(){
    return value;
  },
}
console.log(Object.getOwnPropertyDescriptor(obj,"p"));



var obj = {	//对象描述信息是无法使用这种方式显示设置的,必须使用defineProperty和definePropertya方法
  p:{
    value:"100",
    writable: true,
    enumerable:true,
    configurable:true,
  }
}
console.log(Object.getOwnPropertyDescriptor(obj,"p"));
// { value:
//   { value: '100',
//     writable: true,
//     enumerable: true,
//     configurable: true },
//  writable: true,
//  enumerable: true,
//  configurable: true }
对象状态控制
方法名 描述
Object.preventExtensions(obj) 防止 obj 对象扩展,无法添加新属性
Object.isExtensible(obj) 判断 obj 对象是否可扩展
Object.seal(obj) 禁止 obj 对象配置,无法添加新属性、无法删除旧属性,实质是把属性描述对象的 configurable 属性设为 false
Object.isSealed(obj) 判断一个 obj 对象是否可配置
Object.freeze(obj) 冻结一个 obj 对象,无法添加新属性、无法删除旧属性、也无法修改属性的值
Object.isFrozen(obj) 判断一个 obj 对象是否被冻结
原型链相关
方法名 描述
Object.create(obj) obj 为原型创建一个空对象并返回,省略参数或传入空对象父对象就是 Object,传入 null 则会返回不继承任何对象的空对象
Object.getPrototypeOf(obj) 获取 obj 对象的 prototype 对象
Object.setPrototypeOf(obj,objPrototype) 设置 obj 对象的 prototyoe 对象为 objPrototype 并返回 obj 对象

实例方法

方法名 描述
Object.prototype.valueOf() 返回当前对象对应的值,默认情况下返回对象本身
Object.prototype.toString() 返回当前对象的字符串形式,默认情况下返回类型字符串
Object.prototype.toLocaleString() 返回当前对象的以本地字符串形式,主要用于 Date 类,默认情况下与 toString() 一样
Object.prototype.hasOwnProperty(propertyName) 判断该对象是否有 propertyName 这个属性,不包含继承的
Object.prototype.isPrototypeOf(obj) 判断该对象的原型是否是 obj
Object.prototype.propertyIsEnumerable(propertyName) 判断该对象的 propertyName 属性是否可枚举,对于没有该属性和对象原型中的属性一律返回 false

Array

构造函数

返回一个新生的数组,若不使用 new 关键字也是一样的结果,但是建议总是加上 new 表示为使用构造函数创建对象

该构造函数的参数不一样时返回结果也是不一样的

参数 描述
无参或 0 返回空数组
一个正整数 正整数表示数组的长度,内容都是空位
一个非正整数(负数、小数) 报错
一个其他数据类型 由此参数构成的单个元素的数组
多个参数 由此些参数构成数组元素的数组

静态方法

方法名 描述
Array.isArray(arr) 判断 arr 是否是数组,弥补了 typeof 的不准确

实例方法

重写的
方法名 描述
Array.prototype.toString() 重写了 Object 的方法,返回数组的字符串形式
Array.prototype.valueOf() 重写了 Object 的方法,返回数组本身
会改变原数组的方法
方法名 描述
Array.prototype.push(...element) 数组尾部添加一个或多个元素,并返回数组长度
Array.prototype.pop() 数组尾部删除一个元素,并返回删除元素
Array.prototype.shift() 数组头部删除一个元素,并返回删除元素
Array.prototype.unshift(...element) 数组头部添加一个或多个元素,并返回数组长度
Array.prototype.reverse() 将数组元素位置翻转
Array.prototype.splice(start,count[,...element]) start 位置开始删除 count 个元素后,插入 element 元素,并以数组形式返回删除的元素;可以只删除不插入;允许起始位置为负数代表倒数第几个;
Array.prototype.sort([[compareFunction]]) 对数组按照比较器函数进行排序,要注意的是:最好将比较器返回数值型,而不是布尔型;若不传入比较器函数则会按照字典顺序排序
不会改变原数组的方法
方法名 描述
Array.prototype.join(separator) 返回以 separator 连接符连接数组元素的字符串,会将空位、undefinednull 的元素转化为空字符串
Array.prototype.concat(array) 返回当前数组和 array 数组拼接的新数组
Array.prototype.slice([start,end]) 返回 [start,end)[start,end) 的子数组,可以是负数,表示倒数第几个,超过数组长度会转化为数组的长度;范围不合法会返回空数组;若 end 参数省略,则会从 start 位置开始,一直到到数组最后;若连 start 都省略了,则会从数组首部一直到数组的最后,即数组拷贝
Array.prototype.lastIndexOf(element) 返回给定元素在位置,数组中倒着找第一次出现的位置,找不到返回-1
Array.prototype.indexOf(element) 返回给定元素位置,在数组中正着找第一次出现的位置,找不到返回-1
函数式编程
  • 对于所有的函数式方法都是同步的回调函数,也就是说这些回调函数不会添加到异步队列中
  • 对于 map()forEach()filter()some()every() 来说参数是一致的
    • callback(currentElement[,index,array]):表示元素处理回调函数,只有第一个参数是必须的
      • currentElement:当前正在处理的元素
      • index:当前正在处理的元素下标
      • array:被调用的数组
    • thisTar:表示函数内部若使用 this 是时可以通过此参数改变回调函数中的 this 指向,从而避免指向了全局对象
  • 对于 reduce()reduceRight 来说参数是一致的,只不过处理顺序是相反的
    • callback(accumulator,currentElement[,index ,array]):表示元素处理回调函数,只有前两个是必须的
      • accumultor:累计器,每次调用回调函数的返回值;第一次还没调用时还没有返回值,所以第一次可能是数组的第一个元素,当前值会从第二个元素开始;也可能是设置的初始值,当前值会从第一个元素开始
      • currentElement:当前正在处理的元素
      • index:当前正在处理的元素下标
      • array:被调用的数组
    • initValue:设置第一次调用回调函数时累计器的值,若省略该值则默认使用数组的第一个元素做累计器的值,并且当前值会是第二个元素

对于函数式编程函数返回值是数组的就可以采用链式编程了,对于以下的回调要求只是建议

方法名 描述
Array.prototype.map(callback[,thisTar]) 返回每个元素经过回调函数处理的新数组;回调要求有返回值
Array.prototype.forEach(callback[,thisTar]) 无返回值,每个元素都经过回调函数处理;回调要求无返回值
Array.prototype.filter(callback[,thisTar]) 每个元素经过回调函数处理,对于回调函数处理后返回 true 的元素组成新数组并返回;回调要求返回布尔值
Array.prototype.some(callback[,thisTar]) 每个元素经过回调函数处理,只要有一个元素经过回调函数处理后返回 true 整个函数返回 true,否则返回 false;回调要求返回布尔值
Array.prototype.every(callback[,thisTar]) 每个元素经过回调函数处理,所有元素经过回调函数处理后返回 true 整个函数返回 true,否则返回 false;回调要求返回布尔值
Array.prototype.reduce(callback[,initValue]) 从前往后的顺序对每个元素经过回调函数处理,返回最后一次调用回调函数的返回值;回调要求返回有返回值,并且回调中要处理累计器的值
Array.prototype.reduceRight(callback[,initValue]) 从前往后的顺序对每个元素经过回调函数处理,返回最后一次调用回调函数的返回值;回调要求返回有返回值,并且回调中要处理累计器的值

包装对象

将原始数据类型放在与之对应包装对象中,使原始数据类型也成为合成数据类型,之后这些包装对象就可以调用包装对象中的方法了,当然也可以为包装对象的原型上添加自定义的属性

要区分new Number ()Number ()方法,前者属于构造函数返回对应的包装对象,而后者是普通函数返回原始类型,其他那几个也是同理(除拉Object ()

构造方法

对于函数方式在数据类型之间的转换,这里是构造方法方式,对于原始类型变为包装对象有一下四种方式:

构造函数名 描述
Number () 配合new关键字生成对应的包装对象
String () 配合new关键字生成对应的包装对象
Boolean () 配合new关键字生成对应的包装对象
Object () 配合new关键字生成对应的包装对象

公有的实例方法

方法名 描述
valueOf () 重写了 Object 中的方法,返回包装对象中的原始类型数据
toString () 重写了 Object 中的方法,返回包装对象中原始数据类型转化的字符串;若是Number的实例则还可以指定进制数

自动装箱与手动拆装

实际上就是是原始类型到包装对象自动转换,包装对象到原始数据类型手动转化

对于自定义属性是可以在手动装箱的对象中添加的,但是无法在自动装箱的对象中添加,自动装箱的对象是只读的,或者说包装对象方法调用结束后,包装对象实例会自动销毁,下一次调用字符串的属性时,实际是调用一个新生成的对象,而不是上一次调用时生成的那个对象,所以取不到赋值在上一个对象的属性;所以最好的方式是将属性定义在包装对象构造方法的原型对象上

/*自动拆箱*/
Console.Log (new String ("1")); //[String: '1']
//等同于
Console.Log (new String ("1"). ValueOf ()); //1
Console.Log ("1"); //1

Console.Log (new Number (1)); //[Number: 1]
//等同于
Console.Log (new Number (1). ValueOf ()); //1
Console.Log (1); //1

Console.Log (new Boolean (true)); //[Boolean: true]
//等同于
Console.Log (new Boolean (true). ValueOf ()); //true
Console.Log (true);  //true


/*自动装箱*/
Console.Log ("1". Length);  //1
//等同于
Console.Log (new String ("1"). Length);  //1

Number. Prototype. Add 1 = function (){return this.ValueOf ()+1;}; //为包装对象添加自定义方法
console.Log ((1). Add 1 ());  //2	必须带有括号否则会有小数点的二义性,也可以使用方括号形式	1 ["add1"]();
//等同于
Console.Log (new Number (1). Add 1 ());  //2

Boolean. Prototype. Not = function (){return !This.ValueOf ()}; //为包装对象添加自定义方法
Console.Log (true.Not ());  //false
//等同于
Console.Log (new Boolean (true). Not ());//false

/*无法在自动装箱对象中添加方法*/
Var str = new String ("1");
Str. Add = function (){
  Return this.ValueOf ()+this.ValueOf ();
};
Console.Log (str.Add ()); //11

Var str = "1";
Str. Add = str. Add = function (){
  Return this.ValueOf ()+this.ValueOf ();
};
Console.Log (str.Add ()); //TypeError: str. Add is not a function

Number

静态属性
属性名 属性值
Number. POSITIVE_INFINITYNumber. NEGATIVE_INFINITY 指向Infinity-Infinity
Number. NaN 指向NaN
Number. MIN_VALUE 浮点数中最小的正数5 e-324
Number. MAX_SAFE_INTEGER 能精确表示的最大整数为9007199254740991
Number. MIN_SAFE_INTEGER 能精确表示的最小整数为-9007199254740991
实例方法

注意调用时小数点的二义性,可以使用括号将数字括起来,也可以使用方括号的形式

方法名 描述
Number.Prototype.ToFixed (num) 将数值转化为指定位数的小数字符串(四舍五入不准确)
Number.Prototype.ToExponential (num) 将数值转化为指定位小数位的科学计数法形式
Number.Prototype.ToPrecision () 将数值转为指定位数的有效数字(小数整数都算上,四舍五入不准确)
Number.Prototype.ToLocaleString ([zone, options]) 默认返回本地的数字的字符串形式,也可以根据时区和配置转化为当地的字符串形式

String

静态方法
方法名 描述
String.FromCharCode (... Unicode) Unicode改成编码转化成字符串
实例方法

查询方法

方法名 描述
String. Prototype. Length 返回字符串的长度
String.Prototype.CharAt (index) 返回指定下标的字符
String.Prototype.CharCodeAt (index) 返回指定下标的字符Unicode编码,若下标不合法返回NaN
String.Prototype.IndexOf (substr) 返回给定子串在位置,字符串中正着找第一次出现的位置,找不到返回-1
String.Prototype.LastIndexOf (substr) 返回给定子串在位置,字符串中反着找第一次出现的位置,找不到返回-1

截取方法

方法名 描述
String.Prototype.Slice ([start, end]) 返回[start,end)[start, end)的子串,可以是负数,表示倒数第几个,超过字符串长度会转化为字符串的长度;范围不合法会返回空串;若end参数省略,则会从start位置开始,一直到到最后;若连start都省略了,则会从数组首部一直到字符串的最后,即字符串拷贝
String.Prototype.Substring ([start, end]) 返回[start,end)[start, end)的子串,若是负数自动转化为 0,超过字符串长度会转化为字符串的长度,范围不合法会交换起始结束位置;若end参数省略,则会从start位置开始,一直到到最后;若连start都省略了,则会从数组首部一直到字符串的最后,即字符串拷贝
String.Prototype.Substr ([start, count]) start位置开始,取count个字符,start可以是负数,表示倒数第几个,count为负数会转化为 0;若count参数省略,则会从start位置开始,一直到到最后;若连start都省略了,则会从数组首部一直到字符串的最后,即字符串拷贝

转化方法

方法名 描述
String.Prototype.Trim () 返回一个去除两端空白的字符串
String.Prototype.ToLowerCase () 返回转小写后的字符串
String.Prototype.ToUpperCase () 返回转大写后的字符串
String.Prototype.Concat (str) 返回当前字符串与str的拼接,与+效果相同

分隔方法

方法名 描述
String.Prototype.Split (regex) 根据给定规则分隔字符串

Boolean

没有自己的方法,但是要注意以下使用方式,对于包装对象会当成对象来处理,所以会转化为 true

If (Boolean (false)) {	//false 转化为 false 没问题
  Console.Log ('true');
} // 无输出

If (new Boolean (false)) {	//现在是对象,对象转化为 true
  Console.Log ('true');
} // true

If (Boolean (null)) {	//现在是 null 转化为 false 没问题
  Console.Log ('true');
} // 无输出

If (new Boolean (null)) {	//现在是对象,对象转化为 true
  Console.Log ('true');
} // true

正则表达式

  • 正则属于特殊的字符串,主要用于表达字符串的结构
  • 如同字符串一样,有自己的构造函数可以使用new RegExp ()生成,也可以使用字面量形式/进行包裹

正则修饰符

字面量形式在/包裹后修饰,使用构造函数形式则是第二个参数是修饰符

符号 含义
g 表示全局匹配模式
i 忽略字母大小写模式
m 多行模式,$^会识别换行符

正则匹配规则

转义字符

在使用new RegExp ()构造函数时,由于正则表达式也是字符串,再匹配正则中已经占用的符号时要进行转移,通常要使用两个反斜线,因为两个反斜线转移成一个反斜线,然后这个被转义后的反斜线再将后面要转义的符号转义

在使用字面量时已使用/包裹区分字符串了,所以像换行符制表符之类的字符就无需转义了,直接使用即可

符号 构造函数方式 字面量方式
\\ \ \\
\t \\t \t
\n \\n \n
特殊符号

[]中除拉&&、-、^其他就失去意义,无需转义,其中的关系是或的关系

符号 描述
. 任意一个字符,除拉\r\n
^ 以开头,在[]中是取反
$ 以结尾
[] 单个符号范围
&& 只作用于[]中,关系与取交
- 只作用于[]中,表取值范围
{} 数量词量词范围
() 提升优先级和分组
` ` 关系或
数量词符号

贪婪模式(默认):重复次数多个满足条件情况下,尽可能的多匹配

非贪婪模式(数量词后跟一个?):重复次数多个满足情况下,尽可能的少匹配

符号 描述
* 闭包,零次或多次
+ 正闭包,一次或多次
? 占位,零次或一次
{n} 重复 n 次
{n,} 重复 n 次或更多次
{n, m} 重复 n 到 m 次
简化表达式
预定义类 描述
\d [0-9]
\D [^0-9]
\w [0-9 a-zA-Z_]
\W [^0-9 a-zA-Z_]
\s 匹配空格 (包括换行,制表空格)[\t\r\n\v\f]
\S [^\t\r\n\v\f]

实例属性

要注意的是,除拉lastIndex属性以外的其他实例属性是只读的

属性名 描述
RegExp. Prototype. IgnoreCase 判断该正则是否设置了i修饰符
RegExp. Prototype. Global 判断该正则是否设置了g修饰符
RegExp. Prototype. Multiline 判断该正则是否设置了m修饰符
RegExp. Prototype. Flags 返回所有修饰符,按照字母顺序排序igm
RegExp. Prototype. LastIndex 返回下一次开始搜索的位置
RegExp. Prototype. Source 返回正则的字符串形式

实例方法

方法名 描述
RegExp.Prototype.Test (str) 测试str是否满足该正则;若是全局匹配模式下每次满足会修改lastIndex的值,下一次调用会从lastIndex位置开始进行匹配,也可以手动改lastIndex的值做到指定位置开始匹配,所以在全局匹配模式下就不要修改str变量了,因为会导致lastIndex值不准确
RegExp.Prototype.Exec (str) 以数组形式返回str中满足该正则的字串,未有满足的返回null;若是分组正则(带有括号的正则)则会将每组匹配到的元素都放入数组,最外层未带括号的组号是 0,第一个带有括号的组号是 1,以此类推;返回的数组会比普通数组多两个属性:input表示原字符串、index表示匹配成功的原字符串下标位置,在全局匹配模式下会跟随lastIndex属性一起变化

字符串中的正则

方法名 描述
String.Prototype.Match (regexp) 返回一个数组,成员是匹配到的子串,未有满足的返回null;要注意只有当正则是全局匹配模式下,成员才会是所有匹配的子串,否则会与正则的exec ()方法的非全局匹配模式下返回结果一样,并且此方法与正则的lastIndex无关
String.Prototype.Search (regexp) 返回第一个满足正则规则的子串的位置。未有满足返回-1
String.Prototype.Replace (regexp, replacement) 返回用replacement替换满足正则的子串;正则全局匹配模式下会替换掉全部满足正则的子串,而非全局匹配模式下只会替换第一个满足的正则的子串
String.Prototype.Split (regexp[, maxCount]) 按照正则规则将字符串分隔成字符串数组,maxCount可以限制匹配到字符串的个数,也是数组元素个数,省略则代表全部分隔

Math

该对象只是个内置对象,既无法调用,也无法使用new关键字生成实例

静态属性

属性名 描述
Math. PI 常数π

静态方法

方法名 描述
Math.Abs (number) 绝对值
Math.Ceil (number) 向上取整
Math.Floot (number) 向上取整
Math.Round (number) 四舍五入为整数
Math.Max (... Number) 返回最大值
Math.Min (... Number) 返回最小值
Math.Random () 返回[0,1) 之间的随机数
Math.Sqrt (x) 平方根,x\sqrt{x}\quad,负数会返回NaN
Math.Pow (x, y) 幂运算,xyx^y

Date

函数

不管有没有参数,总是返回当前时间对象的字符串形式

构造函数

构造函数参数 描述
无参 返回当前时间的时间对象
单个整型数字 表示时间戳,返回当前时间戳的时间对象
字符串 能被解析的时间字符串,返回字符串描述的时间对象
多个整型数字 分别表示,年月日-时分秒, 毫秒,若只写一个年会当作时间戳处理,所以至少是两个参数;与其他编程语言一样,月份是从 0 开始的,日期是从 1 开始的,时间超过范围会自动折算,且允许为负数

静态方法

方法名 描述
Date.Now () 返回当前时间的时间对象,是无参构造函数的一个工厂方法
Date.Parse (str) 能被解析的时间字符串,返回字符串描述的时间对象,是字符串参数构造函数的一个工厂方法
Date.UTC (year, month[, date, hrs, min, sec, ms]) 与构造函数的参数完全一致,只不过返回的是时间戳,该时间不再是当地时区了,而是世界标准时间

实例方法

to类:从Date对象返回一个字符串,表示指定的时间

方法名 描述
Date.Prototype.ToUTCString () 返回UTC格式时间
Date.Prototype.ToISOString () 返回ISO格式时间
Date.Prototype.ToJSON () 返回符号 JSON 格式的时间,也就是ISO格式时间
Date.Prototype.ToString () 返回完整的时间
Date.Prototype.ToDateString () 返回日期
Date.Prototype.ToTimeString () 返回时间
Date.Prototype.ToLocaleString () 返回完整的本地时间
Date.Prototype.ToLocaleDateString () 返回本地日期
Date.Prototype.ToLocaleTimeString ([zone, options]) 默认返回本地时间,也可以根据时区和配置转化为当地的字符串形式

get类:获取Date对象的日期和时间

也有获取世界标准时间的方法,就是加一个UTC的前缀,如:getUTCDate ()

方法名 描述
Date.Prototype.GetTime () 获取时间戳,与valueOf ()方法相同
Date.Prototype.GetFullYear () 返回四位数年份
Date.Prototype.GetMonth () 返回月,0 是 1 月,以此类推
Date.Prototype.GetDate () 返回日,从 1 开始
Date.Prototype.GetHours () 返回小时
Date.Prototype.GetMinutes () 返回分钟
Date.Prototype.GetSeconds () 返回秒
Date.Prototype.GetMilliseconds () 返回毫秒
Date.Prototype.GetDay () 返回星期,0 是星期日,以此类推
Date.Prototype.GetTimezoneOffset () 返回当前时间与世界标准时间的时差

set类:设置Date对象的日期和时间

相应的也有设置世界标准时间的方法,也是加个UTC前缀,如:setUTCDate ()

方法名 描述
Date.Prototype.SetTime (milliseconds) 设置时间戳
Date.Prototype.SetFullYear (year[, month, date]) 设置四位数年份
Date.Prototype.SetMonth (month[, date]) 设置月
Date.Prototype.SetDate (date) 设置日
Date.Prototype.SetHours (hour[, min, sec, ms]) 设置小时
Date.Prototype.SetMinutes (min[, sec, ms]) 设置分钟
Date.Prototype.SetSeconds (sec[, ms]) 设置秒
Date.Prototype.SetMilliseconds () 设置毫秒

JSON

JSON 格式

  1. 复合类型的值只能是:数组、普通对象;不能是:函数、正则、日期
  2. 原始类型值只能是:字符串、十进制数、布尔值和 null;不能是:NaNInfinity-Infinityundefined
  3. 字符串必须使用双引号,不能使用单引号
  4. 对象的键名必须使用双引号包裹
  5. 数组或对象的最后一个成员不能加逗号

静态方法

只有两个静态方法,用来处理 JSON 格式数据

方法名 描述
JSON.Stringify (JSONStr[, callback]) JSONStr字符串转换成 js 对象
`JSON.Parse (obj,[callback array, number string])` 将 js 对象转化成 JSON 字符串;普通对象:如果属性值undefined、函数或该属性不可枚举,该属性会被忽略;正则对象:会被转化成空对象;数组:如果数组元素是undefined、函数,该元素会被转化成null;原始数据类型:会被转化成对于的字符串格式(只有字符串类型会附带有双引号)
Var obj = {
  Name: "zhangsan",
  Age:18
};
Var arr = [1,2];
/*第二个参数是数组形式,是配置要转化的属性有哪些*/
Console.Log (JSON.Stringify (obj,["name"]));  //{"name": "zhangsan"}
Console.Log (JSON.Stringify (arr,["0"])); //[1,2],对数组下标是无效的
/*
第二给参数是函数,是对要解析对象的属性值进行处理,数组也是可以的
该函数需要有两个参数,一个是 key 表示对象属性的键,一个是 value 表示对象属性的值,返回值是该键的属性值
要注意的是该函数会从最外层 obj 开始递归的像内处理,所以最好加上判断
*/
Function fun (key, value){
  Console.Log ("["+ key +"]: " + value);
  If (typeof value !== "object"){ //如果不是对象
    Return value+value; //让键值翻倍若返回 undefined 就会忽略这个属性
  }
  Return value;
}
Console.Log (JSON.Stringify (obj, fun));
// []:[object Object]	//第一个属性是对象本身,没有键名
// [name]:zhangsan	//第二个是内层属性
// [age]:18

// {"name": "zhangsanzhangsan","age": 36}	//经过函数处理后的结果,键值翻倍了


/*
第三个参数是数字,代表每个属性前增加几个空格,数组也是一样
使得 JSON 缩进,一样是递归的
*/
Console.Log (JSON.Stringify (obj, null, 2));  //在属性值前面补充 2 个空格,更加好看些
// {
//   "name": "zhangsan",
//   "age": 18
// }
/*
第三个参数是字符串,代表每个属性前增加这个字符串,数组也是一样
但是这样的方式会导致无法解析出来,同样是递归的
*/
Console.Log (JSON.Stringify (arr, null,"--")); 
// {
//   --"name": "zhangsan",
//   --"age": 18
// }
/*同样的 parse 也有第二个参数,但是只能是函数,与 stringify 方法的递归方向是相反的*/
Var json  = JSON.Stringify (obj);
Console.Log (JSON.Parse (json, fun)); 
// [name]:zhangsan
// [age]:18
// []:[object Object]
// { name: 'zhangsanzhangsan', age: 36 }

ToJSON 方法

如果一个对象中有toJSON ()方法时,则在使用stringify ()方法会使用该方法的返回值做为参数,而不是这个对象了,多数情况下使用此方法返回正则和Date对象的字符串形式,若没有此方法会转成空对象;Date中自带了,而正则中没有自带,需要手动处理

Var obj = {
  Name: "zhangsan",
  Age: 18,
  ToJSON: function () {
    Return "toJSON";
  }
};
Console.Log (JSON.Stringify (obj)); //"toJSON"

Var obj = {
  Name: "zhangsan",
  Age: 18,
  ToJSON: "toJSON"	//该属性不是函数时会失效
};
Console.Log (JSON.Stringify (obj)); //{"name": "zhangsan","age": 18,"toJSON": "toJSON"}
加油啊!即便没有转生到异世界,也要拿出真本事!!!\(`Δ’)/
最后更新于 2022-10-31