Blogger Information
Blog 57
fans 3
comment 0
visits 59792
Popular Tutorials
More>
Latest Downloads
More>
Web Effects
Website Source Code
Website Materials
Front End Template
JS基础-JS的数据类型和访问/流程控制/JSON格式字符串和js对象相互转换
岂几岂几
Original
678 people have browsed it

JS的数据类型和访问/流程控制/JSON格式字符串和js对象相互转换

1. JS的数据类型和访问

1.1. 原始类型

  • JS中的原始数据类型有: number , string , boolean ;

  • 声明变量使用 var 关键字.

  1. <script>
  2. /* 数字类型 */
  3. var year = 2020;
  4. /* 字符串类型 */
  5. var name = 'zhangsan';
  6. /* 布尔类型 */
  7. var isUpdate = false;
  8. </script>
  • 获取变量的数据类型使用 typeof . 使用方式: typeof 变量名 .
  1. <script>
  2. var site = 'php.cn';
  3. // 使用typeof来获取变量的数据类型
  4. var dataType = typeof site;
  5. document.write(dataType);
  6. /* result: string */
  7. </script>

1.2 特殊类型

  • JS中两个特殊的值类型: null , undefined .

  • 当只声明变量, 没有初始化变量值时, 此时变量的值是 undefined . 即, var param; 等效于 var param = undefined; .

  1. <script>
  2. var param;
  3. document.write(param);
  4. /* result: undefined */
  5. var param1 = null;
  6. document.write(param1);
  7. /* result: null */
  8. </script>
  • 特别的: null == undefined 返回的是 true ; 而 null === undefined 则返回 false
  1. <script>
  2. document.write(null == undefined);
  3. /* result: true */
  4. document.write(null === undefined);
  5. /* result: false */
  6. </script>
  • nullundefined 的区别: null 表示空对象; undefined 表示非对象类型的变量值为空/无.
  1. <script>
  2. // 获取null的数据类型
  3. var dataType = typeof null;
  4. document.write(dataType);
  5. /* result: object */
  6. </script>
  • null / undefined 转换为原始类型数据的值

    • null / undefined 转换为布尔值, 值转为为 false ;
  1. <script>
  2. if (!null) document.write('我被输出了<br>');
  3. if (!undefined) document.write('我被打印了');
  4. /* result:
  5. 我被输出了
  6. 我被打印了 */
  7. </script>
  • null / undefined 转换为字符串时, 值转为: "null" / "undefined" .
  1. <script>
  2. document.write(null + '<br>');
  3. document.write(undefined + '<br>');
  4. /* result:
  5. null
  6. undefined */
  7. </script>
  • null 转为数值时, 值为: 0 ; undefined 则不能转为数字(输出: NaN).
  1. <script>
  2. document.write(null + 100);
  3. document.write(undefined + 100);
  4. /* result:
  5. 100
  6. NaN
  7. */
  8. </script>

1.3 对象类型: array , object , function

  • 在js中, 除开 nullundefined , 所有数据类型都是对象, 包括原始类型.
  1. <script>
  2. // 证明原始类型数据也是对象: 都能通过他们调用内置方法
  3. var num = 3.1415926;
  4. var name = 'zhangsan';
  5. // 把num的值四舍五入, 保留3位小数
  6. console.log(num.toFixed(3));
  7. console.log(name.toUpperCase());
  8. /* result:
  9. 3.142
  10. ZHANGSAN
  11. */
  12. </script>

1.3.1 数组类型

  • JS中的数组跟PHP中的索引数组类似
  1. <script>
  2. // 定义数组
  3. var player = ['James', 'Davis', 'Green', 'Rondo', 'Kuzma'];
  4. document.writeln(player);
  5. /* result: James,Davis,Green,Rondo,Kuzma James */
  6. // 获取数组的中的元素
  7. document.writeln(player[0]);
  8. /* result: James */
  9. </script>
  • 判断变量是否为数组类型, 用 Array.isArray(变量名) , 因为 typeof 变量名 的返回值是 object , 不够具体.
  1. <script>
  2. // 定义数组
  3. var player = ['James', 'Davis', 'Green', 'Rondo', 'Kuzma'];
  4. document.writeln('"typeof player" 的值是:' + (typeof player));
  5. document.writeln('变量"player"的值' + (Array.isArray(player) ? '是' : '不是') + '数组');
  6. /* result:
  7. "typeof player" 的值是:object
  8. 变量"player"的值是数组
  9. */
  10. </script>
  • 数组循环

      1. for 循环
  1. <script>
  2. var player = ['James', 'Davis', 'Green', 'Rondo', 'Kuzma'];
  3. for (var index = 0; index < player.length; index++) {
  4. document.write(player[index] + ", ");
  5. }
  6. /* result: James, Davis, Green, Rondo, Kuzma, */
  7. </script>
    1. forEach 循环

    使用格式: array.forEach(function(当前遍历到的元素, 当前遍历到的元素在数组中的索引[可选], 受遍历的数组[可选]) {...})

  1. <script>
  2. var player = ['James', 'Davis', 'Green', 'Rondo', 'Kuzma'];
  3. player.forEach(function(p, index) {
  4. document.write("第" + (index + 1) + "位出场的是" + p + '<br>');
  5. });
  6. /*
  7. 第1位出场的是James
  8. 第2位出场的是Davis
  9. 第3位出场的是Green
  10. 第4位出场的是Rondo
  11. 第5位出场的是Kuzma
  12. */
  13. </script>
  • 数组函数

    • array.slice 函数

      用法: targetArr.slice(起始位置, 结束位置 + 1) : 获取JS数组中的”起始位置”到”结束为止”之间的元素

  1. <script>
  2. var player = ['James', 'Davis', 'Green', 'Rondo', 'Kuzma'];
  3. // 返回前3个球员
  4. document.write(player.slice(0, 3));
  5. /* result : James,Davis,Green */
  6. </script>
  • array.splice 函数

    类似PHP中的数组函数 splice , 可以用它实现对数组元素的增删改.

    使用语法: array.splice(起始位置, 元素个数[可选], 替换元素1[可选], 替换元素2[可选]...) ; 其中 替换元素1, 替换元素2... 可以以数组的形式传入: [替换元素1, 替换元素2...]

      1. 实现向当前数组中插入元素: targetArr.splice(起始位置, 0, 插入元素1, 插入元素2...)
  1. <script>
  2. var player = ['James', 'Davis', 'Green', 'Rondo', 'Kuzma'];
  3. // 在Davis后面插入Bradley, McGee
  4. player.splice(2, 0, ['Bradley', 'McGee']);
  5. document.write(player);
  6. /* result: James,Davis,Bradley,McGee,Green,Rondo,Kuzma */
  7. </script>
  1. - 2. 实现删除当前数组中的元素: `targetArr.splice(起始位置, 元素个数)`
  1. <script>
  2. var player = ['James', 'Davis', 'Green', 'Rondo', 'Kuzma'];
  3. // 删除Green, Rondo
  4. player.splice(2, 2);
  5. document.write(player);
  6. /* result: James,Davis,Kuzma */
  7. </script>
  1. - 3. 实现更新当前数组中元素的值: `targetArr.splice(起始位置, 元素个数, 替换后的值1, 替换后的值2[可选]...)`
  1. <script>
  2. var player = ['James', 'Davis', 'Green', 'Rondo', 'Kuzma'];
  3. // 把Davis, Green, Rondo更新为中文名
  4. player.splice(1, 3, ['戴维斯', '格林', '隆多']);
  5. document.write(player);
  6. /* result: James,戴维斯,格林,隆多,Kuzma */
  7. </script>

1.3.2 对象

  • JS中的对象跟PHP中的关联数组相似.

  • 定义对象

  1. <script>
  2. // 创建对象-1
  3. var player1 = {
  4. name: 'James',
  5. team: '湖人',
  6. age: 35,
  7. // JS中, 如果属性名含有非法字符, 则用双引号 `"` 将其括起来
  8. "player info": {
  9. height: '203',
  10. weight: '113',
  11. position: 'F-G'
  12. }
  13. };
  14. // 以表格的形式打印对象
  15. console.table(player1);
  16. // 另一种定义对象属性的方式见下面的例子
  17. </script>

执行结果:

  • 访问对象属性, 有两种方式一种是: 对象名.属性名 ; 另一种是类似PHP中的关联数组: 对象名[属性名] . 还有非法字符的属性名, 只能用第二种方式访问.
  1. <script>
  2. // 创建对象-2
  3. var player2 = {};
  4. player2.name = "James";
  5. player2.team = '湖人';
  6. player2.age = 35;
  7. player2["player info"] = {
  8. height: '203',
  9. weight: '113',
  10. position: 'F-G'
  11. };
  12. // 访问对象属性
  13. document.write('姓名:' + player2.name + '<br>');
  14. document.write('球队:' + player2.team + '<br>');
  15. document.write('年龄:' + player2['age'] + '<br>');
  16. document.write('身高:' + player2['player info'].height + '<br>');
  17. document.write('体重:' + player2['player info']['weight'] + '<br>');
  18. document.write('司职:' + player2['player info']['position'] + '<br>');
  19. /*
  20. 姓名:James
  21. 球队:湖人
  22. 年龄:35
  23. 身高:203
  24. 体重:113
  25. 司职:F-G
  26. */
  27. </script>
  • 遍历对象属性

    • 遍历对象方法1: 使用 for 属性名 in 对象 . 语法: for(对象键名 in 对象), 在遍历中, 用 对象名["属性名"] 的方式获取元素值更稳一些, 避免出现非法字符遍历报错.
  1. <script>
  2. var player1 = {
  3. name: 'James',
  4. team: '湖人',
  5. age: 35,
  6. // JS中, 如果属性名含有非法字符, 则用双引号 `"` 将其括起来
  7. "player info": {
  8. height: '203',
  9. weight: '113',
  10. position: 'F-G'
  11. }
  12. };
  13. // for...in...遍历对象属性.
  14. for (prop in player1) {
  15. var value = player1[prop];
  16. if (typeof value != 'object')
  17. document.write(prop + ': ' + value + '<br>');
  18. else // 如果属性值是对象, 继续遍历
  19. for (prop1 in value) {
  20. var value1 = value[prop1];
  21. document.write(prop1 + ': ' + value1 + '<br>');
  22. }
  23. }
  24. /* result
  25. name: James
  26. team: 湖人
  27. age: 35
  28. height: 203
  29. weight: 113
  30. position: F-G
  31. */
  32. </script>
  • 遍历对象方法2: 使用 Object.keys(对象) 获取对象的属性名组成的数组, 再借助数组的 forEach 进行遍历.
  1. <script>
  2. var player1 = {
  3. name: 'James',
  4. team: '湖人',
  5. age: 35,
  6. // JS中, 如果属性名含有非法字符, 则用双引号 `"` 将其括起来
  7. "player info": {
  8. height: '203',
  9. weight: '113',
  10. position: 'F-G'
  11. }
  12. };
  13. // 获取属性名数组
  14. var props = Object.keys(player1);
  15. props.forEach(function(prop) {
  16. var value = player1[prop];
  17. if (typeof value != 'object')
  18. document.write(prop + ': ' + value + '<br>');
  19. else {
  20. // 如果属性值是对象, 继续遍历
  21. var props1 = Object.keys(value);
  22. props1.forEach(function(prop1) {
  23. var value1 = value[prop1];
  24. document.write(prop1 + ': ' + value1 + '<br>');
  25. });
  26. }
  27. });
  28. /* result:
  29. name: James
  30. team: 湖人
  31. age: 35
  32. height: 203
  33. weight: 113
  34. position: F-G
  35. */
  36. </script>
  37. </body>

1.3.3 函数

  • JS中的函数和PHP中的函数类似

  • JS中的函数类型有: 普通函数 , 匿名函数 , 立刻执行函数 .

    • 普通函数: function 函数名(参数列表) {函数体...}
  1. <script>
  2. /* 普通函数 */
  3. function sayHello(name) {
  4. document.write('hello!' + name);
  5. }
  6. sayHello('zhangsan');
  7. /* result: hello!zhangsan */
  8. </script>
  • 匿名函数, 又叫函数表达式: function(参数列表) {函数体...} ; 可以赋值给变量.
  1. <script>
  2. /* 匿名函数 */
  3. var func = function(name) {
  4. document.write('hello!' + name);
  5. }
  6. // typeof 函数的值是function, 不像数组, 返回object
  7. document.write(typeof func);
  8. /* result: function */
  9. // 借助变量使用匿名函数
  10. func('zhangsan');
  11. /* result: hello!zhangsan */
  12. </script>
  • 立刻执行函数: 即写完后立刻执行(不用专门调用): (function(参数列表[可选]) {函数体...})(实参列表[可选]) .
  1. <script>
  2. (function(name) {
  3. document.write('hello! ' + name);
  4. })('lisi');
  5. /* result: hello! lisi */
  6. </script>

2. JS中的流程控制

  • JS中的流程控制跟PHP类似

2.1. 流程控制

  • 单分支, 就是 if 条件句, 语法:
  1. <script>
  2. if (判断) {
  3. // 判断为true时执行的代码块...
  4. }
  5. </script>
  • 双分支, 就是 if...else... 条件句, 语法:
  1. <script>
  2. if (判断) {
  3. // 判断结果为true时执行的代码块
  4. } else {
  5. // 判断结果为false时执行的代码块
  6. }
  7. </script>
  • 多分支, JS中的多分支同样有两种.

    • 一种是 if...else if...else... , 其中 else if 可以出现0到多次, 语法:
  1. <script>
  2. if (判断1) {
  3. // 判断1结果为true时执行的代码块
  4. } else if (判断2) {
  5. // 判断1结果为false, 判断2结果为true时执行的代码块
  6. } else if (判断N) {
  7. // 判断(N-1)结果为false, 判断N结果为true时执行的代码块
  8. } else {
  9. // 判断N结果为false时执行的代码块
  10. }
  11. </script>
  • 另一种是 switch 语句. 语法:
  1. <script>
  2. switch (变量) {
  3. case 1:
  4. // do something 1...
  5. break; // 可选
  6. case 2:
  7. // do something 2...
  8. break; // 可选
  9. case N:
  10. // do something N...
  11. break; // 可选
  12. default:
  13. // do something default...
  14. break;
  15. }
  16. </script>

2.2 循环

  • for 循环
  1. <script>
  2. for(赋值语句; 判断语句; 更新值语句) {
  3. // 循环体, 当判断语句执行结果为true时, 执行循环体中的代码, 否则, 结束循环...
  4. }
  5. </script>
  • while 循环
  1. <script>
  2. while(判断语句) {
  3. // 循环体, 当判断语句执行结果为true时, 执行循环体中的代码, 否则, 结束循环...
  4. }
  5. </script>
  • do...while 循环
  1. <script>
  2. do {
  3. // 循环体, 先执行一遍循环体中的代码, 再执行判断, 当判断语句执行结果为true时, 继续执行循环体中的代码, 否则, 结束循环...
  4. } while (判断语句);
  5. </script>

3. JS对象与JSON格式字符串之间的相互转换

3.1 JS对象转换为JSON格式字符串

  • 转换过程, 会忽略JS对象中的这些成员: 方法不会被转换, undefined 值属性不会被转换, 原型对象成员不会被转换.

  • 使用 JSON.stringify() 方法转换.

    • 使用方法1: JSON.stringify(JS对象) , 把对象转换为JSON字符串, 转换所有能转换的成员.
  1. <script>
  2. var player = {
  3. name: 'James',
  4. age: 35,
  5. // 是否自由球员
  6. isFreeAgent: false,
  7. "player info": {
  8. height: 203,
  9. weight: 113,
  10. position: 'F-C'
  11. },
  12. // 退役日期
  13. retireDate: null,
  14. salary: undefined,
  15. // 方法
  16. getName: function() {
  17. return this.name;
  18. }
  19. };
  20. // 转换
  21. var playerStr = JSON.stringify(player);
  22. document.write(playerStr);
  23. /* result: {"name":"James","age":35,"isFreeAgent":false,"player info":{"height":203,"weight":113,"position":"F-C"},"retireDate":null} */
  24. </script>
  • 使用方法2: JSON.stringify(JS对象, 需转换的属性数组) , 只转换参数2指定的属性.
  1. <script>
  2. var player = {
  3. name: 'James',
  4. age: 35,
  5. // 是否自由球员
  6. isFreeAgent: false,
  7. "player info": {
  8. height: 203,
  9. weight: 113,
  10. position: 'F-C'
  11. },
  12. // 退役日期
  13. retireDate: null,
  14. salary: undefined,
  15. // 方法
  16. getName: function() {
  17. return this.name;
  18. }
  19. };
  20. // 只转换name, age
  21. var playerStr = JSON.stringify(player, ['name', 'age']);
  22. document.write(playerStr);
  23. /* result: {"name":"James","age":35} */
  24. </script>
  • 使用方法3: JSON.stringify(JS对象, function(遍历到的对象的属性名, 遍历到的对象的属性值)) , 遍历属性进行转换过程中, 使用参数2指定的回调函数先处理遍历到的属性值, 然后再对其进行转换; 有点类似PHP中的数组函数 array_walk .
  1. <script>
  2. var employee = {
  3. name: 'zhangsan',
  4. depart: '开发部',
  5. sex: 'female',
  6. age: 25,
  7. isMarried: false,
  8. hireDate: '2020-01-01',
  9. fireDate: null,
  10. salary: 8888
  11. };
  12. var empStr = JSON.stringify(employee, function(prop, value) {
  13. switch (prop) {
  14. case 'salary':
  15. return '保密';
  16. break;
  17. // 函数内部可以调用外部变量, 直接拿employee来用
  18. case 'age':
  19. return employee['sex'] == 'female' ? '女孩的年龄不要猜' : value;
  20. break;
  21. // 不希望转换的属性, 返回undefined即可
  22. case 'hireDate':
  23. return undefined;
  24. break;
  25. default:
  26. return value;
  27. }
  28. });
  29. document.write(empStr);
  30. /* result: {"name":"zhangsan","depart":"开发部","sex":"female","age":"女孩的年龄不要猜","isMarried":false,"fireDate":null,"salary":"保密"} */
  31. </script>
  • JSON.stringify() 的第三个参数, 是格式化json数据对象用的, 无关功能.
  1. <script>
  2. var employee = {
  3. name: 'zhangsan',
  4. depart: '开发部',
  5. sex: 'female',
  6. age: 25,
  7. isMarried: false,
  8. hireDate: '2020-01-01',
  9. fireDate: null,
  10. salary: 8888
  11. };
  12. var empStr = JSON.stringify(employee, function(prop, value) {
  13. return value;
  14. }, 4);// 第三个参数值为4, 表示在属性前面添加4个空格
  15. console.log(empStr);
  16. /*
  17. {
  18. "name": "zhangsan",
  19. "depart": "开发部",
  20. "sex": "female",
  21. "age": 25,
  22. "isMarried": false,
  23. "hireDate": "2020-01-01",
  24. "fireDate": null,
  25. "salary": 8888
  26. }
  27. */
  28. </script>

3.2 JSON格式字符串转换为JS对象

  • 使用JSON.parse(JSON字符串)函数
  1. <script>
  2. // 在js中, 可以通过在行末增加\来把字符串换行
  3. var empStr = '{\
  4. "name": "zhangsan",\
  5. "depart": "开发部",\
  6. "sex": "female",\
  7. "age": 25,\
  8. "isMarried": false,\
  9. "hireDate": "2020-01-01",\
  10. "fireDate": null,\
  11. "salary": 8888\
  12. }';
  13. // jsonStr => JS obj
  14. var empObj = JSON.parse(empStr);
  15. for(prop in empObj) {
  16. document.write(eprop + ': ' + empObj[prop] + '<br>');
  17. }
  18. /*result:
  19. name: zhangsan
  20. depart: 开发部
  21. sex: female
  22. age: 25
  23. isMarried: false
  24. hireDate: 2020-01-01
  25. fireDate: null
  26. salary: 8888
  27. */
  28. </script>
  • JSON.parse(JSON字符串, function(prop, value) {...}): 可以给第二个参数传入一个回调函数, 把回调函数处理后的属性值作为转换后的JS对象的属性值.
  1. <script>
  2. // 在js中, 可以通过在行末增加\来把字符串换行
  3. var empStr = '{\
  4. "name": "zhangsan",\
  5. "depart": "开发部",\
  6. "sex": "female",\
  7. "age": 25,\
  8. "isMarried": false,\
  9. "hireDate": "2020-01-01",\
  10. "fireDate": null,\
  11. "salary": 8888\
  12. }';
  13. // jsonStr => JS obj
  14. var empObj = JSON.parse(empStr, function(prop, value) {
  15. // 薪水保密
  16. if(prop == 'salary') {
  17. return '****';
  18. }
  19. return value;
  20. });
  21. for(prop in empObj) {
  22. document.write(eprop + ': ' + empObj[prop] + '<br>');
  23. }
  24. /*result:
  25. name: zhangsan
  26. depart: 开发部
  27. sex: female
  28. age: 25
  29. isMarried: false
  30. hireDate: 2020-01-01
  31. fireDate: null
  32. salary: ****
  33. */
  34. </script>

学习心得

数据类型和访问, 流程控制是每一门变成语言都有的内容, 无他, 必须记住. JS对象和JSON字符串之间的转换, 非常重要, 因为很多网站前后端的数据交互都是使用JSON数据. 将JS对象转换为字符串, 才能把前端数据发送到服务端(还可以用序列化的方式); 而服务端返回的JSON数据, 也需要经过转换成JS对象后, 才能渲染到模板中.

Correcting teacher:天蓬老师天蓬老师

Correction status:qualified

Teacher's comments:看来是理解了, 总结的很棒
Statement of this Website
The copyright of this blog article belongs to the blogger. Please specify the address when reprinting! If there is any infringement or violation of the law, please contact admin@php.cn Report processing!
All comments Speak rationally on civilized internet, please comply with News Comment Service Agreement
0 comments
Author's latest blog post
About us Disclaimer Sitemap
php.cn:Public welfare online PHP training,Help PHP learners grow quickly!