有关JavaScript的10个怪癖和秘密分享
JavaScript是一门流行的编程语言,但相信大家在使用的过程中会遇到一些奇怪的行为和不为人知的秘密。本篇攻略将为你揭露JavaScript中的10个怪癖和秘密,希望能帮助你更好地理解和使用JavaScript。
1. 变量作用域
在JavaScript中,变量的作用域有全局作用域和函数作用域。当在函数内部声明变量时,该变量的作用域限制在函数内部,在函数外部无法访问。但如果没有使用var、let或const关键字声明变量,则该变量成为全局变量,可以在任何地方访问。
示例:
function test() {
var a = 1;
if (true) {
var b = 2;
let c = 3;
}
console.log(a); // 输出1
console.log(b); // 输出2
console.log(c); // 报错,无法访问变量c
}
test();
2. 自动类型转换
JavaScript是一门动态类型语言,变量类型不需要提前声明,也可以在运行时进行自动类型转换。不同类型的变量进行运算时会自动转换成相同的类型,这可能会导致意想不到的结果。
示例:
console.log( 1 + "2" + "2" ); // 输出 "122",因为1首先被转换成字符串类型,再与"2"进行拼接
console.log(1 + +"2" + "2"); // 输出 "32",因为+"2"先被转换成数字2,1+2=3,再和"2"进行拼接
console.log(1 + -"1" + "2"); // 输出 "02",因为-"1"先被转换成数字-1,1+(-1)=0,再和"2"进行拼接
console.log(+"1" + "1" + "2"); // 输出 "112",因为+"1"先被转换成数字1,再与"1"和"2"进行拼接
console.log( "A" - "B" + "2"); // 输出 "NaN2",因为"A"和"B"都不能转换成数字,所以相减的结果为NaN,再和"2"进行拼接
console.log( "A" - "B" + 2 ); // 输出 NaN,因为"A"和"B"都不能转换成数字,相减的结果为NaN,再加上数字2,结果仍然是NaN
3. 闭包
闭包是指一个函数返回另一个函数,然后将其保存在一个变量中,这个变量就成为了一个闭包。闭包会使得内部函数可以访问外部函数中的变量和参数,而这些变量和参数在外部函数执行完毕后仍然保存在内存中。
示例:
function outerFunc() {
var a = 1;
function innerFunc() {
console.log(a);
}
return innerFunc;
}
var closure = outerFunc();
closure(); // 输出1
4. NaN
NaN是JavaScript中特殊的值,表示不是一个数字。NaN和任何值都不相等,包括自己。判断一个值是否为NaN的方法是使用isNaN()函数。
示例:
console.log(NaN == NaN); // false
console.log(NaN === NaN); // false
console.log(isNaN(NaN)); // true
console.log(isNaN("abc")); // true,因为"abc"不能转换成数字
console.log(isFinite("123")); // true,因为"123"可以转换成有穷数
5. setTimeout
setTimeout是JavaScript中用来延迟执行代码的函数。setTimeout接受两个参数,第一个参数是要执行的代码,可以是一个代码块或一个函数,第二个参数是延迟的时间,单位是毫秒。
示例:
console.log("start");
setTimeout(function() {
console.log("middle");
}, 1000);
console.log("end");
该代码输出的结果是先输出"start"和"end",再在1秒后输出"middle"。
6. 数组拼接
JavaScript中可以使用concat()函数将一个数组与另一个数组拼接。但是如果拼接的数组是多维数组时,直接使用concat()函数会将多维数组拆开,只拼接一维数组。
示例:
var arr1 = [1, 2];
var arr2 = [[3, 4], [5, 6]];
var arr3 = arr1.concat(arr2);
console.log(arr3); // 输出 [1, 2, [3, 4], [5, 6]]
7. 正则表达式
JavaScript中的正则表达式是强大的工具,可以在字符串中搜索、替换和匹配文本。正则表达式是由一组字符和元字符组成的模式,每个字符和元字符都有特定的含义。
示例:
var str = "Hello, World!";
var pattern = /o/g;
console.log(str.match(pattern)); // 输出["o", "o"]
console.log(str.replace(pattern, "a")); // 输出 "Hella, Warld!"
8. 严格模式
JavaScript中可以使用严格模式,在严格模式下,变量必须先声明再使用,函数必须有返回值,不能删除变量或函数,不能使用eval函数,等等。
示例:
"use strict";
x = 3.14; // 报错,因为x未声明
function test() {
"use strict";
return; // 报错,因为必须有返回值
}
9. 继承
JavaScript中的继承是通过原型链实现的,每个对象都有一个原型对象,对象可以访问原型对象的属性和方法。如果原型对象也有原型对象,那么就可以形成原型链,实现继承。
示例:
function Animal() {
this.name = "Animal";
}
Animal.prototype.say = function() {
console.log("I'm an animal.");
};
function Dog() {
this.name = "Dog";
}
Dog.prototype = new Animal();
var dog = new Dog();
dog.say(); // 输出"I'm an animal."
10. JSON
JavaScript中的JSON(JavaScript Object Notation)是一种轻量级的数据交换格式。可以使用JSON.stringify()函数将对象转换为JSON字符串,使用JSON.parse()函数将JSON字符串转换为对象。
示例:
var obj = {name: "Tom", age: 20};
var str = JSON.stringify(obj);
console.log(str); // 输出 '{"name":"Tom","age":20}'
var newObj = JSON.parse(str);
console.log(newObj); // 输出 {name: "Tom", age: 20}
以上是JavaScript中的10个怪癖和秘密分享,希望对你有所帮助。
本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:有关JavaScript的10个怪癖和秘密分享 - Python技术站