数据类型及引用问题
数据类型
基本数据类型:
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
都返回object
instanceof
:可以判断引用数据类型,返回布尔值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]
仍然指向原来的对象。