1、下面代码的输出是什么?
+true;
!"Lydia";
该题主要考察的是数据类型转换,加运算会将true转换为数字1,如果是false会转为数字0。第二行的字符串“Lydia”进行布尔值转换的时候,会转换为true,但是!号是取反的意思,所以最后第二行代码的结果为false。该地答案为:1和false。
2、下面代码会输出什么?
let a = 3;
let b = new Number(3);
console.log(a == b);
console.log(a === b);
该题考察的是隐式类型转换,首先我们要知道,宽松相等(==)在进行比较的时候,会发生隐式类型转换,而严格相等(===)是不会的。这道题中,a是数字类型(number),b是一个对象,因为是通过new Number这个构造函数构造出来的。所以当a和b进行宽松相等的比较时,b会被隐式强制类型转换为数字类型3,所以输出true。当a和b进行严格相等的比较时,a和b的值虽然都是3,但是它们的数据类型是不一样的,所以会返回false。本题答案为:true和false。
3、下面代码的输出是什么?
let greeting;
greetign = {}; // typo
console.log(greetign);
这题考察了对未声明的变量进行赋值会发生什么样的操作,其实一个变量如果未进行声明就开始赋值的话,是会在全局作用域中创建一个新的对象,该对象为全局对象window的一个属性,可以参考《你不知道的JavaScript -- 上卷第一章》,当执行freetign = {}的时候,js引擎会为变量greetign进行LHS查询,沿着作用域一直查找到作用域最顶端都找不到的话,那么就会在全局作用域中创建一个具有该名称的变量,然后将其返回给js引擎;这一过程前提是在非严格模式下“use strict”。下一步就是将一个空对象赋值给greetign,之后输出的肯定也是一个空对象:{}。
4、当我们这样做时会发生什么?
function bark() {
console.log("Woof!");
}
bark.animal = "dog";
在JavaScript中,除了基本数据类型:string、number、boolean、undefined、null、symbol,之外其它数据类型都可以称为对象,而对象就是可以拥有属性的。在这个例子当中,函数bark是一个对象,所以是可以为它添加一个属性animal的。所以该题的答案是一切正常(bark会成功地被新增一个属性animal)。
5、下面代码的输出是什么?
function Person(firstName, lastName) {
this.firstName = firstName;
this.lastName = lastName;
}
const member = new Person("Lydia", "Hallie");
Person.getFullName = () => this.firstName + this.lastName;
console.log(member.getFullName());
这题考察的偏作用域更多吧,首先声明了一个Person构造函数,里面定义了两个属性;然后创建了一个对象member,值是Person构造函数的实例;接着给Person构造函数定义一个方法getFullName()。最后输出member.getFullName(); 这里来分析一下,member这个对象是否拥有getFullName()方法,答案是否定的,因为getFullName不是在构造函数的原型上;如果需要访问到的话,可以这样写:
Person.prototype.getFullName = function() {
return this.firstName + this.lastName
};
所以最后输出的是:TypeError(该异常错误来源于:RHS查询时找到了一个变量,但是对这个变量进行不合理的操作,如:不存在的属性和方法)。
今天就分享到这里,后面继续!