字符串與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/) // "{}"
最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市,隨后出現的幾起案子,更是在濱河造成了極大的恐慌,老刑警劉巖,帶你破解...
    沈念sama閱讀 229,698評論 6 539
  • 序言:濱河連續發生了三起死亡事件,死亡現場離奇詭異,居然都是意外死亡,警方通過查閱死者的電腦和手機,發現死者居然都...
    沈念sama閱讀 99,202評論 3 426
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人,你說我怎么就攤上這事?!?“怎么了?”我有些...
    開封第一講書人閱讀 177,742評論 0 382
  • 文/不壞的土叔 我叫張陵,是天一觀的道長。 經常有香客問我,道長,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 63,580評論 1 316
  • 正文 為了忘掉前任,我火速辦了婚禮,結果婚禮上,老公的妹妹穿的比我還像新娘。我一直安慰自己,他們只是感情好,可當我...
    茶點故事閱讀 72,297評論 6 410
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著,像睡著了一般。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發上,一...
    開封第一講書人閱讀 55,688評論 1 327
  • 那天,我揣著相機與錄音,去河邊找鬼。 笑死,一個胖子當著我的面吹牛,可吹牛的內容都是我干的。 我是一名探鬼主播,決...
    沈念sama閱讀 43,693評論 3 444
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了?” 一聲冷哼從身側響起,我...
    開封第一講書人閱讀 42,875評論 0 289
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后,有當地人在樹林里發現了一具尸體,經...
    沈念sama閱讀 49,438評論 1 335
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 41,183評論 3 356
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發現自己被綠了。 大學時的朋友給我發了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 43,384評論 1 372
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖,靈堂內的尸體忽然破棺而出,到底是詐尸還是另有隱情,我是刑警寧澤,帶...
    沈念sama閱讀 38,931評論 5 363
  • 正文 年R本政府宣布,位于F島的核電站,受9級特大地震影響,放射性物質發生泄漏。R本人自食惡果不足惜,卻給世界環境...
    茶點故事閱讀 44,612評論 3 348
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧,春花似錦、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 35,022評論 0 28
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至,卻和暖如春,著一層夾襖步出監牢的瞬間,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 36,297評論 1 292
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人。 一個月前我還...
    沈念sama閱讀 52,093評論 3 397
  • 正文 我出身青樓,卻偏偏與公主長得像,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 48,330評論 2 377

推薦閱讀更多精彩內容

  • 0、對于 HTTP 協議而言,HTML、CSS、JS、JSON 的本質都是什么? HTML就是符合HTML語法的字...
    怎么昵稱閱讀 1,622評論 0 3
  • 1,對于 HTTP 協議而言,HTML、CSS、JS、JSON 的本質都是什么? 對于HTTP協議而言,html、...
    進擊的前端_風笑影閱讀 836評論 0 0
  • 1.使用數組拼接出如下字符串 };```function getTpl(data){var arr = "";fo...
    湖衣閱讀 322評論 0 0
  • 1、使用數組拼接出如下字符串 2、寫出兩種以上聲明多行字符串的方法利用連接運算符(+)可以連接多個單行字符串,用來...
    青鳴閱讀 399評論 0 0
  • 我要寫的是我班里的幾個朋友,我寫下文字的時間是實習以前的最后一個期末,他們都走了。 這篇文章的主角是H。 H是我認...
    張坤2016閱讀 309評論 0 0