通往JavaScript高阶之路:10个必备问题(11-20)
2023-09-21 07:12:10
- 输出是什么?
var x = 10;
{
var x = 20;
console.log(x); // 20
}
console.log(x); // 20
解答: JavaScript中,变量的作用域是函数级,而不是块级。这意味着在函数内部声明的变量可以在函数外部访问。因此,在这个例子中,变量x在函数内部被重新声明为20,并且在函数外部仍然可以访问。
- 输出是什么?
function foo() {
let x = 10;
{
let x = 20;
console.log(x); // 20
}
console.log(x); // 10
}
foo();
解答: 与上一个例子不同,在这个例子中,变量x是在块级作用域内声明的。这意味着它只能在声明它的块内访问。因此,在这个例子中,变量x在函数内部的块内被重新声明为20,但在函数外部无法访问。
- 事件捕获的三个阶段是哪些?
解答: 事件捕获的三个阶段是:
- 捕获阶段:在这个阶段,事件从窗口对象开始,向下传递到目标元素。
- 目标阶段:在这个阶段,事件到达目标元素。
- 冒泡阶段:在这个阶段,事件从目标元素开始,向上传递到窗口对象。
- 所有的对象都有原型?
解答: 是的,所有的对象都有原型。对象的原型是另一个对象,它包含了该对象的所有属性和方法。如果对象中没有某个属性或方法,那么JavaScript就会在对象的原型中查找该属性或方法。
- 输出是什么?
function Person(name, age) {
this.name = name;
this.age = age;
}
Person.prototype.greet = function() {
console.log(`Hello, my name is ${this.name} and I am ${this.age} years old.`);
};
const person1 = new Person('John', 30);
person1.greet(); // Hello, my name is John and I am 30 years old.
解答: 在这个例子中,Person函数是一个构造函数,它用来创建Person对象。Person对象具有name和age属性,以及greet方法。当person1被实例化时,JavaScript会创建一个新的对象,并将Person.prototype作为这个新对象的原型。因此,person1对象可以访问Person.prototype中的所有属性和方法,包括greet方法。
- 输出是什么?
function Person(name, age) {
this.name = name;
this.age = age;
}
const person1 = new Person('John', 30);
const person2 = new Person('Jane', 25);
console.log(person1 == person2); // false
解答: 在这个例子中,person1和person2都是Person函数的实例。但是,它们是两个不同的对象,因此它们不相等。即使它们具有相同的名字和年龄,但它们仍然是两个不同的对象。
- 输出是什么?
function Person(name, age) {
this.name = name;
this.age = age;
}
const person1 = new Person('John', 30);
const person2 = person1;
console.log(person1 == person2); // true
解答: 在这个例子中,person1和person2指向同一个对象。因此,它们相等。
- 输出是什么?
function Person(name, age) {
this.name = name;
this.age = age;
}
const person1 = new Person('John', 30);
const person2 = Object.create(Person.prototype);
person2.name = 'Jane';
person2.age = 25;
console.log(person1 == person2); // false
解答: 在这个例子中,person1是Person函数的实例,而person2是使用Object.create()方法创建的对象。Object.create()方法创建一个新对象,并将给定的对象作为这个新对象的原型。因此,person2对象可以访问Person.prototype中的所有属性和方法,包括name和age属性。但是,person1和person2是两个不同的对象,因此它们不相等。
- 输出是什么?
function Person(name, age) {
this.name = name;
this.age = age;
}
const person1 = new Person('John', 30);
const person2 = JSON.parse(JSON.stringify(person1));
console.log(person1 == person2); // false
解答: 在这个例子中,person1是Person函数的实例,而person2是使用JSON.parse()和JSON.stringify()方法创建的对象。JSON.stringify()方法将对象转换为JSON字符串,而JSON.parse()方法将JSON字符串转换为对象。因此,person2对象具有与person1对象相同的数据,但它们是两个不同的对象,因此它们不相等。