JavaScript 中的原始值(undefined、null 、 布爾值、數值和字符串)於對象(包括數組和函數)有著根本區別。
原始值是不可更改的:任何方法都無法改變(或“突變”)一個原始值。
對於數字和布爾值來說顯然如此-----改變數字的值本身就說不通,而對字符串來說就不那麼明顯了,
因為字符串看起來是有字符組成的數組,我們期望可以通過指定索引來修改字符串中的字符。
實際上,JavaScript是禁止這樣做的。
字符串中所有的方法看上去返回了一個修改後的字符串,實際上返回的是一個新的字符串值。
[code<>]
例如:
var s = "hello"; //定義一個有小寫字母組成的文本
s.toUpperCase(); //返回“HELLO”,但並沒有改變s的值
s //=>"hello": 原來字符串的值並未改變
比較
原始值得比較是值得比較:只有在它們的值相等時它們才相等。
如果比較兩個單獨的字符串,當且僅當它們的長度相等且每個索引的字符都相等時,JavaScript才認為它們相等。
對象和原始值不同。首先,它們是可變的 -----它們的值是可修改的:
var o ={x:1}; //定義一個對象
o.x=2; //通過修改對象屬性值來修改對象
o.y=3; //再次修改這個對象,給它增加一個新屬性
var a = [1,2,3]; //數組也可修改的
a[0]=0; //修改數組的一個元素
a[3]=4; //給數組增加一個新元素
對象的比較並非值得比較:即使兩個對象包含同樣的屬性及相同的值,它們也不是相等的。
各個索引元素完全相等的數組也不相等。
var o = {x:1}, p = {x: 1}; //具有相同屬性的兩個對象
o===p; //=>false : 兩個單獨的對象永不相等
var a= [] , b = []; //兩個單獨的空數組
a===b; //=>false : 兩個單獨的數組永不相等
注:a==b 也是false
我們通常將對象稱為引用類型(reference type),以此來和JavaScript的基本類型區分開來。
依照術語的叫法,對象都是引用(reference),對象的比較均是引用的比較:當且僅當它們引用同一個基對象時,它們才相等。
var a = []; //定義一個引用空數組的變量a
var b= a; //變量b引用同一個數組
b[0]=1; //通過變量b 來修改引用的數組
a[0] //=> 1 : 變量a 也回修改
a===b //=> true : a和b引用同一個數組,因此相等
a==b //=> true : a和b引用同一個數組,因此相等
就像你剛剛看到的如上代碼,將對象或數組復制給一個變量,激進是復制的引用值:對象本身並有復制一次。
如果你想得帶一個對象或數組的副本,則必須顯示復制對象的每一個屬性或數組的每個元素。
下面這個例子通過循環完成數組的復制(深拷貝數組):
var a = ['a','b','c']; //待復制的數組
var b= []; //復制到的目標空數組
for (var i = 0; i<a.length ; i++) // 遍歷a[]中的每個元素
{
b[i]=a[i] //強元素之復制到b中
}
下面是一個, 深拷貝一個方法(深拷貝對象)
function cloneObject(obj) {
var clone = {};
for(var i in obj) {
if(typeof(obj[i])=="object" && obj[i] != null)
clone[i] = cloneObject(obj[i]);
else
clone[i] = obj[i];
}
return clone;
}
//此方法用到了 遞歸,不清楚的請自行百度一下
//深拷貝的另外兩種方法
//使用原型
function object(o) {
function F() {}
F.prototype = o;
return new F();
}
var newObject = object(oldObject);
//通過JSON
var newObject = JSON.parse(JSON.stringify(oldObject));
類型轉換
JavaScript 中的取值類型非常靈活,我們已經從布爾值看到了這一點:
當JavaScript 期望使用一個布爾值的時候,你可以提供任意類型值,JavaScript 將根據需要自行轉換類型。
一些值(真值)轉換為 true,其他值(假值)轉換為 false.
在其他類型中同樣適用:
如果JavaScript 期望使用一個字符串,它吧給定的值將轉換為字符串。
如果JavaScript 期望使用一個數字,他就把給定的值將轉換為數字。(如果轉換結果無意義,將返回NaN)
一些例子:
10 + " object" ; //=>"10 object": 數字10將成字符串
"7" * "4" ; //=>28 : 兩個字符串均轉換為數字
var n= 1- "x" ; //=>NaN : 字符串“x”無法轉換為數字
n+" object" //=>“NaN object ” : NaN轉換為字符串“NaN”
下表 簡要說明了JavaScript 中如何進行類型轉換的。[/code<>]
<img src="http://hovertree.com/hvtimg/201512/vq3pkil5.png" art="js原始值" />
轉換和相等性
由於JavaScript可以靈活的類型轉換,因此其“==” 相等運算符也隨相等的含義靈活多變。
例如 ,如下這些比較結果均是 true:
null == undefined //這兩個值被認為相等
"0" == 0 //比較前字符串轉換成數字
0 == false //比較前布爾值轉換成數字
"0" == false //比較前字符串和布爾值都轉換成數字
“==” 等於運算符在判斷兩個值是否相等時做了類型轉換(之後會詳解)
“===” 恆等運算符在判斷兩個值是否相等時並未做任何類型轉換。
1、對於string,number等基礎類型(原始值),==和===是有區別的
1)不同類型間比較,==之比較“轉化成同一類型後的值”看“值”是否相等,===如果類型不同,其結果就是不等
2)同類型比較,直接進行“值”比較,兩者結果一樣
2、對於Array,Object等高級類型(對象引用),==和===是沒有區別的
進行“指針地址”比較
3、基礎類型(原始值)與高級類型(對象引用),==和===是有區別的
1)對於==,將高級轉化為基礎類型,進行“值”比較
2)因為類型不同,===結果為false