20190625,下列代码输出内容是?
for (var i = 0; i < 3; i++) {
setTimeout(()=>console.log(i),1);
}
for (let i = 0; i < 3; i++) {
setTimeout(()=>console.log(i),1);
}
3,3,3
0,1,2
解析:由于JavaScript中的事件执行机制,setTimeout函数真正被执行时,循环已经走完。由于第一个循环中的变量i是使用var关键字声明的,因此该值是全局的。在循环期间,我们每次使用一元运算符++都会将i的值增加1。因此在第一个例子中,当调用setTimeout函数时,i已经被赋值为3。在第二个循环中,使用let关键字声明变量i,使用let和const关键字声明的变量是具有块作用域的(块是{}之间的任何东西)。在每次迭代期间,i将被创建为一个新值,并且每个值都会存在于循环内的块级作用域。
20190626,下列代码的结果是?
const shape = {
radius:10,
diameter(){
return this.radius * 2;
},
perimeter:()=> 2*Math.PI * this.radius
}
console.log(shape.diameter());
console.log(shape.perimeter());
20 NaN
解析:diameter是普通函数,perimeter是箭头函数。对于箭头函数,this关键字指向是它所在上下文(定义时的位置)的环境,与普通函数不同!这意味着当我们调用perimeter时,它不是指向shape对象,而是指其定义时的环境(window)。没有值radius属性,返回undefined
20190627,下列代码的结果是?
function Person(firstName,lastName) {
this.firstName = firstName;
this.lastName = lastName;
}
const lydia = new Person('Lydia','Hallie');
const sarah = Person('Sarah','Smith');
console.log(lydia);
console.log(sarah);
console.log(this.firstName);
console.log(this.lastName);
Person {firstName: "Lydia", lastName: "Hallie"}
undefined
Sarah
Smith
解析:对于sarah,我们没有使用new关键字。使用new时,它指的是我们创建的新空对象。但是,如果不添加new它指的是全局对象!我们指定了this.firstName等于'Sarah和this.lastName等于Smith。我们实际做的是定义global.firstName ='Sarah'和global.lastName ='Smith。sarah本身的返回值是undefined因此this.firstName和this.lastName分别是Sarah和Smith了
20190628,下列代码的结果是?
const obj = {1:"a",2:"b",3:"c"};
const set = new Set([1,2,3,4,5]);
console.log(obj.hasOwnProperty("1"));
console.log(obj.hasOwnProperty(1));
console.log(set.has("1"));
console.log(set.has(1));
true true false true
解析:所有对象键(不包括Symbols)都会被存储为字符串,即使你没有给定字符串类型的键。 这就是为什么obj.hasOwnProperty('1')也返回true。上面的说法不适用于Set。在Set中没有"1",set.has('1')返回false。它有数字类型1,set.has(1)返回true。