為了區分對象的類型,我們用typeof操作符獲取對象的類型,它總是返回一個字符串:
typeof 123; // 'number'
typeof NaN; // 'number'
typeof 'str'; // 'string'
typeof true; // 'boolean'
typeof undefined; // 'undefined'
typeof Math.abs; // 'function'
typeof null; // 'object'
typeof []; // 'object'
typeof {}; // 'object'
2.包裝對象
number、boolean和string都有包裝對象。
沒錯,在JavaScript中,字符串也區分string類型和它的包裝類型。包裝對象用new創建:
var n = new Number(123); // 123,生成了新的包裝類型
var b = new Boolean(true); // true,生成了新的包裝類型
var s = new String('str'); // 'str',生成了新的包裝類型
雖然包裝對象看上去和原來的值一模一樣,顯示出來也是一模一樣,
但他們的類型已經變為object了!所以,包裝對象和原始值用===比較會返回false:
typeof new Number(123); // 'object'
new Number(123) === 123; // false
typeof new Boolean(true); // 'object'
new Boolean(true) === true; // false
typeof new String('str'); // 'object'
new String('str') === 'str'; // false
所以閑的蛋疼也不要使用包裝對象!尤其是針對string類型!!!
如果我們在使用Number、Boolean和String時,沒有寫new會發生什么情況?
此時,Number()、Boolean和String()被當做普通函數,把任何類型的數據轉換為number、boolean和string類型(注意不是其包裝類型):
var n = Number('123'); // 123,相當于parseInt()或parseFloat()
typeof n; // 'number'
var b = Boolean('true'); // true
typeof b; // 'boolean'
var b2 = Boolean('false'); // true! 'false'字符串轉換結果為true!因為它是非空字符串!
var b3 = Boolean(''); // false
var s = String(123.45); // '123.45'
typeof s; // 'string'
總結一下,有這么幾條規則需要遵守:
不要使用new Number()、new Boolean()、new String()創建包裝對象;
用parseInt()或parseFloat()來轉換任意類型到number;
用String()來轉換任意類型到string,或者直接調用某個對象的toString()方法;
通常不必把任意類型轉換為boolean再判斷,因為可以直接寫if (myVar) {...};
typeof操作符可以判斷出number、boolean、string、function和undefined;
判斷Array要使用Array.isArray(arr);
判斷null請使用myVar === null;
判斷某個全局變量是否存在用typeof window.myVar === 'undefined';
函數內部判斷某個變量是否存在用typeof myVar === 'undefined'。
最后有細心的同學指出,任何對象都有toString()方法嗎?
null和undefined就沒有!確實如此,這兩個特殊值要除外,雖然null還偽裝成了object類型。
更細心的同學指出,number對象調用toString()報SyntaxError:
123.toString(); // SyntaxError
遇到這種情況,要特殊處理一下:
123..toString(); // '123', 注意是兩個點!
(123).toString(); // '123'
4.json
在JSON中,一共就這么幾種數據類型:
number:和JavaScript的number完全一致;
boolean:就是JavaScript的true或false;
string:就是JavaScript的string;
null:就是JavaScript的null;
array:就是JavaScript的Array表示方式——[];
object:就是JavaScript的{ ... }表示方式。
以及上面的任意組合。
并且,JSON還定死了字符集必須是UTF-8,表示多語言就沒有問題了。
為了統一解析,JSON的字符串規定必須用雙引號"",Object的鍵也必須用雙引號""。
由于JSON非常簡單,很快就風靡Web世界,并且成為ECMA標準。
幾乎所有編程語言都有解析JSON的庫,而在JavaScript中,我們可以直接使用JSON,
因為JavaScript內置了JSON的解析。
把任何JavaScript對象變成JSON,就是把這個對象序列化成一個JSON格式的字符串,
這樣才能夠通過網絡傳遞給其他計算機。
如果我們收到一個JSON格式的字符串,只需要把它反序列化成一個JavaScript對象,
就可以在JavaScript中直接使用這個對象了。
4.1.序列化
讓我們先把小明這個對象序列化成JSON格式的字符串:
var xiaoming = {
name: '小明',
age: 14,
gender: true,
height: 1.65,
grade: null,
'middle-school': '\\"W3C\\" Middle School',
skills: ['JavaScript', 'Java', 'Python', 'Lisp']
};
JSON.stringify(xiaoming); // '{"name":"小明","age":14,"gender":true,"height":1.65,"grade":null,"middle-school":"\\"W3C\\" Middle School","skills":["JavaScript","Java","Python","Lisp"]}'
要輸出得好看一些,可以加上參數,按縮進輸出:
JSON.stringify(xiaoming, null, ' ');
結果:
{
"name": "小明",
"age": 14,
"gender": true,
"height": 1.65,
"grade": null,
"middle-school": "\\"W3C\\" Middle School",
"skills": [
"JavaScript",
"Java",
"Python",
"Lisp"
]
}
第二個參數用于控制如何篩選對象的鍵值,如果我們只想輸出指定的屬性,可以傳入Array:
JSON.stringify(xiaoming, ['name', 'skills'], ' ');
結果:
{
"name": "小明",
"skills": [
"JavaScript",
"Java",
"Python",
"Lisp"
]
}
還可以傳入一個函數,這樣對象的每個鍵值對都會被函數先處理:
function convert(key, value) {
if (typeof value === 'string') {
return value.toUpperCase();
}
return value;
}
JSON.stringify(xiaoming, convert, ' ');
上面的代碼把所有屬性值都變成大寫:
{
"name": "小明",
"age": 14,
"gender": true,
"height": 1.65,
"grade": null,
"middle-school": "\\"W3C\\" MIDDLE SCHOOL",
"skills": [
"JAVASCRIPT",
"JAVA",
"PYTHON",
"LISP"
]
}
如果我們還想要精確控制如何序列化小明,可以給xiaoming定義一個toJSON()的方法,直接返回JSON應該序列化的數據:
var xiaoming = {
name: '小明',
age: 14,
gender: true,
height: 1.65,
grade: null,
'middle-school': '\\"W3C\\" Middle School',
skills: ['JavaScript', 'Java', 'Python', 'Lisp'],
toJSON: function () {
return { // 只輸出name和age,并且改變了key:
'Name': this.name,
'Age': this.age
};
}
};
JSON.stringify(xiaoming); // '{"Name":"小明","Age":14}'
4.2.反序列化
拿到一個JSON格式的字符串,我們直接用JSON.parse()把它變成一個JavaScript對象:
JSON.parse('[1,2,3,true]'); // [1, 2, 3, true]
JSON.parse('{"name":"小明","age":14}'); // Object {name: '小明', age: 14}
JSON.parse('true'); // true
JSON.parse('123.45'); // 123.45
JSON.parse()還可以接收一個函數,用來轉換解析出的屬性:
JSON.parse('{"name":"小明","age":14}', function (key, value) {
// 把number * 2:
if (key === 'name') {
return value + '同學';
}
return value;
}); // Object {name: '小明同學', age: 14}
在JavaScript中使用JSON,就是這么簡單!