数据类型及引用问题
数据类型
基本数据类型:
string、number、boolean、null、undefined、symbol引用数据类型:
object、array、function
区别示例
console.log(typeof null) // object
console.log(typeof []) // object
console.log(typeof {}) // object
console.log(typeof function () {}) // function
console.log(null instanceof Object) // false
console.log([] instanceof Object) // true
console.log({} instanceof Object) // true
console.log(function () {} instanceof Object) // true// 基本数据类型复制
let a = 1
let b = a
a = 2
console.log(b) // 1
// 引用数据类型复制
let obj1 = { a: 1 }
let obj2 = obj1
obj1.a = 2
console.log(obj2) // { a: 2 }数据类型的判断
typeof:可以判断基本数据类型,除了null和array都返回objectinstanceof:可以判断引用数据类型,返回布尔值Object.prototype.toString.call():可以判断所有数据类型,返回字符串
类型区别
null和undefined是基本数据类型,null表示空对象,undefined表示未定义array和object都是引用数据类型,array是特殊的对象,object是泛指function是引用数据类型,function是特殊的对象NaN是number类型,表示非数字
问题记录
示例 1
const arr = ["a", "b", "c"]
for (let index = 0; index < arr.length; index++) {
let element = arr[index] // 修改 element 不会影响 arr[index] 的值
element = "bc"
}
console.log(arr) // ["a", "b", "c"]arr[index]返回的是字符串"a","b", 或"c",这些都是基本数据类型。当你将
arr[index]赋值给element时,element得到的是字符串的值,而不是对数组中元素的引用。修改
element不会改变arr中的值,因为element是一个独立的变量,保存的是字符串的副本。基本数据类型(如字符串、数字、布尔值等)在赋值时是按值传递的,而不是按引用传递的。因此,修改
element不会影响原数组。
示例 2
const arr = [{ a: 1 }, { a: 2 }, { a: 3 }]
for (let index = 0; index < arr.length; index++) {
let element = arr[index]
element.a = 3 // 修改 element.a 会影响 arr[index].a 的值
element = { a: 4 } // 重新赋值 element,不会影响 arr[index]
}
console.log(arr) // [{ a: 3 }, { a: 3 }, { a: 3 }]element.a = 3;
element和arr[index]引用的是同一个对象。修改
element.a实际上是在修改arr[index].a,因为它们指向同一个对象。
element = { a: 4 };
这里,
element被赋予了一个新的对象{ a: 4 }。这只是改变了
element的引用,并没有改变arr[index]的引用。arr[index]仍然指向原来的对象。