JSON 对象
a.JSON与js 对象的区别
下边是JSON 对象和js对象
var person={ age:10, name:'sa' };
{ "age":10, "name":"sa" }
两种对象对比,首先JSON没有声明变量,第二JSON对象没有不需要结尾分号,
JSON对象属性必须要加上双引号,手工编写JSON时候忘了给对象属性名加双引号或者把双引号写成单引号成了最常见的错误
b.JSON对象序列花
早起JSON解析器基本使用js 的eval函数,由于JSON是javascript语法子集,所以eval可以进行解析并且返回js对象和数组, ECMAScript5 对解析JSON进行了规范,定义了全局对象JSON,目前ie8+ ff3.5+ sf4+ chrome 都可以支持,对于旧版本的浏览器可以使用shim ,使用eval 对JSON求值存在风险,可能会执行一些恶意代码,
JSON对象有两个方面 stringify() parse() 一个是序列化成字符串,一个是把字符串解析为原生js的值。
var person={ age:10, name:"lei.you" }
var str=JSON.stringify(person); 这样就会得到一个字符串“{“age”:10,"name":"lei.you"}”
然后在使用var p= JSON.parse(str); 得到对应的对象值,
注意p 和person不是用一个对象虽然具有同样的属性,如果个parse解析的字符串不是一个有效的JSON 该方法会抛出错误
序列化选项 在stringify 中第二个参数是一个数组,该数组是对序列化的对象属性进行过滤
例如 JSON.stringify(person,[age]) 那么返回的序列化以后的字符串就只剩下age 属性
变量提升
请看如下代码
var id=2000; function test(){ if(false){ var id=1000; } console.log(id) } test();
打印出的结果竟然是1000,是不是程序出问题还是自己眼睛花了,
为什么会出现这样的结果,研究完js的执行环境和作用域的问题,就会对这个现象有所理解
js的作用域是函数作用域,与传统强类型语言c++ java 都是不同,传统的编程语言是块作用域,
所以根据js执行环境的原理,当执行环境进入到一个函数时候,函数的环境就会被推入一个环境栈中,而在环境执行之后才会把这个执行环境弹出,当进入这个执行环境的时候首先会创建一个作用域链,作用域链的用途是保证对执行环境有权访问的所有变量和函数的有序访问,作用域链的前端永远都是当前执行的代码所在环境的变量对象,如果这个环境是函数,则将其活动对象作为变量对象。
在javascript,变量有4种基本方式进入作用域:
- 1 语言内置:所有的作用域里都有this和arguments;(译者注:经过测试arguments在全局作用域是不可见的
- 2 形式参数:函数的形式参数会作为函数体作用域的一部分;
- 3 函数声明:像这种形式:function foo(){};
- 4 变量声明:像这样:var foo;
函数声明和变量声明总是会被解释器悄悄地被“提升”到方法体的最顶部。这个意思是,像下面的代码:
变量 作用域 和内存问题