字符串与JSON

一、代码习题

1.使用数组拼接出如下字符串 ,其中styles数组里的个数不定

var prod = {
    name: '女装',
    styles: ['短款', '冬季', '春装']
};
function getTpl(data){
//todo...
};
var result = getTplStr(prod);  //result为下面的字符串

<dl class="product">
    <dt>女装</dt>
    <dd>短款</dd>
    <dd>冬季</dd>
    <dd>春装</dd>
</dl>
----------------------------------------------------------------------------------------
var prod = {
    name: '女装',
    styles: ['短款', '冬季', '春装']
};
function getTpl(data){
    var str = '';
    str += '<dl class="product">\n';
  str += '\t<dt>' + data.name + '</dt>\n';
  for (var key in data.styles){
    str += '\t<dd>' + data.styles[key] + '</dd>\n'; 
  }
  str += '</dl>';
  return str;
};
var result = getTplStr(prod);  //result为下面的字符串

2.写出两种以上声明多行字符串的方法 例如:

var str = 'abcdeabcdeabcdeancdeabcdeabcdeabcdeancdeabcdeabcdeabcdeancdeabcdeabcdeabcdeancde'

这段字符串很长,如何多行优雅的显示

//反斜杠‘\’换行法
var str = 'aaaa\
bbbb\
cccc\
dddd';
  // 反斜杠‘\’后面不能有空格
console.log(str);
  // aaaabbbbccccdddd


/*--------------------------------------------------------*/
  // 字符串‘+’的拼接法
var str = 'aaaa' + 
          'bbbb' + 
          'cccc' + 
          'dddd' ;
console.log(str);
  // aaaabbbbccccdddd


/*--------------------------------------------------------*/
  // 函数的注释法
function fn(){/*
aaaa
bbbb
cccc
dddd
*/}
var str = fn.toString().split('\n').slice(1,length-1).join('');
  /*toString() 把函数 fn 转化成字符串
    split('\n') 把字符串以换行符‘\n’为切割点切割成数组
    slice(1,-1) 把数组掐头去尾截取出来
    join('') 把数组以空字符串''为连接点连接成字符串
  */ 
console.log(str)
  // aaaabbbbccccdddd

3、补全如下代码,让输出结果为字符串: hello\xuguojun

var str = 'hello\\\\xuguojun';
console.log(str);
  // hello\\xuguojun

4.以下代码输出什么?为什么

var str = 'jiguoqu\nruoyu'
console.log(str.length)
  // 13    因为'\n'是一个换行符

5.写一个函数,判断一个字符串是回文字符串

// (1)用数组的 reverse() 倒叙法
var str = 'abcdedcba'
function isReverse(newStr){
  return newStr === newStr.split('').reverse().join('')
}
isReverse(str)  // true

/*split('') 把字符串每个字切割成数组元素
  reverse() 把数组倒叙排列
  join('')把数组连接成字符串
*/


/*--------------------------------------------------------*/
  // (2)倒叙遍历数组的方法
var str = 'abcdedcba'
function isReverse(newStr){
  var arr1 = [];
  var arr2 = newStr.split('');
  var i = 0;
  for(var n = 0; n < arr2.length; n++){
    arr1[i] = arr2[arr2.length-1-n];
    i++;
  }
  return arr1.join('') === arr2.join('');  // arr1 和 arr2是数组,要连成字符串比较。
}
isReverse(str);  // true

6.写一个函数,统计字符串里出现出现频率最多的字符

var str = 'hello world yhhhhhhh';
function fn(str){
  var obj = {};
  for(var i in str){
    if(obj[str[i]]){
      obj[str[i]]++;
    }else{
      obj[str[i]] = 1;
    }
  }    /*把字符串统计成对象*/ 

  var count = 0;
  var maxValue;
  for(var key in obj){
    if(obj[key] > count){
      count = obj[key];
      maxValue = key;
    }
  }    /*遍历对象寻找最大的键值和键名*/

  return 'maxValue: ' + maxValue + '\n' + 'count: ' + count;
}

fn(str);

/*
"maxValue: h
count: 8"
*/

7.写一个camelize函数,把my-short-string形式的字符串转化成myShortString形式的字符串

function camelize(str) {
    var arr = str.split('-');
    var arr1 = [];
    for (var i=0; i<arr.length; i++) {
        if (i>0) {
            arr1.push(arr[i].replace(arr[i][0],arr[i][0].toUpperCase()));
        }else {
            arr1.push(arr[i])
        }   
    }
    return arr1.join('');
}

camelize("my-short-string");   // "myShortString"
camelize("background-color");  // "backgroundColor"
camelize("list-style-image");  // "listStyleImage"

8.写一个 ucFirst函数,返回第一个字母为大写的字符串

function ucFirst(str){
  var newStr = str.replace(str[0], str[0].toUpperCase());
  return newStr;
}

ucFirst("hunger")  // "Hunger"

9.写一个函数truncate(str, maxlength), 如果str的长度大于maxlength,会把str截断到maxlength长,并加上...

function truncate(str, maxlength){
  if(str.length > maxlength){
    return str.slice(0,maxlength) + "...";
  }else{
    return str;
  }
}

truncate("hello, this is hunger valley,", 10);  
  // "hello, thi..."
truncate("hello world", 20);  
  // "hello world"

二、什么是 JSON格式数据?JSON格式数据如何表示对象?什么是 json 对象字面量?window.JSON 是什么?

什么是JSOn格式数据

JSON 格式(JavaScript Object Notation 的缩写)是一种用于数据交换的文本格式,2001年由 Douglas Crockford 提出,目的是取代繁琐笨重的 XML 格式。

相比 XML 格式,JSON 格式有两个显著的优点:书写简单,一目了然;符合 JavaScript 原生语法,可以由解释引擎直接处理,不用另外添加解析代码。所以,JSON迅速被接受,已经成为各大网站交换数据的标准格式,并被写入ECMAScript 5,成为标准的一部分。

关于JSON最重要的是要理解它是一种数据格式,不是一种编程语言。虽然具有相同的语法形式,但JSON并不属于JavaScript。而且,并不是只有JavaScript才使用JSON,毕竟JSON只是一种数据格式。很多编程语言都有针对JSON的解析器和序列化器。

JSON格式数据如何表示对象

JSON 数据数据表示对象的书写格式是:

对象是一个无序的“‘名称/值’对”集合。一个对象以“{”(左括号)开始,“}”(右括号)结束。每个“名称”后跟一个“:”(冒号);“‘名称/值’ 对”之间使用“,”(逗号)分隔。

json对象就是json的值,基本要符合以下规则:

  1. 复合类型的值只能是数组或对象,不能是函数、正则表达式对象、日期对象。
  2. 简单类型的值只有四种:字符串、数值(必须以十进制表示)、布尔值和null(不能使用NaN, Infinity, -Infinity和undefined)。
  3. 字符串必须使用双引号表示,不能使用单引号。
  4. 对象的键名必须放在双引号里面。
  5. 数组或对象最后一个成员的后面,不能加逗号。

以下是合格的 JSON 值:

["one", "two", "three"]

{ "one": 1, "two": 2, "three": 3 }

{"names": ["张三", "李四"] }

[ { "name": "张三"}, {"name": "李四"} ]

以下是不合格的 JSON 值:

{ name: "张三", 'age': 32 }  // 属性名必须使用双引号

[32, 64, 128, 0xFFF] // 不能使用十六进制值

{ "name": "张三", "age": undefined } // 不能使用undefined

{ "name": "张三",
  "birthday": new Date('Fri, 26 Aug 2011 07:13:10 GMT'),
  "getName": function() {
      return this.name;
  }
} // 不能使用函数和日期对象

需要注意的是,空数组和空对象都是合格的 JSON 值,null本身也是一个合格的 JSON 值。

ES5 新增了JSON对象,用来处理 JSON 格式数据。它有两个方法:JSON.stringify()和JSON.parse()。

什么是 json 对象字面量

对象字面量其实就是一种简单的描素以及声明方式。例如: var count = { "one": 1, "two": 2, "three": 3 }, 因为本身 json 就是 JavaScript 语法集的一种,所以 json 字面量就是用 json 格式的 JavaScript 对象字面量

window.JSON 是什么

window.JSON是ECMAScript 5定义的一个原生的浏览器内置对象,用来检测对JSON的支持情况。例如,IE8版本以上才内置支持JSON.parse方法,对此常见这样的写法:

if(window.JOSN){
   jsonObj2 = JSON.parse(json);
}else{
......
}

三、如何把JSON 格式的字符串转换为 JS 对象?如何把 JS对象转换为 JSON 格式的字符串?

如何把JSON 格式的字符串转换为 JS 对象

JSON.parse方法用于将JSON格式的字符串转化成对象。

JSON.parse('{}') // {}
JSON.parse('true') // true
JSON.parse('"foo"') // "foo"
JSON.parse('[1, 5, "false"]') // [1, 5, "false"]
JSON.parse('null') // null

var o = JSON.parse('{"name": "张三"}'); //Object {name: "张三"}
o.name // 张三

如果传入的字符串不是有效的JSON格式,JSON.parse方法将报错。

JSON.parse("'String'") 
// SyntaxError: Unexpected token ' in JSON

上面代码中,双引号字符串中是一个单引号字符串,因为单引号字符串不符合JSON格式,所以报错。

JSON.parse方法可以接受一个处理函数

function f(key, value) {
  if (key === ''){
    return value;
  }
  if (key === 'a') {
    return value + 10;
  }
}

var o = JSON.parse('{"a":1,"b":2}', f);
o //{a:11}
o.a // 11
o.b // undefined

如何把 JS对象转换为 JSON 格式的字符串

JSON.stringify方法用于将一个值转为字符串,该字符串符合 JSON 格式,并且可以被JSON.parse方法还原。

JSON.stringify('abc') // ""abc""
JSON.stringify(1) // "1"
JSON.stringify(false) // "false"
JSON.stringify([]) // "[]"
JSON.stringify({}) // "{}"

JSON.stringify([1, "false", false])
// '[1,"false",false]'

JSON.stringify({ name: "张三" })
// '{"name":"张三"}'

上面代码将各种类型的值,转成 JSON 字符串。

需要注意的是,对于原始类型的字符串,转换结果会带双引号。

JSON.stringify('foo') //""foo""
JSON.stringify('foo') === "foo" // false
JSON.stringify('foo') === "\"foo\"" // true

如果原始对象中,有一个成员的值是undefined、函数或 XML 对象,这个成员会被过滤。

var obj = {
  a: undefined,
  b: function () {}
};

JSON.stringify(obj) // "{}"

上面代码中,对象obj的a属性是undefined,而b属性是一个函数,结果都被JSON.stringify过滤。

如果数组的成员是undefined、函数或 XML 对象,则这些值被转成null。

var arr = [undefined, function () {}];
JSON.stringify(arr) // "[null,null]"

正则对象会被转成空对象。

JSON.stringify(/foo/) // "{}"

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏Crossin的编程教室

关于函数参数传递,80%人都错了

https://docs.python.org/3/faq/programming.html#how-do-i-write-a-function-with-ou...

993
来自专栏从零开始学 Web 前端

从零开始学 Web 之 JavaScript(三)函数

全局变量:在 script 使用 var 定义的变量(所有的 script 共享其全局性,js 里面没有块级作用域概念,只有全局作用域和局部作用域)。

602
来自专栏HTML5学堂

2015.12.30 HTML5真题练习

HTML5学堂:每天一道题,强壮程序员!今日主要涉及函数与参数的12.29日题目的解答,以及一道简单的作用域的题目。 HTML5真题【2015.12.29】答案...

3156
来自专栏网络

Bootstrap HTML编码规范

语法 用两个空格来代替制表符(tab) -- 这是唯一能保证在所有环境下获得一致展现的方法。 嵌套元素应当缩进一次(即两个空格)。 对于属性的定义,确保全部使用...

1709
来自专栏技术/开源

从C#到TypeScript - 类型

从C#到TypeScript - 类型 TypeScript和C#一样是微软搞出来的,而且都是大牛Anders Hejlsberg领导开发的,它们之间有很多共同...

1925
来自专栏Nian糕的私人厨房

JavaScript 基础

JavaScript 是一种轻量级,解释型的,有着函数优先 (First-class Function) 的编程语言,虽然它是作为开发 WEB 页面的脚本语言而...

915
来自专栏Kevin-ZhangCG

[ Java学习基础 ] Java的继承与多态

1976
来自专栏BestSDK

封装、私有,一文掌握Python关键代码

首先,什么是 Python?根据 Python 创建者 Guido van Rossum 所言,Python 是一种高级编程语言,其设计的核心理念是代码的易读性...

2963
来自专栏HTML5学堂

2015.12.02 HTML5真题练习

HTML5学堂:每天一道题,强壮程序员!今日主要涉及昨日题目的解答,以及一道涉及二进制的题目。 HTML5真题【2015.12.01】答案解析 昨日真题题目如下...

3569
来自专栏从零开始学 Web 前端

从零开始学 Web 之 Vue.js(五)Vue的动画

在这里我会从 Web 前端零基础开始,一步步学习 Web 相关的知识点,期间也会分享一些好玩的项目。现在就让我们一起进入 Web 前端学习的冒险之旅吧!

743

扫码关注云+社区