一、请解释JavaScript中的null和undefined的区别?
在JavaScript中,null
和 undefined
都是表示某种“无”或“空”的值,但它们之间有着明确的区别和用途。
-
undefined:
undefined
是一个特殊的值,它表示变量未定义或者未赋值。- 当你声明了一个变量但没有给它赋值时,这个变量的值就是
undefined
。 - 例如:
let x;
在这种情况下,x
的值就是undefined
。 - 另外,当你尝试访问一个不存在的对象属性时,也会返回
undefined
。 - 例如:
let obj = {}; console.log(obj.nonExistentProperty); // 输出 undefined
typeof undefined
返回 “undefined”。undefined
实际上是全局对象(在浏览器中是window
,在Node.js中是global
)的一个属性。
-
null:
null
是一个特殊的值,表示“无”或“空引用”。- 它常被用来表示一个空的对象引用。
- 例如,当你想要清除一个对象引用时,你可以将其设置为
null
,以确保它不再指向任何对象。 typeof null
返回 “object”,但这是一个历史遗留问题,实际上null
并不是对象。null
是JavaScript中的一个字面量,不是全局对象的属性。
区别:
undefined
表示变量未定义或未赋值,而null
表示一个空的对象引用。undefined
是由变量自身的状态决定的,而null
是由程序员显式设置的。typeof undefined
返回 “undefined”,而typeof null
返回 “object”(尽管这是一个错误,但出于历史原因,它一直存在)。
在编程实践中,通常推荐在你知道某个变量将来会引用一个对象时,使用 null
进行初始化,而不是使用 undefined
。这样可以更明确地表示该变量的意图和状态。
二、请列出一些常用的数组操作方法,并简述其用途?
在JavaScript中,数组(Array)是一个非常重要的数据类型,它提供了许多内置的方法来操作和处理数据。以下是一些常用的数组操作方法及其用途:
-
push()
- 用途:向数组的末尾添加一个或多个元素,并返回新的长度。
- 示例:
let arr = [1, 2, 3]; arr.push(4, 5); // arr 现在是 [1, 2, 3, 4, 5]
-
pop()
- 用途:删除并返回数组的最后一个元素。
- 示例:
let arr = [1, 2, 3]; let last = arr.pop(); // arr 现在是 [1, 2],last 是 3
-
shift()
- 用途:删除并返回数组的第一个元素。
- 示例:
let arr = [1, 2, 3]; let first = arr.shift(); // arr 现在是 [2, 3],first 是 1
-
unshift()
- 用途:向数组的开头添加一个或多个元素,并返回新的长度。
- 示例:
let arr = [1, 2, 3]; arr.unshift(0); // arr 现在是 [0, 1, 2, 3]
-
splice()
- 用途:通过删除或替换现有元素或者添加新元素来修改数组,并返回被删除的元素。
- 示例:
let arr = [1, 2, 3, 4, 5]; let removed = arr.splice(2, 2, 'a', 'b'); // arr 现在是 [1, 2, 'a', 'b', 5],removed 是 [3, 4]
-
slice()
- 用途:返回一个新的数组对象,它是一个由开始到结束(不包括结束)选择的、由原数组的浅拷贝构成。原始数组不会被改变。
- 示例:
let arr = [1, 2, 3, 4, 5]; let sliced = arr.slice(1, 3); // arr 仍然是 [1, 2, 3, 4, 5],sliced 是 [2, 3]
-
concat()
- 用途:用于合并两个或多个数组。此方法不会更改现有数组,而是返回一个新数组。
- 示例:
let arr1 = [1, 2, 3]; let arr2 = [4, 5, 6]; let arr3 = arr1.concat(arr2); // arr1 仍然是 [1, 2, 3],arr2 仍然是 [4, 5, 6],arr3 是 [1, 2, 3, 4, 5, 6]
-
join()
- 用途:将一个数组(或一个类数组对象)的所有元素转换成一个字符串并返回这个字符串。元素是通过指定的分隔符进行分隔的。
- 示例:
let arr = [1, 2, 3]; let str = arr.join(','); // str 是 "1,2,3"
-
reverse()
- 用途:颠倒数组中元素的顺序。
- 示例:
let arr = [1, 2, 3]; arr.reverse(); // arr 现在是 [3, 2, 1]
-
sort()
- 用途:对数组的元素进行排序,并返回数组。默认排序顺序是根据字符串Unicode码点。
- 示例:
let arr = [5, 2, 9, 1]; arr.sort(); // arr 现在是 [1, 2, 5, 9],但注意 5 在 9 前面,因为字符串 '5' 在 '9' 前面
- 注意:
sort()
方法会改变原数组。如果你需要按照数字大小排序,需要提供一个比较函数。
-
map()
- 用途:创建一个新数组,其结果是该数组中的每个元素都调用一个提供的函数后返回的结果。
- 示例:
let arr = [1, 2, 3]; let doubled = arr.map(x => x * 2); // doubled 是 [2, 4, 6]
-
filter()
- 用途:创建一个新数组, 其包含通过所提供函数实现的测试的所有元素。
- 示例:`let arr = [1, 2, 3