1. JavaScript中的原始值(undefined、null、布尔值、数值和字符串)与对象(包括数组和函数)有一个本质的区别。
2.
原始值:是不可修改的,即没有办法改变原始值
。
理解:
①数值和布尔值:修改一个数值的值没什么用。
②字符串:字符串类似字符数组,JavaScript不允许修改某个索引位置的字符。
所有看起来返回一个修改后字符串的字符串方法,实际上返回的都是一个新字符串。
let s = "hello";//一个全部小写的字符串
s.toUpperCase();//返回"HELLO",但不会修改s
s//"hello",原始字符串并未改变
3. 原始值是按值比较的,即两个值只有在它们的值相同的时候才是相同的。
例如,在比较两个不同的字符串时,当且仅当这两个字符串长度相同并且每个索引的字符也相同时,JavaScript才认为它们相等。
4. 对象不同于原始值,对象是可修改的,即它们的值可以改变。
let o = {x:1};//先声明一个对象
o.x = 2;//修改:改变他的一个属性的值
o.y = 3;//修改:为他添加一个新属性
let a = [1,2,3];//声明一个数组
a[0] = 0;//修改:改变数组中一个元素的值
a[3] = 4;//修改:为数组添加一个新元素
注意:
对象不是按值比较的,两个不同的对象即使拥有完全相同的属性和值,它们也不相等。同样,两个不同的数组,即使每个元素都相同,顺序也相同,它们也不相等。
let o = {x:1},p = {x:1};//两个对象,拥有相同的属性
o === p;//false:不同的对象永远也不会相等
let a =[],b= [];//两个不同的空数组
a === b;//false:不同的数组永远也不会相等
5. 对象有时候被称作引用类型(reference type),对象值就是引用,对象是按引用比较的。
两个对象值当且仅当它们引用同一个底层对象时,才是相等的。
let a = [];//声明一个空数组
let b = a;//现在b引用了同一个数组
b[0] = 1;//修改变量b引用的数组
a[0];//1:变化也能通过变量a看到
a === b;//true:a和b引用了同一个对象,所以他们相等
6. 把对象(或数组)赋值给一个变量, 其实是在赋值引用,并不会创建对象的新副本。如果想创建对象或数组的新副本,必须显式复制对象的属性或数组的元素。
let a = ["a","b","c"];//想要复制的原数组
let b = [];//想要复制的另一个数组
for(let i = 0;i<a.length;i++){//对a[]中的每个索引
b[i] = a[i]; //把a的元素复制到b中
}
let c = Array.from(b);//在ES6中,可以使用Array.from()复制数组
7.如果要比较两个不同的对象或数组,必须比较它们的属性或元素。
function equalArrays(a,b){
if(a === b) return true;//同一个数组相等
if(a.length !== b.length) return false;//大小不同的数组不相等
for(let i = 0;i < a.length;i++){//循环遍历所有元素
if(a[i] !== b[i]) return false;//两个数组下标相同,对应元素不相等,两个数组不相等
}
return true;//否则,两个数组相等
}